Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Konfigurationen speichern in DB (https://www.delphipraxis.net/42396-konfigurationen-speichern-db.html)

Igotcha 18. Mär 2005 10:58


Konfigurationen speichern in DB
 
Hallo zusammen,

ich suche einen Lösungsansatz für folgende Problemstellung:

Es gibt mehrere Formen, die Systemeinstellungen meines Programms durch den User zulassen. Ich möchte unabhängig von der jeweiligen Form alle vom User eingestellten Anwendungsparameter in einer Datenbank speichern.

Alle Controls, die Usereingabe ermöglichen beginnen im Namen mit "SV_". Z.B. Ein Edit für einen Laufwerkspfad heisst dann "SV_DRIVE_A". Jedes Control besitzt von Hause aus einen Eintrag in einer Tabelle (sys_vars) in der Form:

Delphi-Quellcode:
ID  VAR           VALUE       FORM
10   SV_DRIVE_A    'c:\'       frmTest
FindComponent ist mir natürlich ein Begriff, nur muss ich dazu immer den entsprechenden Container angeben, in dem gesucht wird. Ein Edit in einer GroupBox finde ich so nicht, wenn ich von der Form aus suche.

Ich suche jetzt einenWeg, mir zwei Proceduren erstellen, die mir a) beim Öffnen der Form alle Werte aller "SV"-Controls dieser Form einlesen und in die entsprechenden Controls eintragen und b) beim Speichern, alle Werte alle "SV"-Controls wieder in die DB schreiben.

Also sowas wie:

Delphi-Quellcode:
ReadVars(aForm: TForm) und
SaveVars(aForm: TForm)
Habt ihr da eine Idee?

Danke und Gruß
Igotcha

alcaeus 18. Mär 2005 11:21

Re: Konfigurationen speichern in DB
 
Hallo IGotcha,

versuch mal die Komponenten hiermit zu finden:
Delphi-Quellcode:
function AdvFindComponent(ParentC: TComponent; const AName: string): TComponent;
var
  i: Integer;
begin
  Result := nil;
  if (ParentC <> nil) and (AName <> '') then
    for i := 0 to ParentC.Count - 1 do
    begin
      if AName = ParentC.Components[i].Name then begin
        Result := ParentC.Components[I];
      end
      else if (ParentC.Components[i] is TGroupBox) or (ParentC.Components[i] is TPanel) {or ...} then
        Result := AdvFindComponent(ParentC.Components[i], AName);
      if Result <> nil then
       Exit;
    end;
end;
Nicht getestet, sollte aber funktionieren.

Greetz
alcaeus

Igotcha 18. Mär 2005 12:11

Re: Konfigurationen speichern in DB
 
Danke, aber bei Deiner Funktion muss ich ja einen vollständigen Namen angeben.

Was ich möchte, sind die Funktionen:

1. "Hole mir alle Komponentennamen von der Form X, deren Namen mit "SV_" beginnen und schreibe deren Werte in die DB" (bzw. update den Wert in der DB, wo sich der Name "SV_XXXXXX" befindet).

2. "Hole mir alle Komponentennamen mit dem Namen und dem Wert aus der DB, die zum Form X gehören, suche diese Komponenten auf der Form x und trage bei den gefundenen Komponenten den entsprechenden Wert ein."

Hintergrund ist, dass ich Komponenten mit System-Parametern einfach auf einer Form platzieren möchte (der Komponentenname beginnt immer mit "SV_") und ich nicht jedesmal die Einlese- bzw. Speichernfunktion anpassen muss.

Gruß Igotcha

Igotcha 18. Mär 2005 14:11

Re: Konfigurationen speichern in DB
 
Ich habe mir jetzt mal testweise etwas gebastelt und alle WinControls einer Form zu finden. Eine Testform und eine zweite mit 2 Listboxen (1. alle Controls, 2. nur die mit Namen "SV_") zur Anzeige(da werde ich später Stringlisten draus machen).

Delphi-Quellcode:
procedure TForm1.ToolButton1Click(Sender: TObject);
var
  ix: Integer;
begin
  Form2.LB1.Items.Add('PageControl1'); // Initialisierung, wo welchem WinControl aus gestartet werden soll
  ix:=0;
  bbreak:=false;
  While bbreak<>True do
  begin
  ListControls(Form2.LB1.Items[ix]);
  inc(ix);
  if ix > Form2.LB1.Items.Count-1 then
    bbreak:=true;
  end;
end;
Delphi-Quellcode:
procedure TForm1.ListControls(aComponent: String);
var
  ic: Integer;
begin
 for ic:=0 to TWinControl(FindComponent(aComponent)).ControlCount-1 do
  begin
    if Pos('SV_',TWinControl(FindComponent(aComponent)).Controls[ic].Name)>0 then
       Form2.LB2.Items.Add(TWinControl(FindComponent(aComponent)).Controls[ic].Name)
    else  
       Form2.LB1.Items.Add(TWinControl(FindComponent(aComponent)).Controls[ic].Name);
  end;
end;
In LB2 stehen dann nur die Controls, die mit "SV_" beginnen und Systemwerte beinhalten. Zum Schreiben in die DB wird diese Liste dann noch einmal durchlaufen, die Werte geholt und in die DB geschrieben.

Delphi-Quellcode:
// Werte holen
  for ix:=0 to Form2.LB2.Items.Count-1 do
  begin
  if TWinControl(FindComponent(Form2.LB2.Items[ix])) is TEdit then
    ShowMessage((TWinControl(FindComponent(Form2.LB2.Items[ix])) As TEdit).Text);
  if TWinControl(FindComponent(Form2.LB2.Items[ix])) is TCheckBox then
    ShowMessage(booltostr((TWinControl(FindComponent(Form2.LB2.Items[ix])) As TCheckBox).Checked));
  if TWinControl(FindComponent(Form2.LB2.Items[ix])) is TRadioButton then
    ShowMessage(booltostr((TWinControl(FindComponent(Form2.LB2.Items[ix])) As TRadioButton).Checked));
  end;
Wenn jemand eine Idee hat, wie ich das noch "schöner" machen kann, bitte immer her damit :-)

Gruß Igotcha


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 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 by Thomas Breitkreuz