Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Speicherprobleme !!! (https://www.delphipraxis.net/29589-speicherprobleme.html)

max666 11. Sep 2004 11:25


Speicherprobleme !!!
 
Hallo!

Ich wollte ein kleines Programm schreiben, mit dem ich Dateien auslesen und zu einem Menü generieren lassen wollte. Das klappt auch alles, nur leider muss ich feststellen, dass mit jedem Menüaufruf, Speicher verlosen geht.

In der Procedure zur Erzeugung des Menüs werden mit

Delphi-Quellcode:
"MI:=TMenuItem.Create(OMI);"
die Menüeinträge erzeugt.
Normalerweise muss man mit "Create" erzeugte Object mit "Free" wieder freigeben (Beispiel 2), um SPeicher wieder frei zu geben. Aber dann werden alle Menüeinträge zerstört und ich erhalte kein Menü.

Weiß jemand, wie ich den belegten Speicher der Menüeinträge wieder frei bekomme.


Beispiel 1: (Ohne MI.Free)
Delphi-Quellcode:
procedure TForm1.getprogdir(OMI: TMenuItem; path: string);
var
  MI: TMenuItem;
  searchrec: TSearchRec;
begin
with ProgrammMenu do begin
BeginUpdate;
if findfirst(path + '*.*', faDirectory, searchrec) = 0 then repeat
if (searchrec.Attr and faDirectory)<>16 then begin
  MI:=TMenuItem.Create(OMI);
  MI.Caption:=andererName(searchrec.Name);
  MI.ImageIndex:=Getimageindex(path + searchrec.Name);
  MI.Tag:=-1;
  MI.Hint:=path + searchrec.Name;
  MI.OnClick := OpenFile;
  OMI.add(MI);
  end;
  until findnext(searchrec)<>0;
findclose(searchrec);
endupdate;
end;
end;

Beispiel 2: (Mit MI.Free) funktionert nicht
Delphi-Quellcode:
procedure TForm1.getprogdir2(OMI: TMenuItem; path: string);
var
  MI: TMenuItem;
  searchrec: TSearchRec;
begin
with ProgrammMenu do begin
BeginUpdate;
if findfirst(path + '*.*', faDirectory, searchrec) = 0 then repeat
if (searchrec.Attr and faDirectory)<>16 then begin
  MI:=TMenuItem.Create(OMI);
  MI.Caption:=andererName(searchrec.Name);
  MI.ImageIndex:=Getimageindex(path + searchrec.Name);
  MI.Tag:=-1;
  MI.Hint:=path + searchrec.Name;
  MI.OnClick := OpenFile;
  OMI.add(MI);
  MI.free;
  end;
  until findnext(searchrec)<>0;
findclose(searchrec);
endupdate;
end;
end;

Sharky 11. Sep 2004 11:29

Re: Speicherprobleme !!!
 
Hai max666,

wenn ich das richtig sehe erzeugst Du jedesmall die TMenuItems neu?
Du musst natürlich vorher die schon erzeugten Menüpunkte wieder freigeben.

max666 11. Sep 2004 11:39

Re: Speicherprobleme !!!
 
Hallo!

Die Menü-Items werden an einer TMenu-Componente überbegen.

Mit

Delphi-Quellcode:
menu.Items.Clear
versuche ich an anderer Stelle die TMenuItems wieder frei zu geben.

Die Items die an Menu übergeben werden, werden dennoch nicht freigegeben.

Für einen Tip, wie ich sie nach dem Schließen des Menüs wieder frei bekomme, wäre ich dankbar!


Gruß
Max666

woki 11. Sep 2004 11:49

Re: Speicherprobleme !!!
 
Hi,

so wie ich das sehe, gibst du entweder die Menueeinträge nie, oder sofort wieder frei. Du darsft die Menueeinträge natürlich erst dann wieder frei geben, wenn du sie nicht mehr brauchst. Und solange verbrauchen sie auch Speicher.

Grüsse
Woki

Luckie 11. Sep 2004 11:49

Re: Speicherprobleme !!!
 
Du hast doch einen Owner angeben beim Erzeugen. Du musst dich also um nichts kümmern. Der Speicher wird automatisch freigegeben, wenn der Besitzer bei Programmende zerstört wird.

max666 11. Sep 2004 11:54

Re: Speicherprobleme !!!
 
Der Besitzer ist eine VCL-TMenu-Componente mit dem Namen (Menu).

Wenn das Menü geschlossen wird, rufe ich

Menu.items.clear;

auf. Aber der Speicher wird nicht frei gegeben.

Luckie 11. Sep 2004 12:33

Re: Speicherprobleme !!!
 
Du zerstörst ja wohl auch nicht den Besitzer oder? Und wie stellst du fest, dass der Speicher nicht freigegeben wird?

scp 11. Sep 2004 13:11

Re: Speicherprobleme !!!
 
Also ich habe gerade mal meinen kompletten "C:\Programme" Ordner (rekursiv) als Menü eingelesen und dann wieder mit
Delphi-Quellcode:
menu.items.clear;
freigegeben. Der Speicher scheint wieder freigegeben zu werden: Im Taskmanager stehen erst 3MB, dann nach erzeugen 8MB, nach freigeben wieder 3MB.

Luckie 11. Sep 2004 13:14

Re: Speicherprobleme !!!
 
Der Taskmanager ist da sehr unsicher. Um nicht immer wieder neuen Speicher bei Windows anfordern zu müssen, gibt der Speichermanager von Delphi einmal benutzten und wieder freigegebenen Speicher nicht unbedingt wieder an Windows zurück.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:47 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