![]() |
Bitmap mehrmals neu aus Datei laden
Hallo zusammen,
ich habe folgendes Problem und zwar lade ich eine Bitmap zunächst ganz normal mit .LoadFromFile() und möchte sie danach nochmal von einem anderen File laden.
Delphi-Quellcode:
Problem ist jetzt, dass das Programm sich immer bei FActKeyedFrame.Clear aufhängt, bzw der Debugger eine falsche Speicherzugriff- Exception schmeißt. Wenn ich mit Breakpoint Schritt für Schritt durchgehe meldet mir der Debugger: Cannot find bounds of current function...
procedure TMainController.loadKeyedFrame;
begin FActKeyedFrame.Clear; if not (FileExists(MainDirectoryPath+'keyed'+intToStr(FActFrameindex)+'.bmp')) then begin showmessage('Keyed Frames bitmap files existieren nicht'); exit; end; FActKeyedFrame.loadFromFile(MainDirectoryPath+'keyed'+intToStr(FActFrameindex)+'.bmp'); end; Wisst ihr warum dieser Fehler auftritt, bzw wie man das lösen kann? Die Bitmap FActKeyedFrame ist bereits instanziert und wurde zu Beginn von einer anderen Bitmap geladen also
Delphi-Quellcode:
Könnte da der Fehler liegen?
FActKeyedFrame:=BufferBitmap;
Danke schonmal! |
AW: Bitmap mehrmals neu aus Datei laden
Zitat:
Was genau ist "eine falsche Speicherzugriff- Exception"? An deinem Code kann ich keinen Fehler finden, zumal der Fehler ja bereits in der ersten Zeile entsteht, wie du schreibst. Bei Lazarus löscht TBitmap.Clear die Grafik und hinterläßt eine leere Grafik (TBitmap.Clear gibt's bei Delphi nicht, nur bei FMX). Was du sonst noch außerhalb dieser offenbarten Procedure machst, entzieht sich meiner Kenntnis. Der Fehler muß also irgendwo anders bereits passieren ... vermutlich löschst du irgendwo die Bitmap-Instanz, auf die du dann wieder zuzugreifen versuchst. |
AW: Bitmap mehrmals neu aus Datei laden
Um das Bild zu löschen kannst du auch Bitmap := nil schreiben.
|
AW: Bitmap mehrmals neu aus Datei laden
Zitat:
Delphi-Quellcode:
darum
// Instanz erzeugen
FActKeyedFrame := TBitmap.Create; // Instanz zuweisen FActKeyedFrame := BufferBitmap; // ei jo, die eben erzeugte Instanz dümpelt jetzt im Speicher rum ... und keiner weiß wo ... // BufferBitmap freigeben, die brauche ich ja nicht mehr, oder? FreeAndNil( BufferBitmap ); // rumms FActKeyedFrame.LoadFromFile(...);
Delphi-Quellcode:
// Instanz erzeugen
FActKeyedFrame := TBitmap.Create; // Instanz-Werte zuweisen FActKeyedFrame.Assign( BufferBitmap ); Zitat:
Delphi-Quellcode:
um eine Eigenschaft handelt und der Setter der Eigenschaft diese
Bitmap
Delphi-Quellcode:
-Zuweisung entsprechend behandelt.
nil
Delphi-Quellcode:
procedure TFoo.SetBitmap( const Value : TBitmap );
begin if Assigned( Value ) then FBitmap.Assign( Value ) else FBitmap.Clear; end; |
AW: Bitmap mehrmals neu aus Datei laden
Genau FActKeyedFrame ist ein TBitmap.
Mit falscher Speicherzugriff- Exception meine ich External: EXC_BAD_ACCESS Die BufferBitmap, die ich zu Anfang FActKeyedFrame zuweise, wird nach der Zuweisung tatsächlich gelöscht, aber das sollte doch keine Auswirkung auf FActKeyedFrame haben schließlich ist das eine eigene Instanz? Bevor ich die neue Bitmap lade speicher ich die alte über FActKeyedFrame.SaveToFile() ansonsten passiert eigentlich nichts mit dem Objekt, außer ein paar mal eine Abfrage von FActKeyedFrame.Width und .Height... @SirRufo: FActKeyedFrame habe ich vorher instanziert und dann zugewiesen, muss das also mit Assign() erfolgen? |
AW: Bitmap mehrmals neu aus Datei laden
Zitat:
Delphi-Quellcode:
Oder im realen Leben:
// Instanz erzeugen
// Referenz zur Instanz der Variable FActKeyedFrame zuweisen FActKeyedFrame := TBitmap.Create; // Referenz zur Instanz BufferBitmap der Variable FActKeyedFrame zuweisen FActKeyedFrame := BufferBitmap; // BufferBitmap wird nicht mehr benötigt BufferBitmap.Free; // Wir machen was mit unserer Bitmap FActKeyedFrame.LoadFromFile( ... ); // öh .... es rummst
Richtig! In gar kein Haus, denn wir haben die Adresse von Peters Haus und da gibt es kein Haus mehr! Aber wie denn dann richtig? Wie machen wir das im realen Leben?
Delphi-Quellcode:
so
TBitmap
Delphi-Quellcode:
// Instanz erzeugen
// Referenz zur Instanz der Variable FActKeyedFrame zuweisen FActKeyedFrame := TBitmap.Create; // Referenz zur Instanz BufferBitmap der Variable FActKeyedFrame zuweisen FActKeyedFrame.Assign( BufferBitmap ); // BufferBitmap wird nicht mehr benötigt BufferBitmap.Free; // Wir machen was mit unserer Bitmap FActKeyedFrame.LoadFromFile( ... ); // öh .... es rummst NICHT mehr |
AW: Bitmap mehrmals neu aus Datei laden
Ah Super ja genau das Verständnis wie eine solche Zuweisung funktioniert, fehlte mir noch.
Jetzt klappts vielen Dank!:thumb::-D |
AW: Bitmap mehrmals neu aus Datei laden
Zitat:
|
AW: Bitmap mehrmals neu aus Datei laden
Oder – der Vollständigkeit halber – anders ausgedrückt:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:15 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