Delphi-PRAXiS

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 Form refreshen (https://www.delphipraxis.net/90352-form-refreshen.html)

Fridolin 15. Apr 2007 20:36


Form refreshen
 
Nabend,

hab mal wieder ne dumme Frage und zwar:

wie stellt man es an, das ich per buttonklick mein form wieder in die ausgangssituation bringe(keine checkbox angeklickt, nichts in combobox ausgewählt, etc.)?

Danke schonmal

Mfg

Fridolin

mr47 15. Apr 2007 20:38

Re: Form refreshen
 
Das wirst du wohl "von Hand" machen müssen und jedes Steuerelement einzeln so zurücksetzen, wie du's gern hättest.

Fridolin 15. Apr 2007 20:40

Re: Form refreshen
 
:wiejetzt:

Da muss es doch ne Möglichkeit geben...

mkinzler 15. Apr 2007 20:41

Re: Form refreshen
 
Vielleicht durch Freigeben und Neuerzeugen der Form. (Nur sinnvoll bei sehr vielen Komponenten)

Fridolin 15. Apr 2007 20:57

Re: Form refreshen
 
Naja geht auch nicht. trotzdem danke.

SirThornberry 15. Apr 2007 21:04

Re: Form refreshen
 
geht nicht? Ist keine besonders gute Fehlerbeschreibung!
Generell funktioniert das!

mkinzler 15. Apr 2007 21:05

Re: Form refreshen
 
Zitat:

Naja geht auch nicht.
Warum nicht?

_frank_ 16. Apr 2007 01:23

Re: Form refreshen
 
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 :P

Gruß Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz