![]() |
Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach Ende
Hallo zusammen :hi:
Sorry für den Titel...Ist vielleicht etwas undeutlich formuliert. Ich hab da ein Problem. Ich hab zwar schon die DP durchsucht und die OH bemüht, aber leider nix passendes gefunden. Also Da mir der Standard MessageDlg nicht gefällt, wollte ich mir selber einen machen. Ich wollte das so machen, dass ich dann in ein anderes Programm einfach die Unit einbinde und dann über eine Funktion einen Rückgabewert erhalte. Soweit so gut. Ich erstelle also ein dynamisches Form und zwei dynamische Buttons, denen ich jeweils eine andere Prozedure zuweise (Hab dazu was im Forum gefunden). Nun ja, das funzt auch alles ganz prächtig, nur wird irgendwie anscheinend der Speicher nicht ganz freigegeben. Soll heißen, ich rufe die Funktion aus einem anderen Formular auf => es erscheint der Dialog mit dem dyn. erzeugten Form => ich klicke auf "Ja" oder "Nein" und dann schließt sich das Fenster auch und gibt den Korrekten Wert zurück. Aber im Taskmanager bleibt auch nach dem Schließen des Dialogs der Speicherverbrauch der Anwendung gleich :?: Also ich meine, zuerst hat die Anwendung zu, Beispiel 2.800 K und ab dem Aufruf des Dialogs dann 2.844. Beim nächsten Aufruf des Dialogs wird es entsprechend mehr. Kann mir da wer weiterhelfen? Mein Code is der folgende. Hab ich vielleicht irgendwas falsch freigegeben? Danke schon mal. Man liest sich, Stanlay :hi:
Delphi-Quellcode:
procedure SetNo(Sender: TObject);
procedure SetYes(Sender: TObject); function JesOrNo: Boolean; procedure QuestionForm; implementation var Form : TForm; BtnYes : TButton; BtnNo : TButton; Bool : Boolean; procedure QuestionForm; begin Form := TForm.Create(nil); With Form do begin Caption := 'Möchten Sie den Button sichtbar lassen?'; Width := 500; Height := 250; Left := Screen.WorkAreaWidth div 2 - Width div 2; Top := Screen.WorkAreaHeight div 2 - Height div 2; end; BtnYes := TButton.Create(Form); With BtnYes do begin Parent := Form; Width := 50; Height := 25; Left := Form.Width div 2 - Width div 2 - Width; Top := Form.Height div 2 - Height div 2 - Height; Caption := 'Ja'; @OnClick := @SetYes; end; BtnNo := TButton.Create(Form); With BtnNo do begin Parent := Form; Width := 50; Height := 25; Left := Form.Width div 2 - Width div 2 + Width; Top := Form.Height div 2 - Height div 2 - Height; Caption := 'Nein'; @OnClick := @SetNo; end; Form.ShowModal; end; procedure SetNo(Sender: TObject); begin Bool := false; Form.Close; end; procedure SetYes(Sender: TObject); begin Bool := true; Form.Close; end; function JesOrNo: Boolean; begin QuestionForm; JesOrNo := Bool; BtnYes.Destroy; BtnNo.Destroy; Form.Destroy; end; |
Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E
Statt Form.Close; benutze Form.Free;
...:cat:... |
Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E
Hallo. Danke für die Anwtort. Das hatte ich auch schon überlegt. Allerdings habe ich dann folgendes Problem. Das Form ist zwar dann wech...aber ich komme auch nicht mehr an das Formular, von dem aus ich es aufgerufen habe. Das is sozusagen "Disabled". Das könnte evtl daran liegen, dass ich es ja mit "ShowModal" aufgerufen habe.
|
Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E
Öffne den Dialog mehrmals und schau wie sich dann der Speicher entwickelt.
Manchmal bleiben Handles für die spätere Verwendung erhalten. Desweiteren...
Delphi-Quellcode:
Oder sauberer...
function JesOrNo: Boolean;
begin QuestionForm; FreeAndNil(Form); // Zerstört rest mit end;
Delphi-Quellcode:
Sieht doch einfache aus...
function JesOrNo: Boolean;
implementation function JesOrNo: Boolean; begin Form := TForm.Create(nil); With Form do begin Caption := 'Möchten Sie den Button sichtbar lassen?'; Width := 500; Height := 250; Left := Screen.WorkAreaWidth div 2 - Width div 2; Top := Screen.WorkAreaHeight div 2 - Height div 2; end; BtnYes := TButton.Create(Form); With BtnYes do begin Parent := Form; Width := 50; Height := 25; Left := Form.Width div 2 - Width div 2 - Width; Top := Form.Height div 2 - Height div 2 - Height; Caption := 'Ja'; ModalResult := mrYes; // <--- NEU end; BtnNo := TButton.Create(Form); With BtnNo do begin Parent := Form; Width := 50; Height := 25; Left := Form.Width div 2 - Width div 2 + Width; Top := Form.Height div 2 - Height div 2 - Height; Caption := 'Nein'; ModalResult := mrNo; end; Result := Form.ShowModal = mrYes; Form.Free; end; Man hätte haber Liebe die Sache OOP-mäßig lösen sollen... [edit=Christian Seehase]Schliessendes Delphi-Tag korrigiert. Mfg, Christian Seehase[/edit] |
Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E
Hallo. Danke für deine Antwort. Du meinst also, dass das ganz normal ist, wenn da was im Speicher bleibt....hmm, das wäre natürlich gut, weil dann hätte ich nix falsch gemacht. Ich weiß natürlich, dass der Code noch nicht der schönste ist, aber das war nur so ne Idee auf die Schnelle. Danke aber für deine Verbesserungsvorschläge. Ich hoffe das es jetzt mit FreeAndNil() funzt. Danke schon mal und ich meld mich wieder, wenn noch was nicht geht.
Man liest sich, Stanlay :hi: |
Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E
Moin Stanlay,
ich kann nur nachvollziehen, dass sich der Speicherbedarf einmalig erhöht. Das passiert auch, wenn Du mit ShowMessage eine Meldung ausgibst, oder ein zur Entwurfszeit erstelltes Formular anzeigen lässt. Ich hätte allerdings noch ein paar Vorschläge für Deine Routine. Wenn Du Die Button mit
Delphi-Quellcode:
erzeugst, sparst Du Dir die Variablen. Da der Owner angegeben wird, werden die Button automatisch freigegeben, wenn der Owner zerstört wird.
with TButton.Create(Form) do
Du kannst Dir auch die beiden OnClick Routinen sparen, wenn Du statt dessen bei den Button die Eigenschaf ModalResult entsprechend setzt. Ausserdem solltest Du in der Prozedur QuestionForm nur das Formular erzeugen, aber nicht anzeigen lassen. Die Funktion JesOrNo (warum eigentlich mit J? ;-) ) könnte dann so aussehen:
Delphi-Quellcode:
function JesOrNo: Boolean;
begin QuestionForm; JesOrNo := Form.ShowModal = mrYes; FreeAndNil(Form); end; |
Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E
1. Das mit dem 'J'es is schon ziemlich perinlich :oops: Das schlimme is, ich habs nicht nur einmal, sondern immer falsch geschrieben :wall:
2. Danke für den Vorschlag. Ich werd das gleich mal einbauen und schauen obs geht (natürlich wird das funktionieren, kommt ja nicht von mir :oops: Die frage is nur, ob ichs fertig bring) Man liest sich, Stanlay :hi: |
Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E
Moin Stanlay,
neolithos sieht ja fast genauso aus, wie meiner. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:28 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 by Thomas Breitkreuz