Dialogbox umwandeln von domodal in non-modal



  • hi,
    ich habe eine Dialogbox nach Buch erstellt, nämlich so...

    instert Dialog
    new class
    new Member variable -> special
    neue header hinzugefügt.
    im Hauptprogramm rufe ich die neue Dialogbox mit special.Domodale auf.

    Das funkt 1a.

    zu meinem Problem, wenn ich einen Knopf in Special einpflanze,z.b. neuer Ordner erstellen. Dann wird das nicht ausgefügt, den selben knopf habe ich auch im Hauptfenster und der Funkt 🙂

    Nach langen googlen und lesen, habe ich herausgefunden, ich darf nicht domodale nehme sondern non Modale.

    Wie soll ich CreateDialog einsetzen und DestroyWindow statt EndDialog ersetzen.
    Ich steige einfach nicht dahinter.



  • systemlogs.DoModal() // habe ich rausgenommen.

    dafür habe ich

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

    genommen.

    wenn ich den Kram compiliere, dann gehe von meinem Hauptfenster das IDD_SYSTEM aufrufe per Buttion, das geht.
    Dann kommt der Moment, ich klicke auf den Knopf (Ornder löschen),
    er löscht den test ordner nicht heraus, den gleiche Knopf habe ich auch im Hauptfenster, der geht komischerweise.

    Bin für jeder Hilfe,anreize und link 1000 mal dankbar.



  • ich geh mal davon aus das du die routine für die nachrichtenbehandlung zwr in deinem hauptfenster aber nicht in systemlogs hast, doch dort kommt die nachricht des buttondrucks an. Also entweder du erstellst die selbe Routione aus dem hauptfenster noch mal, oder du leitest die nachricht an das hauptfenster weiter. aber wie gesagt ohne das projekt jetzt zu kennen is das nur eine vermutung.

    gruß



  • ok,ich verstehe,das Grundprojetkt sieht so aus....

    Ein Dialogfeld mit dem Namem special erstellt
    Eine class erstellt.
    Eine mit variable mit systemlogs erstellt

    Das Hauptfenster hat NUR ein Kopf...

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

    Bei Klick auf dem Kopf öffnet sich eine Dialogbox mit special, mit NUR einem Kopf (Killer), der so ausieht...

    RegDeleteKey(HKEY_CURRENT_USER,"test");
    

    Mehr Quelltext/variablen/Knöpfe gibt es nicht.

    @CTecS
    nachrichtenbehandlung gibt es seit VC2003 C++ nicht mehr und ich habe vc++ 2003 🙂
    Verstehe ich dich richtig....
    meine Dialogbox mit special, wartet so lange, bis ich auf den Kopf "OK" drücke für Beenden, die Dialogbox schliest sich, und der Befehl "KILLER" wird dann ausgefügt.
    Das ist einfach.Ich will aber dass der Kopfdruck (Killer)sofort ausgeführt wird.

    Wie meinst du das mit selber Rotine nochmal im Hauptfenster?

    PS:Mein Projekt hat Nur 2 Funktionsknöpfe,siehe oben.Bitte weiterhin um lösungen.



  • Mach Dich erst einmal hiermit vertraut: http://msdn.microsoft.com/en-us/library/xt2c310k.aspx Dann verstehst Du auch CTecS Antwort und solltest dann das Problem lösen können.



  • ok thx,
    @jencas
    ich glaube wir reden aneinandervorbei 🙂
    danke für den link,habs reingezugezogen.
    Es werden C++ Befehle erklärt alte neue usw.

    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 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.



  • 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)


Anmelden zum Antworten