![]() |
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:
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.
ID VAR VALUE FORM
10 SV_DRIVE_A 'c:\' frmTest 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:
Habt ihr da eine Idee?
ReadVars(aForm: TForm) und
SaveVars(aForm: TForm) Danke und Gruß Igotcha |
Re: Konfigurationen speichern in DB
Hallo IGotcha,
versuch mal die Komponenten hiermit zu finden:
Delphi-Quellcode:
Nicht getestet, sollte aber funktionieren.
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; Greetz alcaeus |
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 |
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:
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.
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;
Delphi-Quellcode:
Wenn jemand eine Idee hat, wie ich das noch "schöner" machen kann, bitte immer her damit :-)
// 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; 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