Editfelder deaktivieren!



  • Hallo Profis,

    ich habe lauter Editfelder in meiner Anwendung. Ich will die
    aber nach einer bestimmten Abfrage deaktivieren oder aktivieren.
    Meine Frage ist, ob es eine Möglichkeit gibt, die ID's dieser Editfelder als Übergabeparameter einer Methode zu definieren. Wenn ja, was für einen
    Datentyp sind die ID's ?

    Gruss



  • Verwend mal die Suche 🙄

    CEdit::EnableWindow(true|false);
    ist was du suchst.

    Entweder membervariable erstellen, oder GetDlgItem verwenden. (evtl dann dort casten)

    Alternativ bietet CEdit auch noch SetReadOnly an, wobei dann nur der Hintergrund
    grau wird, und die Schrift schwarz bleibt...

    Devil



  • Das mache ich ja schon.

    if(g>2)
    	{
    		GetDlgItem(IDC_Y5_D)->EnableWindow(TRUE);
    		GetDlgItem(IDC_Y5_C)->EnableWindow(TRUE);
    		GetDlgItem(IDC_Y5_B)->EnableWindow(TRUE);
    		GetDlgItem(IDC_Y5_A)->EnableWindow(TRUE);	
    	}
    	else 
    	{	
    		GetDlgItem(IDC_Y5_D)->EnableWindow(FALSE);
    		GetDlgItem(IDC_Y5_C)->EnableWindow(FALSE);
    		GetDlgItem(IDC_Y5_B)->EnableWindow(FALSE);
    		GetDlgItem(IDC_Y5_A)->EnableWindow(FALSE);	
    	}
    

    Ich wollte nur wissen, um den Quellcon zu verbessern. Dieser Cod wiederholt
    sich in meiner Anwendung immer, nur die ID's (z.B IDC_Y5_D) ändern sich.
    Kann man eine Methode zum Deaktivieren anderer Editfelder schreiben, indem man als Übergaberparameter die ID's gibt?



  • Ja, kann man. Resourcen ID sind vom typ unsigned int (UINT).

    Devil



  • Wenn du das kürzen willst, dann schreib doch:

    GetDlgItem(IDC_Y5_D)->EnableWindow(g>2); 
            GetDlgItem(IDC_Y5_C)->EnableWindow(g>2); 
            GetDlgItem(IDC_Y5_B)->EnableWindow(g>2); 
            GetDlgItem(IDC_Y5_A)->EnableWindow(g>2);
    

    bzw, ich leg mir immer eine bool Variable an, dann muss ich die Bedingung nur an einer Stelle ändern. 🙂



  • Eine Kontrolle über GetDlgItem zu aktivieren/deaktivieren ist zwar sauberer, aber im Hintergrund wird dann immer ein temporäres CWnd-Objekt angelegt. Außerdem muss man noch den Returnwert von GetDlgItem überprüfen, weil der kann ja auch NULL sein, falls nämlich eine Kontrolle mit der ID gar nicht da ist.

    Also so:

    CWnd *myctl = GetDlgItem(IDC_Y5_D);
    if (myctl != NULL)
        myctl->EnableWindow(g > 2);
    

    Weil das ein wenig umständlich ist, wenn viele Kontrollen bearbeitet werden, habe ich mir eine einfache Funktion geschrieben, die sich den Umweg über die MFC spart:

    void EnableDlgItem(CWnd *dlg, int id, BOOL bEnable)
    {
        HWND hWnd = ::GetDlgItem(dlg->GetSafeHwnd(), id);
    
        if (hWnd != NULL)
            ::EnableWindow(hWnd, bEnable);
    }
    

    Damit sehen die Aufrufe dann so aus:

    EnableDlgItem(this, IDC_Y5_A, g > 2); 
    EnableDlgItem(this, IDC_Y5_B, g > 2);
    

    Die Funktion kann natürlich auch Memberfunktion des Dialoges sein, dann spart man sich auch noch den Parameter dlg. Wichtig sind dann aber auf jeden Fall die :: vor GetDlgItem und EnableWindow, damit sichergestellt ist, dass die API-Funktionen und nicht die Memberfunktionen gemeint sind.



  • @uwe

    den this Zeiger kannste auch sparen, weil du kommst ja mit GetParent() zum Dialog.



  • Hallo fffffff (heißt du wirklich so?)

    So wie EnableDlgItem geschrieben ist, ist es kein Memberfunktion von einem Dialog. Der Zeiger auf den Dialog muss also übergeben werden. Auf diese Weise kann die Funktion auch für andere Dialoge verwendet werden.

    Und, ja - da hast du recht, wenn EnableDlgItem Member des Dialoges ist, kann man den this-Zeiger weglassen (habe ich aber auch im letzten Absatz geschrieben). Aber dann nutzt mir GetParent nichts, weil ich ja schon im Dialog bin:

    void CMyDlg::EnableDlgItem(int id, BOOL bEnable)
    {
        HWND hWnd = ::GetDlgItem(GetSafeHwnd(), id);
    
        if (hWnd != NULL)
            ::EnableWindow(hWnd, bEnable);
    }
    ...
        EnableDlgItem(IDC_Y5_A, g > 2); 
        EnableDlgItem(IDC_Y5_B, g > 2);
    

    Am praktischsten ist es natürlich einen Basisdialog zu definieren, von dem alle Dialoge einer Applikation abgeleitet werden. Das lohnt sich schon bei kleinen Projekten, weil ja beispielsweise EnableDlgItem sehr häufig benötigt wird.



  • Brauchst ja nur eine Klasse erstellen die von CDialog erbt. Stat CDialog für deine Dialog nimmst du dann eben deine neue Klasse.


Anmelden zum Antworten