einfache Ampel zeichnen...



  • @phlox81
    Bin heute mal dazu gekommen deine Änderungsvorschläge zu implementieren.

    anmeldungDlg dialog(NULL);// für nen simplen anmeldedialog brauchst du kein new.
    SetTopWindow(dialog);
    if(dialog->ShowModal()== wxID_OK)
    

    Diese Anmerkung versteh ich aber überhaupt nicht... Ich habe doch eine Klasse anmeldungDlg erstellt und um diese zu nutzen muss ich doch wohl ein Objekt erzeugen und das passiert doch mittels "new"!? oder etwa nicht.
    Ohne "new" ist´s eine statische erzeugung, nur weiß ich gerade nicht mehr wirklich den Unterschied.
    Wenn ich es nicht per new mache bekomm ich folgende Fehlermeldung:

    C:\Dev-Cpp\auslastung\AuslastungApp.cpp In member function virtual bool AuslastungFrmApp::OnInit()': 36 C:\\Dev-Cpp\\auslastung\\AuslastungApp.cpp no matching function for call toAuslastungFrmApp::SetTopWindow(anmeldungDlg&)'
    note C:\Dev-Cpp\include\wx\app.h:444 candidates are: void wxAppBase::SetTopWindow(wxWindow*)
    37 C:\Dev-Cpp\auslastung\AuslastungApp.cpp base operand of ->' has non-pointer typeanmeldungDlg'
    C:\Dev-Cpp\auslastung\Makefile.win [Build Error] [AuslastungApp.obj] Error 1

    Wenn ich (36) SetTopWindow weg lasse und (37) in dialog.showModal() umändere, frisst er auch dein Code.
    Mit "new" wird alles so Fehlerfrei kompilliert.
    Ich habe jetzt ohne "new", mit den zwei änderungen implentiert.

    Nur funktionieren tut es nicht wirklich.
    Soweit ich gelesen habe soll das hier,

    if(dialog->ShowModal()== wxID_OK)
    

    nach click auf den Ok button im Dialog true zurück geben.
    nach click auf Ok passiert aber garnichts...(meine eigene WxButton_OKClick Methode habe ich auskommentiert)
    Woher weiß das Programm den welches der OK Button ist, hab ja auch noch einen Abbrechen!?
    muss ich da irgendwie noch hiermit arbeiten:

    // Mit Connect wird der Button-Click-Event mit der Methode OnInsertText verbunden, mit button als Event Sender.
    Connect(button->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,wxCommandEventHandler(MyFrame::OnInsertText));
    

    Wieder mal viele Probleme und Fragen...

    Gruß
    Fabian


  • Mod

    fub0815 schrieb:

    @phlox81
    Bin heute mal dazu gekommen deine Änderungsvorschläge zu implementieren.

    anmeldungDlg dialog(NULL);// für nen simplen anmeldedialog brauchst du kein new.
    SetTopWindow(dialog);
    if(dialog->ShowModal()== wxID_OK)
    

    Diese Anmerkung versteh ich aber überhaupt nicht... Ich habe doch eine Klasse anmeldungDlg erstellt und um diese zu nutzen muss ich doch wohl ein Objekt erzeugen und das passiert doch mittels "new"!? oder etwa nicht.
    Ohne "new" ist´s eine statische erzeugung, nur weiß ich gerade nicht mehr wirklich den Unterschied.
    Wenn ich es nicht per new mache bekomm ich folgende Fehlermeldung:

    C:\Dev-Cpp\auslastung\AuslastungApp.cpp In member function virtual bool AuslastungFrmApp::OnInit()': 36 C:\\Dev-Cpp\\auslastung\\AuslastungApp.cpp no matching function for call toAuslastungFrmApp::SetTopWindow(anmeldungDlg&)'
    note C:\Dev-Cpp\include\wx\app.h:444 candidates are: void wxAppBase::SetTopWindow(wxWindow*)
    37 C:\Dev-Cpp\auslastung\AuslastungApp.cpp base operand of ->' has non-pointer typeanmeldungDlg'
    C:\Dev-Cpp\auslastung\Makefile.win [Build Error] [AuslastungApp.obj] Error 1

    Wenn ich (36) SetTopWindow weg lasse und (37) in dialog.showModal() umändere, frisst er auch dein Code.
    Mit "new" wird alles so Fehlerfrei kompilliert.
    Ich habe jetzt ohne "new", mit den zwei änderungen implentiert.

    Gut, für jemanden der aus Java kommt, ist es sicher ungewöhnlich ein objekt ohne new anzulegen.
    Aber in C++ geht das, dieses Objekt ist dann wohl lokal, und wird beim verlassen der Funktion/des Blocks automatisch zerstört.
    Der Fehler mit SetTopWindow ist auch einfach zu erklären:
    Die Methode verlangt einen Pointer, wenn du ein objekt lokal anlegst, also ohne new, musst du
    einfach seine Adresse übergeben: SetTopWindow(&dialog)

    Bei new gilt jedoch, das für jedes new man auch ein delete braucht.
    In C++ gibt es keinen Garbagecollector.

    fub0815 schrieb:

    Nur funktionieren tut es nicht wirklich.
    Soweit ich gelesen habe soll das hier,

    if(dialog->ShowModal()== wxID_OK)
    

    nach click auf den Ok button im Dialog true zurück geben.
    nach click auf Ok passiert aber garnichts...(meine eigene WxButton_OKClick Methode habe ich auskommentiert)
    Woher weiß das Programm den welches der OK Button ist, hab ja auch noch einen Abbrechen!?
    muss ich da irgendwie noch hiermit arbeiten:

    // Mit Connect wird der Button-Click-Event mit der Methode OnInsertText verbunden, mit button als Event Sender.
    Connect(button->GetId(),wxEVT_COMMAND_BUTTON_CLICKED,wxCommandEventHandler(MyFrame::OnInsertText));
    

    Wieder mal viele Probleme und Fragen...

    Gruß
    Fabian

    Hatte nie behauptet das es auch funktionieren wird :p
    Ich arbeite nicht so häufig mit nicht Standard Dialogen in wx, von daher vergaß ich natürlich den wichtigen Teil 😉
    Also, du musst in deinem OnOk Handler noch dem Dialog sagen, das er jetzt Ok machen soll.
    Das geht mit EndModal(wxID_OK): http://wxwidgets.org/manuals/2.6.3/wx_wxdialog.html#wxdialogendmodal
    Für Cancel das gleiche.

    Es gibt auch noch die Möglichkeit, anstatt selber Buttons für dies anzulegen, dies von wxDialog machen zu lassen,
    wxDialog hat für solche Aufgaben einen eigenen Sizer:
    http://wxwidgets.org/manuals/2.6.3/wx_wxstddialogbuttonsizer.html#wxstddialogbuttonsizer
    welchen man mit einem aufruf von CreateDialogButtonSizer erzeugen kann:
    http://wxwidgets.org/manuals/2.6.3/wx_wxdialog.html#wxdialogcreatestddialogbuttonsizer

    phlox


Anmelden zum Antworten