Problem mit Progressbar und SetPos()



  • Hallo
    ich habe in meinem Programm einen Dialog mit einer Progressbar erstellt, die mir den aktuellen Fortschritt meiner Kommunikation anzeigen soll.

    Ich erstelle den Dialog in der Applikationsklasse.

    CProgressBar* MyProgressBar;
    /* used to create the progressbar non-modal dialog */
    void CSipromTApp::CreateProgressDlg(CString szText)
    {
    	MyProgressBar = CProgressBar::Instance(NULL);
    	MyProgressBar->InitialDialog(szText);
    	MyProgressBar->UpdateData(FALSE);
    }
    

    Nun rufe ich diese Methode in der Kommunikationsklasse auf um den Dialog zu erstellen.

    /* load data from device to PC */
    void CTH100Com::Download()
    {
    CProgressBar MyProgressBar;
    MyProgressBar.CreateProgressDlg("Laden");
    MyProgressBar.ProgressControl();
    

    Erstellen des Dailogs funktioniert noch.
    Wenn ich nun aber die Position der ProgressBar setzen will kriege ich ein ASSERT da mein Object m_pProgressCtrl kein handle besitzt.

    void CProgressBar::ProgressControl(Int8_t nProgressCounter)
    {	
    	nProgressBarPos = nProgressBarPos + nProgressCounter;
    	m_pProgressCtrl->SetPos(nProgressBarPos);
    	if(nProgressBarPos==20)
    	{
    		nProgressBarPos = 0;
    		Done();
    	}
    }
    

    Weiß jemand was ich falsch mache?


  • Mod

    Hast Du denn irgendwie m_pProgressCtrl initialisiert?

    Warum weist Du nicht in dem Dialog dem Progress Control eine Variable zu. Das geht über den Classwizard oder den Eigenschaftsdialog.

    Ohne das der Zeiger initialisiert wird oder auf einen Wert gesetzt wird, geht das nicht.



  • Wenn ich ProgressControl() aus meiner Applikationsklasse aurufe funktioniert es!
    m_pProgressCtrl hab ich in der Headerdatei definiert.

    private:
    	CProgressCtrl* m_pProgressCtrl;
    

    und im Konstruktor erzeuge ich es mit new.

    Wie kann ich einen Zeiger initialisieren nach dem ich ihn definiert habe?


  • Mod

    Aber das mit new erzeugte Objekt ist doch als Fenster nicht angelegt. Da wurde ja noch ein Create fehlen...

    Warum platzierst Dunicht einfach ein Progress Ctrl im Dialog und weißt eine Variable zu?



  • Ich habs so gemacht

    DLG.h:
    
    CProgressCtrl m_progress;
    int m_iStep;
    
    OnInit()
        //Setup progressbar
        m_progress.SetBkColor(RGB(255, 255, 255));
        m_progress.SetRange(0, 100);
        m_progress.SetStep(100);
    
    FunctionIrgendwas()
    
    m_progress.SetPos(m_iStep);
    

    Und dass geht problemlos. Läuft allerdings inem Timer


  • Mod

    @uruk-h4j: Auch hier fehlt der Create, oder der Subclass auf das bestehende Control. Dieses Beispiel hilft also nicht unbedingt...



  • Martin Richter schrieb:

    Warum platzierst Dunicht einfach ein Progress Ctrl im Dialog und weißt eine Variable zu?

    Das hab ich gemacht, habs auch schonmal ohne new probiert, also ohne pointer und das funktioniert auch nicht.
    Wenn ich allerdings von meiner Applikationsklasse die Funktion aufrufe, funktioniert es.


  • Mod

    Dann weise doch endlich eine Variable über den Classwizard für diesen Progress Bar zu. Oder über den Eigenschafts-Dialog in VC2005. Ich weiß immer noch nicht was Du verwendest.

    Deine Variable hängt einacg im luftleeren Raum!
    Ohne dass Du ein Fenster erzeugst oder ein bestehendes Fenster subclassed geht es nicht.

    Bitte mach Dich doch wenigstens etwas mit den Grundfunktionen der MFC vertraut.
    Ein new von einem Objekt erzeugt noch kein Fenster!



  • Hab mein Problem jetzt gelöst. Ich habe den Dialog in der Applikationsklasse erzeugt und mir ein Objekt MyProgressBar erstellt.
    Nun habe ich nachdem der Dialog erstellt wurde, aus einer anderen Klasse auf eine Methode aus der Klasse MyProgressBar zugegriffen indem ich ein weiteres MyProgressBar-Objekt erzeugt habe -> kein Handle auf das Fenster.
    Nun habe ich ein einziges ProgressBar objekt als extern definiert, und es funktioniert.


  • Mod

    Ich verstehe es nicht... aber ich muss es wahrscheinlich auch nicht verstehen... 🕶


Anmelden zum Antworten