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 Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach Ende (https://www.delphipraxis.net/10009-dynamisch-erzeugt-aber-speicherverbrauch-bleibt-nach-ende.html)

Stanlay Hanks 9. Okt 2003 14:38


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;

sakura 9. Okt 2003 14:40

Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E
 
Statt Form.Close; benutze Form.Free;

...:cat:...

Stanlay Hanks 9. Okt 2003 14:47

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.

neolithos 9. Okt 2003 14:53

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:
function JesOrNo: Boolean;
begin
  QuestionForm;
  FreeAndNil(Form); // Zerstört rest mit
end;
Oder sauberer...

Delphi-Quellcode:
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;
Sieht doch einfache aus...

Man hätte haber Liebe die Sache OOP-mäßig lösen sollen...

[edit=Christian Seehase]Schliessendes Delphi-Tag korrigiert. Mfg, Christian Seehase[/edit]

Stanlay Hanks 9. Okt 2003 15:02

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:

Christian Seehase 9. Okt 2003 15:07

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:
with TButton.Create(Form) do
erzeugst, sparst Du Dir die Variablen. Da der Owner angegeben wird, werden die Button automatisch freigegeben, wenn der Owner zerstört wird.

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;

Stanlay Hanks 9. Okt 2003 16:03

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:

Christian Seehase 9. Okt 2003 17:01

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 01:53 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