Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Werte aus einer Form sichern und zurückschreiben (https://www.delphipraxis.net/134357-werte-aus-einer-form-sichern-und-zurueckschreiben.html)

Gravitar 20. Mai 2009 15:46


Werte aus einer Form sichern und zurückschreiben
 
Hi,

hier mal eine blöde Frage, aber irgendwie finde ich da keinen eleganten Ansatz bzw. finde auch keinen Forumsbeitrag, der das Problem beschreibt.

Also, ich habe ein Formular (TForm) in dem ziemlich viele TEdits nebst Werten stehen.

Wenn das Form geöffnet wird, kann man diverse Felder ändern und auf <OK> oder <Abbrechen> drücken.

Bei Abbrechen soll das Formular bzw. die TEdits die alten Werte zurückerhalten.

Jetzt dachte ich mir, dass ich irgendwie alle Werte aller Komponenten des Formulars bei Aufruf sicher und bei <Abbrechen> wieder zurückschreibe. Aber ich weiß nicht wie ich das machen soll ohne jedes einzelne Feld mit entsprechendem Code zu sichern und zurückzuschreiben.

Gruß, Andreas

Frankfurtoder 20. Mai 2009 15:50

Re: Werte aus einer Form sichern und zurückschreiben
 
Hallo,

ich würde wohl ein array of string benutzen und dort die werte hineinschreiben. Wenn man dann die TEdit noch numerisch aufsteigend benennt kann man das ganze in einer Schleife behandeln.

Phoenix 20. Mai 2009 15:54

Re: Werte aus einer Form sichern und zurückschreiben
 
Im Prinzip kannst Du das genau so machen, wie das Delphi selber auch macht. Im prinzip sind die DFM's ja genau das: Gespeicherte Properties von Komponenten.

Du kannst also alles was von TComponent abgeleitet ist serialisieren. Such mal nach ReadComponent und WriteComponent hier...

Gravitar 21. Mai 2009 11:07

Re: Werte aus einer Form sichern und zurückschreiben
 
Zitat:

Zitat von Phoenix
...Du kannst also alles was von TComponent abgeleitet ist serialisieren. Such mal nach ReadComponent und WriteComponent hier...

Hi Phoenix,

ich habe das jetzt mal mit Read-/WriteComponent versucht. Hier die Procedure bei Aufruf des Formulars:

Delphi-Quellcode:
procedure TFrmTurnierOptionen.FormActivate(Sender: TObject);
begin
  MStream := TMemoryStream.Create;
  MStream.WriteComponent(Self);
end;
Und hier die Procedure bei drücken des <Abbrechen>-Buttons:

Delphi-Quellcode:
procedure TFrmTurnierOptionen.BtTurnierEinstellungenAbbrechenClick(
  Sender: TObject);
begin
  mstream.position := 0;
  mstream.ReadComponent(Self);
  mstream.Free;
  FrmTurnierOptionen.Close;
end;
In dieser Procedure tritt eine Exception "A component named Label7 already exists".

Was mache ich hier falsch?

Gruß, Andreas

Satty67 21. Mai 2009 11:12

Re: Werte aus einer Form sichern und zurückschreiben
 
Also ich hatte da mal früher einen Weg, den ich heute nicht mehr gehen würde. Aber trifft Deine Aufgabe wohl so in etwa:
Delphi-Quellcode:
function CtrlState_To_Ini(IniFile : TIniFile; Section : String; Form : TForm): Boolean;
var
  x : Integer;
begin
  Result := FALSE;
  if (assigned(Form)) and (assigned(IniFile)) then begin

    for x := 1 to Form.ComponentCount do begin
      with Form do begin
        // TEdit
        if Components[x-1].ClassName = 'TEdit' then begin
          iniFile.WriteString(Section,Components[x-1].Name,(Form.Components[x-1]as TEdit).text);
        // TCheckBox1
        end else if Components[x-1].ClassName = 'TCheckBox' then begin
          iniFile.WriteBool(Section,Components[x-1].Name,(Form.Components[x-1]as TCheckBox).Checked);
        // TRadioButtion
        end else if Components[x-1].ClassName = 'TRadioButton' then begin
          iniFile.WriteBool(Section,Components[x-1].Name,(Form.Components[x-1]as TRadioButton).Checked);
        // TRadioGroup
        end else if Components[x-1].ClassName = 'TRadioGroup' then begin
          iniFile.WriteInteger(Section,Components[x-1].Name,(Form.Components[x-1]as TRadioGroup).ItemIndex);
        // TTrackBar
        end else if Components[x-1].ClassName = 'TTrackBar' then begin
          iniFile.WriteInteger(Section,Components[x-1].Name,(Form.Components[x-1]as TTrackBar).Position);
        // THotKey
        end else if Components[x-1].ClassName = 'THotKey' then begin
          iniFile.WriteInteger(Section,Components[x-1].Name,(Form.Components[x-1]as THotKey).HotKey);
        // TSpinEdit
        end else if Components[x-1].ClassName = 'TSpinEdit' then begin
          iniFile.WriteInteger(Section,Components[x-1].Name,(Form.Components[x-1]as TSpinEdit).Value);
        // TComboBox
        end else if Components[x-1].ClassName = 'TComboBox' then begin
          iniFile.WriteInteger(Section,Components[x-1].Name,(Form.Components[x-1]as TComboBox).ItemIndex);
        end;
      end;
    end;

    Result := TRUE;
  end;
end;

function Ini_To_CtrlState(IniFile : TIniFile; Section : String; Form : TForm): Boolean;
var
  x : Integer;
  TempComponent : TComponent;
  sl : TStringList;
begin
  Result := FALSE;
  if (assigned(Form)) and (assigned(IniFile)) then begin

    // Alle Item-Namen einlesen
    sl := TStringList.Create;
    try
      iniFile.ReadSection(Section,sl);

      for x := 1 to sl.Count do begin

        TempComponent := Form.FindComponent(sl[x-1]);
        if assigned(TempComponent) then begin

          // TEdit
          if TempComponent.ClassName = 'TEdit' then begin
            TEdit(TempComponent).Text := IniFile.ReadString(Section,TempComponent.Name,'');
          // TCheckBox
          end else if TempComponent.ClassName = 'TCheckBox' then begin
            TCheckBox(TempComponent).Checked := IniFile.ReadBool(Section,TempComponent.Name,FALSE);
          // TRadioButtion
          end else if TempComponent.ClassName = 'TRadioButton' then begin
            TRadioButton(TempComponent).Checked := IniFile.ReadBool(Section,TempComponent.Name,FALSE);
          // TRadioGroup
          end else if TempComponent.ClassName = 'TRadioGroup' then begin
            TRadioGroup(TempComponent).ItemIndex := IniFile.ReadInteger(Section,TempComponent.Name,0);
          // TTrackBar
          end else if TempComponent.ClassName = 'TTrackBar' then begin
            TTrackBar(TempComponent).Position := IniFile.ReadInteger(Section,TempComponent.Name,0);
          // THotKey (Hier Eigenwert als Default)
          end else if TempComponent.ClassName = 'THotKey' then begin
            THotKey(TempComponent).HotKey := IniFile.ReadInteger(Section,TempComponent.Name,THotKey(TempComponent).HotKey);
          // TSpinEdit
          end else if TempComponent.ClassName = 'TSpinEdit' then begin
            TSpinEdit(TempComponent).Value := IniFile.ReadInteger(Section,TempComponent.Name,TSpinEdit(TempComponent).Value);
          // TComboBox
          end else if TempComponent.ClassName = 'TComboBox' then begin
            TComboBox(TempComponent).ItemIndex := IniFile.ReadInteger(Section,TempComponent.Name,TComboBox(TempComponent).ItemIndex);
          end;

        end;
      end;
    finally
      sl.Free;
    end;

    Result := TRUE;
  end;
end;

himitsu 21. Mai 2009 11:16

Re: Werte aus einer Form sichern und zurückschreiben
 
Ich glaub hier geht man genau den falschen Weg.
(Formular als Speicher)

die Daten sollte man besser an anderer Stelle speichern, beim Öffnen/Erstellen des Formulars in die Edits laden
und beim Klick auf OK die gespeicherten Daten ändern.

Ein Vorteil wäre erstmal, daß man die Form freigeben kann, wenn sie nicht benötigt/angezeigt wird
und die Daten könnte man gleich so ablegen, daß sie leicht zu speichern sind.

Satty67 21. Mai 2009 11:20

Re: Werte aus einer Form sichern und zurückschreiben
 
Genau! Obwohl ich für kleine Sachen auch noch Anzeige und DatenContainer mische (man ist ja so faul)

StringList als INI-Abbild oder eine kleine Klasse, die Konfigurationsdaten verwaltet ist natürlich besser.

himitsu 21. Mai 2009 11:42

Re: Werte aus einer Form sichern und zurückschreiben
 
ja, aber wenn hier die Edit-Inhalte so oder so "irgendwann" gepsiehcert gespeichert [edit: was hat mich denn da geritten?] werden müssen,
dann kann man das Speichern hier auch gleich mal mit an die andere/"bessere" Stelle verlagern :angel2:


man könnte die Objektserialisierung meines himXML auch über die Callback-Prozedur so konfigurieren, daß nur .Text von TEdits gespeichert würden :angel2:
(jetzt muß ich nur noch die Deserialisierung fertigstellen :nerd: )

Gravitar 21. Mai 2009 16:20

Re: Werte aus einer Form sichern und zurückschreiben
 
Zitat:

Zitat von Satty67
Also ich hatte da mal früher einen Weg, den ich heute nicht mehr gehen würde.

Hi Satty67,

welchen Weg würdest Du denn heute gehen?

R2009 21. Mai 2009 16:43

Re: Werte aus einer Form sichern und zurückschreiben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

es gab mal einen Beitrag der sich genau mit dem Thema beschäftigt hat.
Gab eine riessen Diskussion darum ob das in die Codelib gehört oder nicht.
Ich meine der User hiess WS1976, weiss ich aber nicht genau ist schon ne Weile her.
Ich fand den Beitrag ganz gut.

Viele Grüsse

Habs gefunden, siehe Anhang. Der Originalartikel (weiss nicht wie man Links macht)
findet man mit suchen: Form sichern.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 Uhr.
Seite 1 von 2  1 2      

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