Dialogbox umwandeln von domodal in non-modal



  • tomycat2009 schrieb:

    Ich rede von dem Assist von VC++6 mit "nachrichtenbehandlung", das ist ein Feld mit dem man z.b. Knöpfe und Funktion verbinden kann, und genau das habe ich per Hand geschirben,siehe oben.

    das gleiche geht auch unter den folgeversion von VC++ nur das es ebend die sen Assistenten so in der Form nicht mehr gibt, aber das geht genau so über das popup-menü des Ausgewählten elementes im Dialogeditor und "Add Event" (in der englichen Version.

    tomycat2009 schrieb:

    Das Problem ist,wenn ich das Dialogfeld öffne, läuft das mein Programm nicht weiter und sammel Informationen,er wenn das Dialogfenster geschlossen wird, dann läuft es weiter und die Befehle werden ausgeführt.

    Aus deinem Satz werd ich echt net schlau, ich verstehs net. Vielleicht hat dein nonmodal dialog nur den falschen style, oder hast du was drin das auf was wartet, aber wissen kannst das nur du, oder versuch das mal besser zu umschreiben



  • tomycat2009 schrieb:

    ich glaube wir reden aneinandervorbei 🙂

    Was allerdings eher an der Art Deiner Beschreibung des Sachverhaltes liegt, wie auch andere Beiträge hier zeigen.
    Schreib doch einfach mal, was genau Du haben willst, dann wird sich sicher der eine oder andere Tipp einfinden.



  • CTecS schrieb:

    tomycat2009 schrieb:

    Das Problem ist,wenn ich das Dialogfeld öffne, läuft das mein Programm nicht weiter und sammel Informationen,er wenn das Dialogfenster geschlossen wird, dann läuft es weiter und die Befehle werden ausgeführt.

    Aus deinem Satz werd ich echt net schlau, ich verstehs net. Vielleicht hat dein nonmodal dialog nur den falschen style, oder hast du was drin das auf was wartet, aber wissen kannst das nur du, oder versuch das mal besser zu umschreiben

    ok,
    in meinem Hauptfenster habe,bzw hinter meine Knopf ist...

    if(systemlogs.DoModal() == IDOK);
    {}
    

    Dann wird meine Dialogbox aufgerufen und mein Programm wird gestoppt, bis ich auf meiner Dialogbox OK drücke.Dann wird die Dialogbox geschlossen und mein Programm rennt weiter.



  • Ja und das is doch das normale verhalten von DoModal() wo is dein Problem ich versteh es nicht. Oder anders gefragt warum hast du dann hier mit create gearbeitet wenn du jetzt eh wieder bei DoModal() bist. Was willst du nun?



  • Die Sache mit DoModal habe ich nur gesagt, dass du verstehst, was ich meine 🙂
    Ich habe suche seit 3 Tage ein Beispiel mit Create in verbindung mit einer Dialogfeld.

    Dazukommen 2 dicke VC++ Büche. 😡 😡

    Wie setze ich create() ein?

    z.b.
    systemlogs.Create(IDD_SYSTEM); //IDD_SYSTEM ist mein Dialogfeld
    systemlogs.ShowWindow(SW_SHOW);

    sobald ich herum klicke strützt emin Programm ab. 😡

    Wie Wie Wie 😞 😞



  • versteh das net wirklich, da es in der MSDN beschrieben is wie das geht.

    http://msdn.microsoft.com/en-us/library/yhth57kd(VS.80).aspx

    und du erfreulicher weise immer nur sagst das es net geht und der abstürzt aber warum und wo und wie und wo hast du die klasse von systemlogs erzeugt? also wenn du net mehr infos uns gibst wird das echt keiner rausfinden. des weiteren kannste ja mal den auszug reinstellen wo der abstürzt, der debuger zeigt dir das ja an.



  • ok,ich war auf der Msn Seite 🙂

    das exsample umgebau zu meinem Projekt...

    Csystemanzeige* pDialog; //Csystemanzeige ist meine Klasse was ich erstellt haeb
    
    //void CMyWnd::OnSomeAction()
    //{
       //pDialog initialized to NULL in the constructor of CMyWnd class
       pDialog = new Csystemanzeige(); //Csystemanzeige  ist meiner erstellt Klasse.
       //Check if new succeeded and we got a valid pointer to a dialog object
       if(pDialog != NULL)
       {
          BOOL ret = pDialog->Create(IDD_SYSTEM,this); //IDD_SYSTEM ist mein Dialogfenster
          if(!ret)   //Create failed.
             AfxMessageBox("Error creating Dialog");
          pDialog->ShowWindow(SW_SHOW);
       }
       else
          AfxMessageBox("Error Creating Dialog Object");
    //}
    

    dieser Code ist jetzt hinter meinem Buttion im Hauptfenster.
    So funkt der Code und meine Dialogbox wird geöffnet und wenn ich auf meinen Kopf drücke, passiert nichts im regedit 😞 😞
    Ich bin kein Cpp Profi, ich gebe mein Bestes und wenn ich garnicht weiter komme nehme ich das Board, sorry wenn ich immer frage 😉



  • gibt es auch in deiner Csystemanzeige klasse einen handler der ausgelösst wird? Ansonnsten wirste da ewig warten können.

    BEGIN_MESSAGE_MAP(Csystemanzeige, CDialog)
            ...
    	ON_BN_CLICKED(IDC_DeinesButton, &Csystemanzeige::OnBnClickedButton1)
    	...
    END_MESSAGE_MAP()
    
    void Csystemanzeige::OnBnClickedButton1()
    {
        if(RegDeleteKey(HKEY_CURRENT_USER,"test") == ERROR_SUCCESS)
            ::AfxMessageBox(_T("Schlüssel in der Registry gelöscht");
    }
    

    Das mal als Beispiel, und wie gesagt das kannste alles in der IDE machen und mußte net per hand schreiben (siehe mal früheren post von mir)

    Mal sehen ob dir das nützt



  • thx all
    thx extrem ---------------------------------------> CTecS

    nochmal, herumgepfuscht in meinem Projekt, irgendwie liefs nicht mehr.
    Neues Projekt erstellt, neue Knöpfe,neuer Dialog, neue Klasse.
    Das Ergebnis 🙂 🙂 🙂 🙂 🙂 Dialogfeld macht alles 🙂 🙂 🙂 🙂 🙂



  • ...letzte Frage zu dem Beitrag.

    ich habe in meiner Dialogbox ein Edit Control, mit der variable m_runter.
    An welcher Stelle eignet sich es gut, den Befehl zu setzen...

    m_runter = "0";
    UpdateData(FALSE);
    


  • Wenn es um die Initialisierung von m_runter beim Öffnen des Dialoges geht, dann in OnInitDialog()



  • thx,
    aller letzte Frage...
    im Hauptfester habe ich ein CEDITone mit einer variable m_text.

    Einer meiner knöpfe führt folgendes aus...

    m_text = "test";
    	UpdateData(FALSE);
    

    ... das geht wunderbar. 🙂

    Den gleiche Code setzte ich auf meine Dialogbox, die ich mit create aufrufe.Beim Compilieren...

    error C2065: 'm_text' : undeclared identifier
    

    Wie bekomme ich es fertig, dass ich eine Nachtricht ins CEDITone schreiben kann?



  • kann auch nicht funktionieren da m_text ein member deines Hauptdialoges is, und du aber in der klasse des childdialoges bist, also kennt der das da gar net. organisier die einen zugriff auf dein hauptfenster, gibts massen möglichkeiten, kannst ja mal googln



  • thx,
    hhmmmm, das ist mir schon klar, aber ich habe überhaupt keinen schimmer, wie das funken soll.

    Meine Idee.
    Im Dialogfeld greife ich auf classe zu, die sich im Hauptfenster befindet, und diese Klasse spuckt was in CEDIT

    Könntest du mir sagen,nachwas ich goole soll. 😃 (kein Witz)



  • Da wie ich gesehen habe du den this als parent im Create mit angegeben hast, brauchst du eingentlich nur noch die headerdatei deines hauptdialoges im cpp deiner childklasse einzufügen und kannst dann mit GetParent() zugreifen.

    #include "deineHauptklasse.h"
    
    static_cast<CDeineHauptklasse>(GetParent())->m_text = "dein Text";
    

    So sollte der ganze spass gehen denke ich mal, hab das jetzt so mal ausn kopf hingekritzelt.

    Aber wie gesagt du kannst dem dialog auch einen zeiger mitgeben und über diesen zu greifen.



  • ok,thx
    ist ganz oben in im Dialogfeld

    #include "GamexDlg.h" 
    #include "Gamex.h"
    

    in meinem Knopf....

    static_cast<CGamexDlg>(GetParent())->m_text = "dein Text";
    

    sowie...

    static_cast<CGamex>(GetParent())->m_text = "dein Text";
    

    geht nicht 😞

    Mein Compiler...
    [code]
    error C2061: syntax error : identifier 'CGamex'
    [cpp]

    1.Warum habe ich einmal eine Klasse mit Dlg und einmal nicht?
    2.wieso error?



  • zu 1.
    weil GamexDlg.h deine Dialog-Klasse is und Gamex.h deine Application-Klasse is, als von der App aus wird die gialog-klasse instanziert und dein Programm wird ind der appp mit initInstance gestartet

    zu 2.
    mal wieder geraten, heist deine App auch CGamex und besitzt die wirklich die membervariable m_text?



  • ok,nochmal geschaut.
    unter classview habe ich...
    GamexDlg
    GamexApp

    und der CString ist m_text,und ist im Hauptfenster.



  • also in der klasse CGamexDlg da muß das natürlich nach hinten los gehen wenn du

    static_cast<CGamex>(GetParent())->m_text = "dein Text";
    

    schreibst. Oder anders gesagt wenn dein bekannter im haus nr 15 wohnt kannste net im haus nr 17 klingeln und dich wundern das de den net fondest 😮

    also sollte doch jetzt alle fragen geklärt sein oder?



  • @tomycat2009: Wenn du so viele Schreibfehler beim coden wie bei deinen posts machst - dann wundert mich gar nix... :p


Anmelden zum Antworten