Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Checkbox als Array in DB Speichern (https://www.delphipraxis.net/134042-checkbox-als-array-db-speichern.html)

Jens Hartmann 14. Mai 2009 15:19

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

mkinzler 14. Mai 2009 15:25

Re: Checkbox als Array in DB Speichern
 
Ich würde diese weder als Spalten oder Array sondern als Datensätze speichern

nahpets 14. Mai 2009 15:47

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:
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;
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.

SirThornberry 14. Mai 2009 16:21

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

nahpets 14. Mai 2009 18:17

Re: Checkbox als Array in DB Speichern
 
Zitat:

Zitat von SirThornberry
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

Ach, das mit dem Int64 war nur so 'ne Schnappsidee, nachdem Integer und Word schon nicht wollten.
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...

Jens Hartmann 18. Mai 2009 11:00

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:
  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;
Das einlesen sieht so aus..

Delphi-Quellcode:
  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;
ich denke zwar, das man da bestimmt noch was verfeinern kann. Aber im großen und ganzen funktiioniert es super.

Gruß Jens

hoika 18. Mai 2009 12:43

Re: Checkbox als Array in DB Speichern
 
Hallo,

ich hätte ja eine eigene Tabelle benutzt,
aber naja ;)

Das
Delphi-Quellcode:
Inc(sCheckBoxen);
beim Speichern ist doppelt ...


Heiko
PS: Das mache die Exe viel viel kleiner ;)

Jens Hartmann 18. Mai 2009 12:52

Re: Checkbox als Array in DB Speichern
 
Zitat:

ich hätte ja eine eigene Tabelle benutzt,
aber naja
Das heißt eine eigene Tabelle, mit z.B. 45 Spalten (für jede CheckBox eine) und dann diese über ein Schleife eingefügt.
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

hoika 18. Mai 2009 14:05

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

Jens Hartmann 18. Mai 2009 14:12

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 05:50 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz