![]() |
Ram voll :-(
Hallo,
beim mehrfachen ausführen folgender Prozedur wird der Speicher immer voller gepackt und dann gibt es nur noch Fehlermeldungen:
Delphi-Quellcode:
Habs auch schon so versucht:
procedure TGame.ComboBox1Change(Sender: TObject);
begin Image2.Picture.Bitmap.LoadFromFile(extractfilepath(paramstr(0))+'\Ressources\images\Player\'+ComboBox1.Text+'.bmp'); Image3.Picture.Bitmap:=split(Image2.Picture.Bitmap, 29, 34, 0, 0); Image11.Picture:=Image3.Picture; end;
Delphi-Quellcode:
Das gibt aber schon von anfang an einen Fehler.
procedure TGame.ComboBox1Change(Sender: TObject);
begin Image2.Picture.Free; Image2.Picture.Bitmap.LoadFromFile(extractfilepath(paramstr(0))+'\Ressources\images\Player\'+ComboBox1.Text+'.bmp'); Image3.Picture.Bitmap:=split(Image2.Picture.Bitmap, 29, 34, 0, 0); Image11.Picture:=Image3.Picture; end; Also weiß vielleicht einer wie ich das hinkriege, dass der Speicher immer wieder geleert wird? |
Re: Ram voll :-(
Delphi-Quellcode:
procedure TGame.ComboBox1Change(Sender: TObject);
begin Image2.Picture.Free; Image2.Picture.Bitmap.LoadFromFile(extractfilepath(paramstr(0))+'\Ressources\images\Player\'+ComboBox1.Text+'.bmp'); Image3.Picture.Bitmap:=split(Image2.Picture.Bitmap, 29, 34, 0, 0); Image11.Picture.Assign(Image3.Picture); end; |
Re: Ram voll :-(
Hmm das macht keinen Unterschied bleibt genau so.
|
Re: Ram voll :-(
Komisch :gruebel: Liegt das Speicherleck vielleicht an einer anderen Stelle des Programms? Mit FastMM4 oder einem anderen Memory Manager/Checker liesse sich das ganz einfach lokalisieren.
Nachtrag: ups. Da hab ich doch tatsächlich den falschen Code kopiert :ups: Das Image2.Picture.Free gehört da natürlich nicht hin, sonst zieht man dem Programm ja die Arbeitsgrundlage unter den Füssen weg. |
Re: Ram voll :-(
Ja im Taskmanager seh ich ja wie sich der Speicherverbrauch erhöht und immer wenn ich diese Funktion ausführe dann erhöht sich der Speicherverbrauch. Also kann der Fehler nur da liegen. Ich glaube der Fehler liegt genau an dieser Stelle:
Delphi-Quellcode:
Image2.Picture.Bitmap.LoadFromFile(extractfilepath(paramstr(0))+'\Ressources\images\Player\'+ComboBox1.Text+'.bmp');
|
Re: Ram voll :-(
Delphi-Quellcode:
procedure TGame.ComboBox1Change(Sender: TObject);
begin Image2.Picture.Free; // <--- ich glaub das ist das Problem. // Versuch mal das hier Image2.Picture := nil; // <--- intern wird der Rest durch die Setter-Methode der Property geregelt // [...] end; |
Re: Ram voll :-(
Moin Zusammen,
der Setter von Picture ruft intern nur Assign auf also:
Delphi-Quellcode:
@littleDave:
Image11.Picture:=Image3.Picture;
// macht das gleiche wie Image11.Picture.Assign(Image3.Picture); // man spart nur den Aufruf des Setters Wenn man nil zuweist, wird intern, im Prinzip, ein FreeAndNil durchgeführt, also nur wenig mehr als .Free. Beides gilt für D7 und D2006, wird also in D2005 auch so sein. |
Re: Ram voll :-(
Zitat:
Beim direkten aufruf von .Free zeigt der Klassenpointer immer noch auf den alten Speicherbereich, was eigentlich zu einer Zugriffsverletzung führen sollte :gruebel:. Ich würd die := nil-Variante vorziehen, da dann der Rest von der TImage-Komponente erledigt wird (bzw. werden sollte). |
Re: Ram voll :-(
Ich habe den Fehler gefunden lag an der Funktion Split.
|
Re: Ram voll :-(
Zitat:
Was war denn falsch? Vielleicht kann da noch jemand was draus lernen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 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