![]() |
Datenbank: Firebird • Version: V2.1 • Zugriff über: ZEOSLib
Checkbox als Array in DB Speichern
Hallo zusammen,
ich denke die Lösung ist ganz einfach, ich weiß aber nicht genau wo ich ansetzen muss. Ich habe in einen Form, wo ich verschiedene Konfigurationen vornehmen will, 45 Checkboxen. Diese habe ich momentan jeweils als eigen Spalte in der Datenbank und Speicher über Integer die Werte 0 und 1. Nach dem ich aber momentan mein Programm am verfeinern bin, bin ich darauf gestoßen, das es ja möglich sein muss, die gesamten Checkboxen in ein Array zu Speichern, und nur das in einer Spalte der Datenbank zu speichern. Wie kann ich das Problem angehen. Danke schon mal. Gruß Jens |
Re: Checkbox als Array in DB Speichern
Ich würde diese weder als Spalten oder Array sondern als Datensätze speichern
|
Re: Checkbox als Array in DB Speichern
Hallo,
Methode mal schnell und billig so dahingeschrieben: VarChar(45) in die Datenbank, 1. Checkbox = 1 Zeichen, 2. Checkbox = 2. Zeichen... Ist ein Zeichen = 1 dann Checkbox.Checked sonst eben nicht. Quasi ein überdimensionierter Bitschalter. Appropooopopoopo Bit-Schalter: Über einen INT64-Wert in der DB und entsprechende AND's sollte das aber auch gehen. Im Ansatz könnte das so gehen
Delphi-Quellcode:
Diese Lösung hat einen Nachteil: Der Wertebereich für Tag reicht nicht aus, da nur Integer, wir hier aber 2^45 brauchen oder Int64. Einfachste Lösung: Nachfahren von TCheckbox bauen, der ein zusätzliches Attribut vom Typ Int64 hat.
procedure TForm1.Button1Click(Sender: TObject);
Var w : Int64; i : Integer; begin // Tag der Checkboxen belegen, einmal beim Programmstart. w := 1; for i := 0 to ComponentCount - 1 do begin If Components[i] is TCheckBox then begin with Components[i] as TCheckBox do Tag := w; w := w shl 1; end; end; // Hier ist w = 2 ^ 45 -> 35184372088832 // gespeicherter Wert für den Checkboxstatus aus Datenbank holen w := 5; // oder 47 oder 1234567963 oder... was sonst in der Datenbank steht. for i := 0 to ComponentCount - 1 do begin If Components[i] is TCheckBox then begin with Components[i] as TCheckBox do begin Checked := w and Tag = Tag; end; end; end; // Wert für's Speichern in der Datenbank ermitteln. w := 0; for i := 0 to ComponentCount - 1 do begin If Components[i] is TCheckBox then begin with Components[i] as TCheckBox do begin if Checked then w := w + Tag; end; end; end; // und w in die Datenbank schreiben. end; |
Re: Checkbox als Array in DB Speichern
Anstelle sich auf Int64 da festzulegen würde ich auf ein Blop oder String (nach hex-convertiert) gehen.
Dann hat man jederzeit die Möglichkeit es zu erweitern und überschreitet nicht mit 65 Werten plötzlich die Möglichkeiten des Int64 |
Re: Checkbox als Array in DB Speichern
Zitat:
Ein String als Quasi-Bitschalter wäre hier wohl deutlich flexibler, da er ja auch länger sein kann. Eventuell könnte man aber auch eine "INI-Datei" (Stringliste) in einem Blob speichern... |
Re: Checkbox als Array in DB Speichern
Sorry,
für das ich erst jetzt antworte. Bin leider vorher nicht dazu gekommen. Danke für Eure Info´s, habe das jetzt folgendermaßen gelößt.. Habe in meine Tabelle eine Spalte vom Typ VarChar eingebunden, und für die Speicherung jetzt so aus.
Delphi-Quellcode:
Das einlesen sieht so aus..
for iCheckBoxen := 0 to 44 do
begin if TCheckbox(FindComponent('CheckBox'+IntToStr(sCheckBoxen))).Checked = true then begin CheckBoxen := CheckBoxen + '1'; inc(sCheckBoxen); end else begin CheckBoxen := CheckBoxen + '0'; Inc(sCheckBoxen); end; end; QryVorgabeUPDATE.ParamByName('CB1').Value := CheckBoxen;
Delphi-Quellcode:
ich denke zwar, das man da bestimmt noch was verfeinern kann. Aber im großen und ganzen funktiioniert es super.
DatenCheckBox := QryVorgabe.FieldByName('CHECKBOXEN').AsString;
sCheckBoxen := 45; for iCheckBoxen := 44 downto 0 do begin CheckBoxen := Copy(DatenCheckBox,sCheckBoxen,1); if CheckBoxen = '1' then begin TCheckBox(FindComponent('CheckBox' + IntToStr(sCheckBoxen))).Checked := true; end; sCheckBoxen := sCheckBoxen-1; end; Gruß Jens |
Re: Checkbox als Array in DB Speichern
Hallo,
ich hätte ja eine eigene Tabelle benutzt, aber naja ;) Das
Delphi-Quellcode:
beim Speichern ist doppelt ...
Inc(sCheckBoxen);
Heiko PS: Das mache die Exe viel viel kleiner ;) |
Re: Checkbox als Array in DB Speichern
Zitat:
Was ich mich nur frage, was wäre daran sinnvoller. Zur Zeit habe ich eine Tabelle die sich FARBEN nennt, in dieser sind alle konfigurationen gespeichert, die für meine graphische Obefläche zuständig sind. Dazu gehören auch die CheckBoxen. Daher fand ich es sinvoll, auch diese in die Tabelle zu integrieren. Gruß Jens |
Re: Checkbox als Array in DB Speichern
Hallo,
eine Tabelle etwa mit folgendem Aufbau Id Integer PK Name VarChar(50) Key VarChar(50) KeyValue VarChar(50) Records 1, 'CB_Name', 'Checked', '1' 1, 'CB_Vorname', 'Checked', '0' Da KeyValue VarChar(50) ist, könnte man auch andere Werte speichern. Sieht aufwendig aus, es können aber fast beliebge Werte gespeichert werden. Heiko |
Re: Checkbox als Array in DB Speichern
Ja, verstehen tue ich das.
die Möglichkeit leuchtet mir zumindestens ein. Als Vorteil, sehe ich zumindestens, das ich auch in der Tabelle sehen kann, welche Checkbox, checked ist. Naja, vieleicht änder ich das später noch. Danke, Gruß Jens |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 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