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