AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherprobleme !!!

Ein Thema von max666 · begonnen am 11. Sep 2004 · letzter Beitrag vom 11. Sep 2004
Antwort Antwort
max666

Registriert seit: 21. Dez 2003
50 Beiträge
 
#1

Speicherprobleme !!!

  Alt 11. Sep 2004, 12:25
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

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

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Speicherprobleme !!!

  Alt 11. Sep 2004, 12:29
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
max666

Registriert seit: 21. Dez 2003
50 Beiträge
 
#3

Re: Speicherprobleme !!!

  Alt 11. Sep 2004, 12:39
Hallo!

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

Mit

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
  Mit Zitat antworten Zitat
woki

Registriert seit: 29. Mär 2003
563 Beiträge
 
Delphi 2006 Architect
 
#4

Re: Speicherprobleme !!!

  Alt 11. Sep 2004, 12:49
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Speicherprobleme !!!

  Alt 11. Sep 2004, 12:49
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
max666

Registriert seit: 21. Dez 2003
50 Beiträge
 
#6

Re: Speicherprobleme !!!

  Alt 11. Sep 2004, 12:54
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Speicherprobleme !!!

  Alt 11. Sep 2004, 13:33
Du zerstörst ja wohl auch nicht den Besitzer oder? Und wie stellst du fest, dass der Speicher nicht freigegeben wird?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#8

Re: Speicherprobleme !!!

  Alt 11. Sep 2004, 14:11
Also ich habe gerade mal meinen kompletten "C:\Programme" Ordner (rekursiv) als Menü eingelesen und dann wieder mit
menu.items.clear; freigegeben. Der Speicher scheint wieder freigegeben zu werden: Im Taskmanager stehen erst 3MB, dann nach erzeugen 8MB, nach freigeben wieder 3MB.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Speicherprobleme !!!

  Alt 11. Sep 2004, 14:14
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:20 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