![]() |
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 ? |
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: |
Re: Forms zur Laufzeit
Hi,
wenn ich Dich nicht falsch verstanden habe dann meinst Du wohl das:
Delphi-Quellcode:
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!
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; Gruß Bit |
Re: Forms zur Laufzeit
hallo bit!
Zitat:
mfg, stefan |
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. |
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:
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 ?
MyForm.create (self);
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 ? |
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! |
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:
|
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:
sagst musst du dich auch nicht selbst um die Freigabe kümmern.
TEinForm.Create(nil);
grüße, daniel |
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] |
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. |
Re: Forms zur Laufzeit
Zitat:
|
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 |
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