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 Forms zur Laufzeit (https://www.delphipraxis.net/16883-forms-zur-laufzeit.html)

Hansa 24. Feb 2004 23:49


Forms zur Laufzeit
 
Hi,

ich soll zur Laufzeit einen Haufen Forms erzeugen. Jetzt fällt mir auf, daß ich dann jeden Button auch neu erzeugen muß. Kann ich nicht eine Form erzeugen und bestücken und sie trotzdem erst zur Laufzeit erzeugen ?

Robert_G 25. Feb 2004 00:20

Re: Forms zur Laufzeit
 
Wenn du eine Form im Designer erzeugst und nicht in die AutoCreate-Liste nimmst (das meintest du doch oder?) wird sie doch bei...

TFormIrgendWas.Create(Self);

... mit allem Drumrum erzeugt oder ist es gerade zu spät für mein gemartertes Hirn? :freak:

Bit Juggler 25. Feb 2004 00:23

Re: Forms zur Laufzeit
 
Hi,
wenn ich Dich nicht falsch verstanden habe dann meinst Du wohl das:

Delphi-Quellcode:
procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
  Form1:= TForm1.Create(Self);
  try
    Form1.ShowModal //ShowModal weil sich die Form sonst sofort wieder schließt
  finally
    FreeAndNil(Form1)
  end
end;
Vorher musst Du aber noch unter Projekt -> Optionen -> Formulare die Formulade die Du wie oben beschrieben erzeugen willst von der Sparte "Automatisch erzeugen" zur Sparte "Verfügbare Formulare" verschieben!

Gruß Bit

grayfox 25. Feb 2004 00:34

Re: Forms zur Laufzeit
 
hallo bit!

Zitat:

ShowModal weil sich die Form sonst sofort wieder schließt
es funktioniert trotzdem mit form.show, sofern du formstyle auf fsStayOnTop setzt

mfg, stefan

bundy 25. Feb 2004 00:35

Re: Forms zur Laufzeit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
uses unit2; {form2}


procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm2.Create(self) do
begin
Show;
end;
end;


funtioniert so :thuimb:
Kannst nun soviele Forms aufrufen (erzeugen) wie du willst.

Hansa 25. Feb 2004 19:11

Re: Forms zur Laufzeit
 
Habe jetzt alle im Moment vorhandenen Forms dynamisch erzeugt. Allerdings habe ich sie nicht verschoben oder sonst etwas an den Optionen geändert, sondern sie in der DPR einfach gelöscht.

Das funktioniert insofern auch. Aber wie lange ? Wenn ich eine Form mit
Delphi-Quellcode:
MyForm.create (self);
erzeuge und sie dann schließe, was ist dann damit ? Klicke ich auf einen Button und habe diesen Code im OnClick-Ereignis drin stehen, so wird die Form neu erzeugt. Jetzt schließe ich die Form und klicke wieder auf den Button, dann lande ich ja wieder bei dem Code. Ist Delphi so schlau, das Formular selber freizugeben, wenn es geschlossen wird ?

Laut OH soll man am besten try...finally benutzen, sofern in dem Formular eine Exception ausgelöst wird. Schön und gut, aber was wenn nicht ? Also: wodurch und wann wird der reservierte Speicher aus dem create wieder freigegeben ?

Robert_G 25. Feb 2004 19:40

Re: Forms zur Laufzeit
 
In den meisten meiner Anwendungen nutze ich MDI. Da werden ständig Formulare erzeugt und freigegeben.
Da ich eigentlich auch User dieser Programme bin, kann ich dir als Erfahrungbericht sagen:
Hast du im OnClose-Event "Action:= caFree;" dann ist das Ding weg.
Eine App habe ich den ganzen Tag nebenher offen und da werden täglich hunderte von Forms erzeugt und freigegeben. Die Speichernutzung steigt aber nicht mit der Zeit
-> Ich denke also, dass da auch alles mit weggeputzt wird!

Hansa 25. Feb 2004 20:25

Re: Forms zur Laufzeit
 
Das OnClose ist im Moment aber noch leer. Mir kommt es so vor, daß die Forms automatisch freigegeben werden. Wie ermittele ich für solch einen Fall eigentlich den Speicher ? 8) Kleiner Test würde ja schon genügen. :gruebel:

Sanchez 25. Feb 2004 20:41

Re: Forms zur Laufzeit
 
Wenn OnClose leer ist, werden sie beim Schließen nicht freigegeben.
Wenn der Owner freigegeben wird gibt der auch das Form mit frei. Vermutlich ist der Owner das Hauptformular.
Insofern du nicht
Delphi-Quellcode:
  TEinForm.Create(nil);
sagst musst du dich auch nicht selbst um die Freigabe kümmern.

grüße, daniel

Hansa 25. Feb 2004 20:55

Re: Forms zur Laufzeit
 
So ungefähr sieht das jetzt aus:

[/delphi]
var
MyForm: TMyForm;

implementation

procedure TMyForm.lblAusgClick(Sender: TObject);
begin
inherited;
MyForm:= TMyForm.Create(self);
MyForm.Show;
end;[delphi]

gekmihesg 25. Feb 2004 22:14

Re: Forms zur Laufzeit
 
hi ich mach grad genau ds gleiche und ich kann dir mit sicherheit sagen das die nicht richtig weg sind wenn man einfach nur close; verwendet.
sag im onClose-Event Action:=caFree; dann isses 100% weg.

Hansa 25. Feb 2004 23:16

Re: Forms zur Laufzeit
 
Zitat:

Zitat von gekmihesg
...und ich kann dir mit sicherheit sagen das die nicht richtig weg sind...dann isses 100% weg.

Woher weißt Du das so genau und schreibst nicht den Grund hin :?: So stehe ich im Dunkeln. 8)

Bit Juggler 25. Feb 2004 23:28

Re: Forms zur Laufzeit
 
Hi Hansa,
hier mal ein Auszug aus der Delphi Hilfe :


TCustomForm.OnClose


Das Ereignis OnClose wird beim Schließen des Formulars ausgelöst.

type
TCloseAction = (caNone, caHide, caFree, caMinimize);

TCloseEvent = procedure(Sender: TObject; var Action: TCloseAction) of object;

property OnClose: TCloseEvent;

Beschreibung

Mit OnClose können Sie spezielle Verarbeitungen durchführen, wenn das Formular geschlossen wird. Sie können in der zugehörigen Ereignisbehandlungsroutine beispielsweise prüfen, ob in allen Feldern eines Dateneingabeformulars gültige Eingaben vorgenommen wurden.

Ein Formular wird geschlossen, nachdem die Methode Close aufgerufen oder im Systemmenü die Option Schließen gewählt wurde.

Der Typ TCloseEvent zeigt auf eine Methode, die für das Schließen des Formulars zuständig ist. Der Parameter Action bestimmt, ob das Formular tatsächlich geschlossen wird. Er kann die folgenden Werte annehmen:

Wert Bedeutung

caNone Das Formular darf nicht geschlossen werden, daher geschieht nichts.
caHide Das Formular wird nicht geschlossen, sondern lediglich verborgen. Die Anwendung kann nach wie vor auf das Formular zugreifen.
caFree Das Formular wird geschlossen und sein Speicher freigegeben.
caMinimize Das Formular wird nicht geschlossen, sondern als Symbol angezeigt.

Um das Formular in einer Ereignisbehandlungsroutine für OnClose zu schließen und freizugeben, setzen Sie Action auf caFree.

Hinweis

Beim Beenden der Anwendung tritt das Ereignis OnClose nur im Hauptformular, aber nicht in den untergeordneten Formularen auf.


Gruß Bit

Hansa 26. Feb 2004 02:33

Re: Forms zur Laufzeit
 
Hi,

die von mir initiierten 2 Threads haben nicht unbedingt etwas miteinander zu tun. Der dritte enthält nur eine Fortsetzung von mir (der Suche zu verdanken). Um dynamisch erzeugte Forms geht es nur hier. Der Rest hat was mit dem Speicherverbrauch zu tun.

Aber es heißt ja immer: neue Frage neuer Thread. 8) Dieser Schuß kann auch nach hinten los gehen. :lol:

Jetzt egal. Mir stellt sich die Frage jetzt nämlich genau anders rum. Warum soll ich die Forms überhaupt dynamisch erstellen ?? Tue ich das nicht, werden sie am Anfang erzeugt und sind eben da. Dadurch habe ich den Nachteil, der in meiner Testreihe erkennbar ist, nämlich nicht: Fehleranfälligkeit, wegen eventuell vergessener Form-Freigaben, dadurch Zeitverlust bei jedem Create und die EXE wird wohl auch schon größer. Das wäre alles weg.

Tausende neu erzeugte Forms haben bisher nichts ausgemacht. Wozu also das ganze ? Wohlgemerkt, das ist nicht allgemeingültig ! Bei mir ist die Maximalanzahl der Forms genau definiert. Über die benötigte Anzahl hinaus, kommt keine mehr dazu !! ca. 300 werden es aber wohl werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:25 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-2025 by Thomas Breitkreuz