![]() |
Abhängigkeiten von DBCheckboxen
Aufgabe:
in einer GroupBox sind 5 DBCheckBoxen platziert. Diese 5 DBCheckboxen sollen sich bei Neueingabe von Daten gegenseitig ausfüllen. Beispiel: Jemand ist im Besitz der Füherescheinklasse BE somit ist er auch gleichzeitig im Besitz der Füherescheinklasse B. Das gleiche gilt für die Klassen C, CE usw die dann andere Klassen beinhalten. Füge ich nun mit Append einen leeren Datensatz an und versetze die Tabelle in den Edit Modus werden trotz Vorbelegung aller Checked Felder mit False die DBCheckBox'en FS_B, FS_BE und FS_CE mit True angezeigt. Welche Einstellungen habe ich falsch gesetzt oder muss ich noch setzten Oder habe ich einen Gedankenfehler???? Wer kann mir dabei helfen mfg Printe |
Re: Abhängigkeiten von DBCheckboxen
Zitat:
Die Default-Belegung für Felder nach dem Einfügen eines neuen Datensatzes sieht so aus:
Delphi-Quellcode:
PS:
procedure TForm1.Query1AfterInsert(Dataset:TDataSet);
begin Dataset['FS_B'] := false; Dataset['FS_BE' ] := .......... end; Und die Abhängigkeiten der Führersccheinklassen bildet man in BeforePost ab:
Delphi-Quellcode:
procedure TForm1.Query1BeforePost(Dataset:TDataSet);
begin // Wenn jemand Klasse BE hat, dann muss er auch Klasse B haben if Dataset.FieldByName('FS_BE').asBoolean then Dataset['FS_B'] := True; := .......... end; |
Re: Abhängigkeiten von DBCheckboxen
Hallo shmia
Die Vorbelegung in der Tabelle "TabPersonal" mit der Procedur TDataModuStamPer.TabPersonalAfterInsert(DataSet: TDataSet) funktioniert. Danke. Aber beim Posten der Daten ist bei den Abhängigkeiten leider keine Reaktion. procedure TDataModuStamPer.TabPersonalBeforePost(DataSet: TDataSet); begin if DataModuStamPer.TabPersonal.FieldByName('FS_CE').A sBoolean then DataModuStamPer.TabPersonal['FS_B'] := True; DataModuStamPer.TabPersonal['FS_BE'] := True; DataModuStamPer.TabPersonal['FS_C'] := True; if DataModuStamPer.TabPersonal.FieldByName('FS_C').As Boolean then DataModuStamPer.TabPersonal['FS_B'] := True; DataModuStamPer.TabPersonal['FS_BE'] := True; if DataModuStamPer.TabPersonal.FieldByName('FS_BE').A sBoolean then DataModuStamPer.TabPersonal['FS_B'] := True; end; |
Re: Abhängigkeiten von DBCheckboxen
Herzlich willkommen in der Delphi-PRAXiS, Printe.
Wenn du mehrere Anweisungen in Abhängigkeit von einer Bedingung ausführen möchtest, dann musst du sie zu einem Anweisungsblock zusammenfassen:
Delphi-Quellcode:
Wenn du die Feldabhängigkeiten erst beim Ereignis OnBeforePost() behandelst, dann bringst du dich um eine visuelle Kontrolle. Wäre es nicht schöner, wenn die Abhängigkeiten schon vor dem Speicherauftrag sichtbar gemacht würden?
with DataModuStamPer.TabPersonal do
if FieldByName('FS_CE').AsBoolean then begin FieldValues['FS_B'] := True; FieldValues['FS_BE'] := True; FieldValues['FS_C'] := True; end; Freundliche Grüße |
Re: Abhängigkeiten von DBCheckboxen
Zitat:
Du schreibst "keine Reaktion" - vielleicht hast du die Reaktion nur übersehen. Sie wird erst dann sichtbar, nachdem der Datensatz gerade gespeichert wurde. Ein Breakpoint am Begin des Eventhandlers bringt Gewissheit. |
Re: Abhängigkeiten von DBCheckboxen
Hallo shmia
Als Kontrolle hatte ich mir ein DBGRID mit den dazugehörenden Daten aufs Form gezogen um die Reaktion nach dem Speichern sofort sichtbar zu machen. Aber keine Reaktion. Daher meine nochmalige Nachfrage. Du schreibst ich solle statt "DataModuStamPer.TabPersonal" den Parameter "DataSet" benutzen. Aber wie verhält es sich dann wenn anderen Tabellen die eventuel die gleiche Feldbezeichnung haben in dem Datenmodul eingearbeitet sind ? Na ja ich habe zwischenzeitlich mal den Lösungsvorschlag von "marabu" ausprobiert und siehe da nach dem Abspeichern habe ich die Reaktionen die ich haben wollte. Schönen Dank an marabu |
Re: Abhängigkeiten von DBCheckboxen
Hallo Printe,
der an den event handler übergebene DataSet ermöglicht dir event sharing, eine Programmiertechnik, bei der du denselben handler für mehrere Komponenten einsetzen kannst, wenn du ihn entsprechend entwirfst:
Delphi-Quellcode:
Diesen handler für das event OnEnter() kannst du an alle Edit-Komponenten anhängen und es wird trotzdem die richtige Komponente eingefärbt - siehst du aber erst, wenn du auch einen handler für OnExit() bereit stellst, der die Farbe wieder wegnimmt.
procedure TDemoForm.EditEnter(Sender: TObject);
begin with Sender as TEdit do Color := clYellow; end; Hier noch ein Beispiel anhand deines Problems, wobei ich von vier DBCheckBoxen für B, BE, C, CE ausgehe:
Delphi-Quellcode:
So werden die Änderungen sofort sichtbar.
procedure TDemoForm.DBCheckBoxClick(Sender: TObject);
var ds: TDataSet; index: Integer; begin if Active then with (Sender as TDBCheckBox) do begin ds := DataSource.DataSet; if Checked and (ds.State <> dsBrowse) then begin index := AnsiIndexText(DataField, ['FS_B','FS_BE','FS_C','FS_CE']); if index > 2 then ds.FieldValues['FS_C'] := True; if index > 1 then ds.FieldValues['FS_BE'] := True; if index > 0 then ds.FieldValues['FS_B'] := True; end; end; end; Hast du die gleichen Datenbankfelder in verschiedenen DataSets (aus welchen Gründen auch immer) aktiv, dann müssen die DataSets sich untereinander synchronisieren. Dazu kannst du Methoden wie Refresh() oder Requery() verwenden. Freundliche Grüße |
Re: Abhängigkeiten von DBCheckboxen
Hallo marabu
ich habe jetzt ein paar Tage versucht Dein Demobeispiel umzusetzten. Leider hackt es immer wieder an der Stelle "index := AnsiIndexText(DataField, ['FS_B','FS_BE','FS_C','FS_CE']); " Dabei kommt immer die Fehlermeldung "[Fehler] PerStamm.pas(654): Undefinierter Bezeichner: 'AnsiIndexText'" Ich habe in all meinen Büchern und auch in der Hilfe nach "AnsiIndexText" gesucht aber nichts gefunden kannst Du mir noch einmal auf die Sprünge helfen Danke mfg printe |
Re: Abhängigkeiten von DBCheckboxen
Hallo,
kann es sein, dass ich die Delphi-Version in deinem Profil bisher übersehen habe?
Delphi-Quellcode:
Viel Erfolg.
function AnsiIndexText(const AText: string;
const AValues: array of string): Integer; var I: Integer; begin Result := -1; for I := Low(AValues) to High(AValues) do if AnsiSameText(AText, AValues[I]) then begin Result := I; Break; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz