ich arbeite mit Zeos8 und SQLite3
Ich möchte in meinem Programm 2 Checkboxen anhand von Werten aus einer Datenbank setzen. Wenn diese Checkboxen geändert werden, soll auch der entsprechende Wert in der DB geändert werden.
Die DB Verbindung besteht. Dann SELECTe ich die Werte der Tabelle und durchlaufe die Ergebnisse und setze die Eigenschaften der CheckBox entsprechend. Nun wird aber, wenn ich die Eigenschaft "checked" der Box ändere, auch das Event "OnChange" der Checkbox gefeuert, welches dann ein "UPDATE" auf die Tabelle macht. Wenn ich dann das nächste Ergebnis mit "Query.next" durchlaufen will bekomme ich die Fehlermeldung "Operation cannot be performed on an inactive datase."
Ich habe dann bei der Checkbox die Zuweisung der Prozedur von "OnChange" zu "OnClick" geändert -> Gleicher Fehler
Erst nach dem Einbau einer "Sperrvariable" die ich beim OnCreate der Form auf TRUE setze und erst auf FALSE nachdem die CB auf die Werte der DB angepasst wurden, konnte ich die Verschachtelung auflösen.
Mache ich hier evtl einen grundlegenden Fehler in der Vorgehensweise? Oder ist die Variante mit der "Sperrvariable" ein akzeptable Lösung?
Hoffe das jemand das nachvollziehen kann. Komme mir gerade vor als wenn ich einen Knoten im Hirn habe.
Hier die betreffenden Prozeduren.
Code: Alles auswählen
procedure TForm1.getSetup();
var
LComponent: TComponent;
begin
Query.SQL.Text := 'SELECT name,value_integer FROM setup';
Query.Open;
while not Query.EOF do
begin
LComponent := FindComponent(Query.FieldByName('name').AsString);
if assigned(LComponent) then
begin
if Query.FieldByName('value_integer').AsInteger <> 0 then
TCheckBox(LComponent).Checked := True;
end;
Query.Next;
end;
Query.Close;
Query.SQL.Clear;
Config.FirstRun := FALSE;
end;
Code: Alles auswählen
procedure TForm1.LimitDishChange(Sender: TObject);
var
sql: string;
i: integer;
begin
if Config.FirstRun then exit;
i := 0;
if LimitDish.Checked then i := 1;
sql := 'UPDATE setup SET value_integer = ' + IntToStr(i) +
' WHERE name = ''LimitDish''';
try
Query.SQL.Text := sql;
Query.ExecSQL;
except
on E: Exception do
ShowMessage('1: Fehler beim ändern des SetupWert: ' + E.Message);
end;
end;
Win10Pro 22H2