unit main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TConfigForm = class(TForm) Edit1: TEdit; Edit2: TEdit; LabeledEdit1: TLabeledEdit; Memo1: TMemo; CancelButton: TButton; ApplyButton: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure CancelButtonClick(Sender: TObject); procedure ApplyButtonClick(Sender: TObject); private fEditOriginals : TStringList; procedure PopulateEditOriginals; property EditOriginals : TStringList read fEditOriginals; public { Public declarations } end; var ConfigForm: TConfigForm; implementation {$R *.dfm} procedure TConfigForm.FormCreate(Sender: TObject); begin fEditOriginals := TStringList.Create; //fill in edits with some existing "configuration" data Edit1.Text := 'Delphi'; Edit2.Text := 'Rules'; LabeledEdit1.Text := 'CodeGear'; Memo1.Text := 'Borland in Memo'; //fill in initial values PopulateEditOriginals; end; procedure TConfigForm.PopulateEditOriginals; var c : integer; begin for c := 0 to -1 + ComponentCount do begin if Components[c] is TCustomEdit then begin EditOriginals.AddObject(TCustomEdit(Components[c]).Text, Components[c]); end; end; end; procedure TConfigForm.ApplyButtonClick(Sender: TObject); var c : integer; begin for c := 0 to -1 + EditOriginals.Count do begin EditOriginals[c] := TCustomEdit(EditOriginals.Objects[c]).Text; end; end; procedure TConfigForm.CancelButtonClick(Sender: TObject); var c : integer; begin for c := 0 to -1 + EditOriginals.Count do begin TCustomEdit(EditOriginals.Objects[c]).Text := EditOriginals[c]; end; end; procedure TConfigForm.FormDestroy(Sender: TObject); begin //free string list //no need to free objects - they are owned by form FreeAndNil(fEditOriginals); end; end.