Thema: Delphi Form refreshen

Einzelnen Beitrag anzeigen

Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#8

Re: Form refreshen

  Alt 16. Apr 2007, 01:23
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
  Mit Zitat antworten Zitat