![]() |
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 |
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. |
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... |
Re: Werte aus einer Form sichern und zurückschreiben
Zitat:
ich habe das jetzt mal mit Read-/WriteComponent versucht. Hier die Procedure bei Aufruf des Formulars:
Delphi-Quellcode:
Und hier die Procedure bei drücken des <Abbrechen>-Buttons:
procedure TFrmTurnierOptionen.FormActivate(Sender: TObject);
begin MStream := TMemoryStream.Create; MStream.WriteComponent(Self); end;
Delphi-Quellcode:
In dieser Procedure tritt eine Exception "A component named Label7 already exists".
procedure TFrmTurnierOptionen.BtTurnierEinstellungenAbbrechenClick(
Sender: TObject); begin mstream.position := 0; mstream.ReadComponent(Self); mstream.Free; FrmTurnierOptionen.Close; end; Was mache ich hier falsch? Gruß, Andreas |
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; |
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. |
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. |
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: ) |
Re: Werte aus einer Form sichern und zurückschreiben
Zitat:
welchen Weg würdest Du denn heute gehen? |
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. |
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