Button aktiv/inaktiv machen



  • Hallo,

    ich habe eine SDI-Anwendung in der ich Buttons in dem SDI-Fenster selber habe und die gleichen Buttons nochmal oben in der Menüleiste. Da es eine Datenbankanwendung ist sollen diese Buttons erst aktiv werden, wenn man mit der Datenbank verbunden ist. Anonsten kommt immer ein Laufzeitfehler.

    Die Buttons in der Menüleiste kann man ja von anfang an inaktiv schalten aber wie dann später aktiv? Hab bisher nur den Befehl EnableWindow(FALSE/TRUE) gefunden. Weiß jetz aber nicht richtig wo ich den Befehl genau hinpacken muss.
    Kennt sich da jemand aus?
    Danke
    Gruß gabele



  • Ich kenne mich mit Menüs nicht so aus, aber es ist normalerweise immer so, dass du einfach die Methode EnableWindow des Controls aufrufst, das du disablen willst. Bei einer Control-Variable m_MyControl.EnableWindow(FALSE), ansonsten über GetDlgItem.



  • EnableWindow() ist hierfür der richtige Befehl. Wenn du es auf TRUE setzt, dann wird das Fenster aktiv, bei FALSE inaktiv.
    Controls werden in OnInitialUpdate() initialisiert. Sobald die Verbindung zur Datenbank steht, kannst du ja den Button enablen.



  • Vielen Dank euch zwei.
    Hat jetzt wunderbar funktioniert mit den Buttons die sich im SDI-Fenster befinden.
    Allerdings weiß ich jetzt noch nicht wie ich die Button im Menu oben (IDR_MAINFRAME) zunächst deaktivier und später wieder aktivier. Eigentlich kann man das ja im Ressourceneditor machen. Dort werden sie dann auch grau, aber sobald ich das Programm starte sind sie wieder aktiv. Irgendwie komisch.
    Hat jemand ne Idee oder Lösung.

    Gruß Gabele



  • Stichwort: EnableMenuItem



  • Ah ok danke, aber ich check noch nicht wirklich wo ich das jetzt reinpacken muss. Hab schon in der MSDN geschaut. Komme aber nicht wirklich weiter.
    Muss ich es irgendwo in der Mainfraim.cpp einbinden?

    Gruß Gabele





  • Hmm, ich komm irgendwie doch nicht weiter.
    Ich kann die Button jetzt zwar aktivieren wenn ich sie vorher deaktiviert habe. Allerdings mache ich das in der ManiFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    dort habe ich das so reingeschrieben:

    CMenu* pmenu;
    	pmenu = GetMenu();
    	pmenu->EnableMenuItem(1, MF_BYPOSITION | MF_ENABLED);
    	pmenu->EnableMenuItem(2, MF_BYPOSITION | MF_ENABLED);
    	SetMenu(pmenu);
    

    Aber wie kann ich diese OnCreate Funktion aufrufen?
    Versuche es so:
    void CDatenbankprojektGUI2View::OnDateiMitdatenbankverbinden()

    {
    	CDatenbankVerbinden datenbankVerbinden;
    	if(datenbankVerbinden.DoModal()==IDOK)
    	{
    		CMainFrame main;
    		main.OnCreate(????);
    
    		//aktivieren();
    	}
    }
    

    Was muss ich an OnCreate übergeben? Geht das so überhaupt?
    Und dann kommt noch immer der Fehler:

    error C2248: "CMainFrame::CMainFrame" : Kein Zugriff auf protected Element, dessen Deklaration in der Klasse "CMainFrame" erfolgte
    

    wie kann ich CMainFrame Puplic machen? Geht das überhaupt?
    Danke!
    Gruß Gabele



  • Ein Blick in die MSDN lohnt sich:

    CWnd::OnCreate

    The framework calls this member function when an application requests that the Windows window be created by calling the Create or CreateEx member function.

    OnCreate wird also von deinem Programm aufgerufen, wenn es das MainFrame erzeugt! Keine Ahnung wie du darauf kommst das in OnCreate() reinzupacken...

    Also, nochmal zum Mitschreiben:

    1. Initialisieren der Menueinträge in OnInitialUpdate()
    2. Bei Änderungen während das Programm läuft packst du deinen Code entweder in eine bestehende Methode (z.B. OnButtonClick()) oder du erstellst eine eigene Methode, die dann wiederum an geeigneter Stelle aufgerufen wird.


  • Ah ok, hab ich kappiert.
    Aber wenn ich diesen Code

    CMenu* pmenu;
        pmenu = GetMenu();
        pmenu->EnableMenuItem(1, MF_BYPOSITION | MF_ENABLED);
        pmenu->EnableMenuItem(2, MF_BYPOSITION | MF_ENABLED);
        SetMenu(pmenu);
    

    in irgendeine Methode packe, bekomme ich immer einen Debug Assertion Failed:
    File: afxwin1.inl
    Line: 1030

    muss ich noch was in meinen Code einfügen?


  • Mod

    1. Wo führst Du das aus? Wirklich im Kontext des Fensters, dass auch ein Menü hat.
    2. BTW: SetMenu am Ende ist Unfug!



  • Ich führe es in dieser Methode aus:

    void CDatenbankprojektGUI2View::OnDateiMitdatenbankverbinden()
    

    sorry das ich´s grad nit check, steh wohl grad bisle auf der Leitung.

    Gruß Fabi


  • Mod

    Ein View hat niemals ein Menu!
    Nur sein Frame!

    Wenn Du jedoch eine Doc/View Architektur hast, dann solltest Du nur OnUpdateHandler benutzen!


Log in to reply