AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach Ende

Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach Ende

Ein Thema von Stanlay Hanks · begonnen am 9. Okt 2003 · letzter Beitrag vom 9. Okt 2003
Antwort Antwort
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#1

Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach Ende

  Alt 9. Okt 2003, 15:38
Hallo zusammen

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

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;
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E

  Alt 9. Okt 2003, 15:40
Statt Form.Close; benutze Form.Free;

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E

  Alt 9. Okt 2003, 15:47
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.
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#4

Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E

  Alt 9. Okt 2003, 15:53
Ö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]
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E

  Alt 9. Okt 2003, 16:02
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E

  Alt 9. Okt 2003, 16:07
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

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;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Stanlay Hanks
Stanlay Hanks

Registriert seit: 1. Mär 2003
2.078 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E

  Alt 9. Okt 2003, 17:03
1. Das mit dem 'J'es is schon ziemlich perinlich Das schlimme is, ich habs nicht nur einmal, sondern immer falsch geschrieben

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 Die frage is nur, ob ichs fertig bring)

Man liest sich, Stanlay
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Dynamisch erzeugt - Aber Speicherverbrauch bleibt nach E

  Alt 9. Okt 2003, 18:01
Moin Stanlay,

neolithos sieht ja fast genauso aus, wie meiner.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 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