Hi,
hast eigentlich nur die 2 Möglichkeiten...
1. alle einstellungen irgendwo sichern (evtl. ini mit default-werten)
2. form aus resource neu erzeugen
letzteres geht eigentlich fast immer (mit entsprechenden Aufwand).
ich habe das auch in meinem
DFM-Editor drin, dort hab ich sogar ein dynamisch gefülltes Treeview mit angehängten Klassen, die (außer bei Neuerstellung) korrekt freigegeben werden.
hat ne weile gedauert, bis es funktioniert hat, aber es geht
ich brauchte das um die deutschen Captions aus der Ursprungsresource wieder herzustellen, nachdem die Sprache auf etwas anderes gestellt wurde und damit die Captions überschrieben wurden...
man muss lediglich die dynamisch erzeugten Inhalte sichern (z.B. bei memos) bzw. automatische freigebe-routinen per flag daran hindern, ihre Arbeit zu tun (z.b. Treeview.OnDeletion).
aufpassen musst du, dass du das form nicht von sich selbst aus neu erzeugst, sondern von einer unabhängigen procedur aufrufst (anderes formular oder evtl. application-objekt (messages...nur eine spontane idee)), da es sonst
AV's hagelt...
ich mach das über meinen Einstellungsdialog (das mainform), wenn das erstellt wird, wird einfach ein timer gestartet, welcher die anderen forms neu erstellt (nicht gerade die sauberste Variante aber eine bessere ist mir noch nicht eingefallen bzw. fehlt momentan die Zeit alles umzustricken), da im moment des Aufbaus der Einstellungsdialog noch aktiv ist.
hier die relevanten Prozeduren:
Delphi-Quellcode:
//damit die angehängten Objekte nicht freigegeben werden
procedure TForm_DFMMain.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
var p:integer;
s:string;
begin
if assigned(node.Data) and not Recreate then
begin
//OutputDebugString(Pchar(node.text+' will be freed'));
TDataRec(node.Data).Free;
end;
if isObject(node) then
begin
p:=pos(' ',node.text);
s:=copy(node.text,p+1,length(node.text)-p);
p:=CB_Objects.Items.IndexOf(s);
if p>-1 then CB_Objects.Items.Delete(p);
end;
end;
//die funktionen zum neuerstellen der Forms
procedure RecreateMainForm;
var ms:TMemorystream;
sl:TStringlist;
tn:TTreenode;
begin
ms:=TMemoryStream.Create;
ms.WriteComponent(Form_DFMMain.TreeView1);
ms.position:=0;
sl:=TStringlist.create;
sl.Assign(Form_DFMMain.CB_Objects.Items);
Form_DFMMain.Free;
Application.CreateForm(TForm_DFMMain,Form_DFMMain);
ms.ReadComponent(Form_DFMMain.TreeView1);
tn:=Form_DFMMain.TreeView1.Items.GetFirstNode;
if assigned(tn) then
tn.Expand(false);
Form_DFMMain.CB_Objects.Items.Assign(sl);
Form_DFMMain.Show;
sl.Free;
ms.free;
end;
procedure RecreateForms;
begin
Form_DFMOptions.Free;
Application.CreateForm(TForm_DFMOptions,Form_DFMOptions);
Form_DFMAbout.Free;
Application.CreateForm(TForm_DFMAbout,Form_DFMAbout);
Form_DFMAdd.Free;
Application.CreateForm(TForm_DFMAdd,Form_DFMAdd);
Form_DFMChooseRes.Free;
Application.CreateForm(TForm_DFMChooseRes,Form_DFMChooseRes);
Form_DFMInspector.Free;
Application.CreateForm(TForm_DFMInspector,Form_DFMInspector);
end;
brauchst also schon ne gute Begründung, warum es nicht geht
Gruß Frank