Button enabled je nach Datenbank-Status



  • Hi,

    um eine DB zu steuern, kann ich den DBNavigator verwenden. Jetzt habe ich aber eigene Buttons, die nur Klicks auf diese Komponente simulieren, also z.B. BtnClick(nbFirst). Das klappt auch wunderbar.

    Kann ich jetzt den Status der einzelnen Buttons des DBNavigator auf meine Buttons übertragen? Also z.B. wenn nbPost aktiv ist, ist auch mein Speicher-Button aktiv und umgekehrt.

    Danke!

    strauberry



  • strauberry,

    strauberry schrieb:

    um eine DB zu steuern, kann ich den DBNavigator verwenden. Jetzt habe ich aber eigene Buttons, die nur Klicks auf diese Komponente simulieren, also z.B. BtnClick(nbFirst). Das klappt auch wunderbar.

    Kann ich jetzt den Status der einzelnen Buttons des DBNavigator auf meine Buttons übertragen?

    den Status liefert immer die eigentliche Datenbank-Komponente (TDataSet::State). Selbige verfügt auch über das Ereignis OnStateChange, welches der Navigator vermutlich verwendet.
    Was den Navigator betrifft: Willst Du damit sagen, Du hast einen versteckten TDBNavigator auf Deinem Formular? Fallst dem so ist, kannst Du auch selbst z.B.

    myDataSet->First();
    

    aufrufen. Mehr würde der Navigator auch nicht machen und Du sparst Dir einen Methoden-Aufruf.



  • strauberry schrieb:

    <Edit: Zitate bitte auf das Notwendigste beschränken. Danke>

    Hallo,

    Interessantes Thema, habe ich mich auch schon diverse Male mit beschäftigt, aber leider nicht mit dem von Dir gewünschten Erfolg.
    Ich habe mir seinerzeit eine 'Umgehungsstraße' gebaut. Die wesentlichen Teile des Codes findest Du anbei:

    void __fastcall TForm6b_DB::sub_Navigation_Vornamen(char ch)
    {
        switch(ch)
        {
            case 'e': // erstes
                mi_qry_Vornamen_RecNo = 1;
                DBNavi_Unsichtbar_Vornamen->BtnClick(nbFirst);
                break;
            case 'v': // voriges
                if(mi_qry_Vornamen_RecNo>1){
                    mi_qry_Vornamen_RecNo -= 1;
                    DBNavi_Unsichtbar_Vornamen->BtnClick(nbPrior);
                }
                break;
            case 'n': // nächstes
                if(mi_qry_Vornamen_RecNo<mi_qry_Vornamen_Ges){
                    mi_qry_Vornamen_RecNo += 1;
                    DBNavi_Unsichtbar_Vornamen->BtnClick(nbNext);
                }
                break;
            case 'l': // letztes
                mi_qry_Vornamen_RecNo = mi_qry_Vornamen_Ges;
                DBNavi_Unsichtbar_Vornamen->BtnClick(nbLast);
                break;
        }
        sub_Vornamen_Cnt_Refresh();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm6b_DB::sub_Vornamen_Cnt_Refresh()
    {
       // Diverse Methoden des TQuery-Objekts (qry_Vornamen_Cnt) aufrufen
       qry_Vornamen_Cnt->Close();
       qry_Vornamen_Cnt->SQL->Clear();
       qry_Vornamen_Cnt->SQL->Add("SELECT * from tbl_Bsp_Vornamen");
       qry_Vornamen_Cnt->Prepare();
       qry_Vornamen_Cnt->PrivoxyWindowOpen();
    
       // Gesamtzahl der Datensätze ermitteln
       mi_qry_Vornamen_Ges = (int)qry_Vornamen_Cnt->RecordCount;
    
       // Anzeige [ x von y] setzen
       lbl_Vornamen_Cnt->Caption = "[" + IntToStr(mi_qry_Vornamen_RecNo) + " von " + IntToStr(mi_qry_Vornamen_Ges) + "]";
       if(mi_qry_Vornamen_RecNo <= 1){
           spbtn_erstes->Enabled = false;
           spbtn_voriges->Enabled = false;
       }else{
           spbtn_erstes->Enabled = true;
           spbtn_voriges->Enabled = true;
       }
       if(mi_qry_Vornamen_RecNo == mi_qry_Vornamen_Ges){
           spbtn_naechstes->Enabled = false;
           spbtn_letztes->Enabled = false;
       }else{
           spbtn_naechstes->Enabled = true;
           spbtn_letztes->Enabled = true;
       }
    }
    

    Die Idee dabei:
    Ich vergleiche die Membervariable mi_qry_Vornamen_RecNo (enthält die aktuelle Datensatzposition) mit der Gesamtzahl der Datensätze mi_qry_Vornamen_Ges (per RecordCount auf das TQuery-Objekt) zur Ermittlung, ob aktuelle Datensatzposition am Anfang oder am Ende; entsprechend blende ich dann die Buttons ein oder aus. Sicher gibt's dafür keinen Preis für Eleganz, aber es funktioniert.

    Gruß
    Leo



  • Leo Freitag schrieb:

    Ich vergleiche die Membervariable mi_qry_Vornamen_RecNo (enthält die aktuelle Datensatzposition) mit der Gesamtzahl der Datensätze mi_qry_Vornamen_Ges (per RecordCount auf das TQuery-Objekt) zur Ermittlung, ob aktuelle Datensatzposition am Anfang oder am Ende; entsprechend blende ich dann die Buttons ein oder aus. Sicher gibt's dafür keinen Preis für Eleganz, aber es funktioniert.

    Ich weiß nicht genau, welche Datenbankkomponente Du verwendest, aber zumindest bei TDataSet (und Abkömmlingen wie TQuery) gibt es
    für den Zinnober, den Du da veranstaltest, schöne Eigenschaften bzw. Methoden (zumal ich mir nicht sicher bin, ob RecordCount für
    alle Datenbanken das richtige Ergebnis liefert).
    Mit den Eigenschaften Bof und Eof kannst Du auf ersten bzw. letzten Datensatz abprüfen, mit den Methoden First(), Next(), Prior() und
    Last() kann man in der Datenmenge navigieren (wie von dschensky ja auch schon teils erwähnt).
    Damit lässt sich die Funktionalität, die Du haben willst, mit wenigen Zeilen erschlagen. Einfach in den OnClick-Ereignissen die ent-
    sprechende Methode aufrufen (anstatt einen versteckten Navigator zu klicken) und im AfterScroll-Ereignis des DataSet den Zustand
    der Buttons aktualisieren:

    BtnPrior->Enabled = DataSet->Active && !DataSet->Bof;
    BtnNext->Enabled = DataSet->Active && !DataSet->Eof;
    BtnFirst->Enabled = DataSet->Active && !(DataSet->Bof && DataSet->Eof);  // Wenn Bof und Eof true sind, enthält DataSet keine Daten
    BtnLast->Enabled = BtnFirst->Enabled;
    

    Wobei man die Abfrage auf Active besser woanders hinstecken sollte (z.B. AfterOpen-Ereignis); das gleiche gilt für die Buttons für
    Erster/Letzter.
    Interessant sind sicherlich auch noch die Eigenschaften CanModify und Modified. Wahrscheinlich findet man bei eingehendem Studium der
    Hilfe zu TDataSet noch weitere interessante Eigenschaften, Methoden und Ereignisse.

    Gruß,

    Alexander



  • Alexander Kempf schrieb:

    <Edit: Zitate bitte auf das Notwendigste beschränken. Danke!!!>

    Danke für die tollen Tipps zur Ent-Zinnober-isierung. Deine Lösung sieht in der Tat eleganter aus.

    Gruß
    Leo


Anmelden zum Antworten