AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia FreePascal Bitmap mehrmals neu aus Datei laden

Bitmap mehrmals neu aus Datei laden

Ein Thema von TForm1 · begonnen am 25. Nov 2015 · letzter Beitrag vom 26. Nov 2015
Antwort Antwort
TForm1

Registriert seit: 11. Jan 2014
128 Beiträge
 
FreePascal / Lazarus
 
#1

Bitmap mehrmals neu aus Datei laden

  Alt 25. Nov 2015, 18:22
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:
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;
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...
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 FActKeyedFrame:=BufferBitmap; Könnte da der Fehler liegen?

Danke schonmal!
Der Fehler sitzt immer vor dem Computer...
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#2

AW: Bitmap mehrmals neu aus Datei laden

  Alt 25. Nov 2015, 19:07
Problem ist jetzt, dass das Programm sich immer bei FActKeyedFrame.Clear aufhängt, bzw der Debugger eine falsche Speicherzugriff- Exception schmeißt.
FActKeyedFrame ist ein TBitmap?
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.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Bitmap mehrmals neu aus Datei laden

  Alt 25. Nov 2015, 19:28
Um das Bild zu löschen kannst du auch Bitmap := nil schreiben.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Bitmap mehrmals neu aus Datei laden

  Alt 25. Nov 2015, 19:37
Die Bitmap FActKeyedFrame ist bereits instanziert und wurde zu Beginn von einer anderen Bitmap geladen also FActKeyedFrame:=BufferBitmap; Könnte da der Fehler liegen?
Ja, denn so schickst du die Instanz ins MemLeak-Nirwana.
Delphi-Quellcode:
// 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(...);
darum
Delphi-Quellcode:
// Instanz erzeugen
FActKeyedFrame := TBitmap.Create;
// Instanz-Werte zuweisen
FActKeyedFrame.Assign( BufferBitmap );
Um das Bild zu löschen kannst du auch Bitmap := nil schreiben.
Nein, einfach so geht das nicht. Das geht nur, wenn es sich bei Bitmap um eine Eigenschaft handelt und der Setter der Eigenschaft diese nil -Zuweisung entsprechend behandelt.
Delphi-Quellcode:
procedure TFoo.SetBitmap( const Value : TBitmap );
begin
  if Assigned( Value ) then
    FBitmap.Assign( Value )
  else
    FBitmap.Clear;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (25. Nov 2015 um 19:43 Uhr)
  Mit Zitat antworten Zitat
TForm1

Registriert seit: 11. Jan 2014
128 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Bitmap mehrmals neu aus Datei laden

  Alt 25. Nov 2015, 19:46
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?
Der Fehler sitzt immer vor dem Computer...

Geändert von TForm1 (25. Nov 2015 um 19:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Bitmap mehrmals neu aus Datei laden

  Alt 25. Nov 2015, 20:01
FActKeyedFrame habe ich vorher instanziert und dann zugewiesen, muss das also mit Assign() erfolgen?
Nur zum Verständnis:
Delphi-Quellcode:
// 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
Oder im realen Leben:
  • Ich baue ein Haus und die Adresse schreibe ich auf einen Zettel
  • Ich überschreibe den Zettel mit der Adresse von Peter
  • Peter reißt sein Haus ab
  • Ich ziehe in das Haus ein, dessen Adresse ich auf meinem Zetttel stehen habe
Frage: Ich welches Haus ziehe ich jetzt konkret ein?

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?
  • Ich baue ein Haus und die Adresse schreibe ich auf einen Zettel
  • Ich baue mein Haus um, so dass es wie das Haus von Peter aussieht
  • Peter reißt sein Haus ab
  • Ich ziehe in das Haus ein, dessen Adresse ich auf meinem Zetttel stehen habe
und dieses umbauen, dass es so aussieht wie geht mit einem TBitmap so
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (25. Nov 2015 um 20:06 Uhr)
  Mit Zitat antworten Zitat
TForm1

Registriert seit: 11. Jan 2014
128 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Bitmap mehrmals neu aus Datei laden

  Alt 25. Nov 2015, 20:31
Ah Super ja genau das Verständnis wie eine solche Zuweisung funktioniert, fehlte mir noch.

Jetzt klappts vielen Dank!
Der Fehler sitzt immer vor dem Computer...
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Bitmap mehrmals neu aus Datei laden

  Alt 25. Nov 2015, 22:01
Zitat:
.. Nein, einfach so geht das nicht. Das geht nur, wenn es sich bei Bitmap um eine Eigenschaft handelt und der Setter der Eigenschaft diese nil -Zuweisung entsprechend behandelt ..
A ja, stimmt. Mit TPicture verwechsel. Sorry.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#9

AW: Bitmap mehrmals neu aus Datei laden

  Alt 26. Nov 2015, 05:53
Oder – der Vollständigkeit halber – anders ausgedrückt:
  • Mit Assign erhältst du eine eigenständige Kopie; das Bitmap wird physisch kopiert in einen eigenen Speicherbereich.
  • Mit der Zuweisung via := wird lediglich die Speicheradresse, an der das Bitmap beginnt, zugewiesen. bzw. kopiert. Du hast danach also zwei Variablen (Zeiger), die auf dasselbe Bitmap zeigen. Löschst du jetzt den Speicherbereich, zeigt auch der zweite Zeiger ins Daten-Nirwana.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:48 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