![]() |
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:
die Menüeinträge erzeugt.
"MI:=TMenuItem.Create(OMI);"
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; |
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. |
Re: Speicherprobleme !!!
Hallo!
Die Menü-Items werden an einer TMenu-Componente überbegen. Mit
Delphi-Quellcode:
versuche ich an anderer Stelle die TMenuItems wieder frei zu geben.
menu.Items.Clear
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 |
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 |
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.
|
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. |
Re: Speicherprobleme !!!
Du zerstörst ja wohl auch nicht den Besitzer oder? Und wie stellst du fest, dass der Speicher nicht freigegeben wird?
|
Re: Speicherprobleme !!!
Also ich habe gerade mal meinen kompletten "C:\Programme" Ordner (rekursiv) als Menü eingelesen und dann wieder mit
Delphi-Quellcode:
freigegeben. Der Speicher scheint wieder freigegeben zu werden: Im Taskmanager stehen erst 3MB, dann nach erzeugen 8MB, nach freigeben wieder 3MB.
menu.items.clear;
|
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 14:06 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