Modales und modusloses Dialogfeld



  • Einen schönen Tag Zusammen,

    ich habe eine Frage: Ich möchte aus einem modalen Dialog heraus durch Druck auf einen CommandButton einen nicht modalen (moduslosen) Dialog aufrufen.
    Meine erste Frage ist: Geht das aus der modalen Dialogfunktion heraus und wenn ja, wie? Ein bisschen Code wäre schön. Danke schon mal für die Antworten.

    Gruß

    Oliver



  • Solang dein modaler Dialog halt offen ist, wirst du wohl nicht an den anderen Dialog herankommen (da der modale Dialog deine Anwendung ja blokiert)!
    So würde ich zumindestens vermuten 🙄

    Was genau ist dein Problem?



  • @Flenders,

    ja sicher, aber ich will ja meinen moduslosen Dialog aus dem modalen Dialog heraus aufrufen, sprich die Dialogfunktion des modalen Dialoges ruft einen moduslosen Dialog auf. Ich wüßte daher gerne, ob und wie das geht ???

    Gruß

    Oliver



  • Wo ist da jetzt genau dein Problem? Ist doch nichts schwieriges dran? 😕



  • Schön, wenns also nicht schwierig ist, dann zeig doch bitte einfach mal wie es geht. Das Problem ist beispielsweise schon die Übergabe der Parameter. Ich befinde mich ja in der Dialogprozedur des modalen Dialoges. Wie muss ich denn jetzt den moduslosen Dialog, den ich als zuvor als Resource erstellt habe aufrufen?

    Hier die Fehlermeldung:

    zuordnung.c
    d:\sourcen\konto\zuordnung.c(133) : warning C4133: 'function' : Inkompatible Typen - von 'struct HWND__ *' zu 'struct HINSTANCE__ *'
    d:\sourcen\konto\zuordnung.c(133) : error C2065: 'hWnd' : nichtdeklarierter Bezeichner
    d:\sourcen\konto\zuordnung.c(133) : warning C4047: 'function' : Anzahl der Dereferenzierungen bei 'struct HWND__ *' und 'int ' unterschiedlich
    d:\sourcen\konto\zuordnung.c(133) : warning C4024: 'CreateDialogParamA' : Unterschiedliche Typen fuer formalen und uebergebenen Parameter 3
    d:\sourcen\konto\zuordnung.c(162) : fatal error C1004: Unerwartetes Dateiende gefunden
    Generieren von Code...
    Fehler beim Ausführen von cl.exe.
    Also hier mal der Quellcode: ( siehe Ausrufezeichen !!!!)

    // 3. Zuordnung Kontosatz zu Konto
    BOOL CALLBACK DlgProc4 (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        // Lokale Variablen deklarieren
        static  int     count = 0;
        static  int     i  = 1;
        int             st = 0;
        char            InsertString[1000];
        static  char    buffer[BUFFERGROESSE];
        struct zuordnungdaten zuordnung;
        char            zeichenkette[200];
        char            nummer[20];
        HWND            hWndDlg = 0;
    
        // Globaler Fehlercode/Returncode
        int retcode   = 0;
        int retcodeDB = 0;
        int nindex    = 0;
        switch(message)
        {
            case WM_INITDIALOG:
                retcodeDB = connectDB();
                count = FillArray(hDlg);
    
                // Füllen der KontoNummern und Kontonamen in Combobox
                for (i = 1; i <= count; i++)
                {
                    strcpy((char *) zeichenkette,(const char *) tabelle[i].kontoklasse);
                    strcat((char *) zeichenkette,(const char *) tabelle[i].kontogruppe);
                    strcat((char *) zeichenkette,(const char *) tabelle[i].kontonummer);
                    strcat((char *) zeichenkette,(const char *) " ");
                    strcat((char *) zeichenkette,(const char *) tabelle[i].kontoname);
    
                return TRUE;
            case WM_COMMAND:
                {                               
                    switch (LOWORD(wParam)) // OK / Abbrechen
                    {
    
                        case IDC_BUTTON1:
                        {
                            GetDlgItemText(hDlg,IDC_EDIT1,buffer,100);
                            strcpy((char *) zuordnung.schluesseltext, (const char *) buffer);
                            GetDlgItemText(hDlg,IDC_COMBO1,buffer,100);
                            strcpy((char *) zuordnung.kontonr, (const char *) buffer);
                            GetDlgItemText(hDlg,IDC_COMBO2,buffer,100);
                            strcpy((char *) zuordnung.prioritaet, (const char *) buffer);
                        }
                        case IDC_BUTTON7: // Loeschen
                        {
                            GetDlgItemText(hDlg,IDC_EDIT1,buffer,100);
                            strcpy((char *) zuordnung.schluesseltext, (const char *) buffer);
                            GetDlgItemText(hDlg,IDC_COMBO1,buffer,100);
                            strcpy((char *) zuordnung.kontonr, (const char *) buffer);
                            GetDlgItemText(hDlg,IDC_COMBO2,buffer,100);
                            strcpy((char *) zuordnung.prioritaet, (const char *) buffer);
    
                            // Sicherheitsabfrage : Wirklich löschen?
                            if ( retcode = MessageBox(hDlg,"Soll diese Zuordnung wirklich gelöscht werden?","Sicherheitsabfrage",MB_OKCANCEL) == IDOK)
                            // Schlüsseldaten vorhanden => Löschen
                            {
                                // Handle anfordern
                                retcodeDB = alloc_handleDB();
    
                                // Jetzt kann man dieses Handle nutzen für den Direktzugriff
                                count = sprintf((char *) InsertString,(const char *) "DELETE FROM kontoverteilung where(schluesseltext='%s' and kontonr='%s' and prioritaet = '%s')",zuordnung.schluesseltext,zuordnung.kontonr,zuordnung.prioritaet);
                                retcodeDB = exec_directDB((char *) InsertString);
                                if (retcodeDB != 0)
                                    MessageBox(hDlg,"Löschen nicht OK", "Datenbankzugriff",MB_OK);
    
                                // Handle lösen
                                retcodeDB = free_handleDB();
                            return 0;
                        }
                        case IDC_BUTTON8: // Aendern
                        {
                            GetDlgItemText(hDlg,IDC_EDIT1,buffer,100);
                            strcpy((char *) zuordnung.schluesseltext, (const char *) buffer);
                            GetDlgItemText(hDlg,IDC_COMBO1,buffer,100);
                            strcpy((char *) zuordnung.kontonr, (const char *) buffer);
                            GetDlgItemText(hDlg,IDC_COMBO2,buffer,100);
                            strcpy((char *) zuordnung.prioritaet, (const char *) buffer);
    
                            // Handle anfordern
                            retcodeDB = alloc_handleDB();
    
                            // Jetzt kann man dieses Handle nutzen für den Direktzugriff
                            count = sprintf((char *) InsertString,(const char *) "UPDATE kontoverteilung set schluesseltext='%s', kontonr = '%s', prioritaet = '%s')",zuordnung.schluesseltext,zuordnung.kontonr,zuordnung.prioritaet);
                            retcodeDB = exec_directDB((char *) InsertString);
                            if (retcodeDB != 0)
                                MessageBox(hDlg,"Ändern nicht OK", "Datenbankzugriff",MB_OK);
    
                            // Handle lösen
                            retcodeDB = free_handleDB();
                            return 0;
                        }
    /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */                    
    case IDC_BUTTON9: // Anzeigen
    /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */                    {
    
                            hWndDlg = CreateDialog(hDlg, MAKEINTRESOURCE(IDD_DIALOG5), hDlg, (DLGPROC) DlgProc5);
                            ShowWindow(hWndDlg, SW_SHOW);
    
                            return 0;
                        }
                        case IDOK:
                        {
                            retcodeDB = disconnectDB();
                            if(retcodeDB != 0)
                                MessageBox(hDlg, "Schließen der Datenbank hat nicht geklappt!", "Datenbankzugriff", 0);
    
                            EndDialog(hDlg,0);    
                            return TRUE;
                        }
                        // Cancel
                        case IDCANCEL:
                        {
                            retcode = free_handleDB();
                            retcodeDB = disconnectDB();
                            if(retcodeDB != 0)
                                MessageBox(hDlg, "Schließen der Datenbank hat nicht geklappt!", "Datenbankzugriff", 0);
                            EndDialog(hDlg,0);
                            return TRUE;
                        }
                    } // Switch LOWORD
                } // Switch Message 
        }
        return FALSE; 
    }
    


  • Speicher doch das Handle des nicht-modalen Fensters doch in einer globalen Variable und dann machst du einfach mit dem Handle was du willst.



  • Der Aufruf von CreateDialog() KANN so garnicht funktionieren! Schau dir mal den ersten Parameter näher an. Und den ersten, den du von der WinMain mitgegeben bekommst.


Anmelden zum Antworten