Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Prüfen, ob Bitmap leer ist ? (https://www.delphipraxis.net/72701-pruefen-ob-bitmap-leer-ist.html)

Martin K 5. Jul 2006 16:21


Prüfen, ob Bitmap leer ist ?
 
Ich weiß nicht ob meine Frage zu einfach ist, aber hab leider noch keine Lösung gefunden.

Ich will einfach nur überprüfen, ob ein Bitmap ein Bild enthält oder nicht.

Habe folgendes schon ausprobiert, leider ohne Erfolg :(

Delphi-Quellcode:
var Bitmap: TBitmap;

1. not Assigned(Bitmap)
2. Bitmap = nil
3. Bitmap.Empty
4. Bitmap.Width = 0
Leider bin ich so langsam am Ende mit meinem Latein und hoffe auf eure Hilfe...

Khabarakh 5. Jul 2006 16:24

Re: Prüfen, ob Bitmap leer ist ?
 
Alle vier sind richtig, wenn jeweils dein Code davor dazu passt. Soll heißen, dieser muss korrigiert werden, und dazu müssten wir ihn erst einmal kennen.

Martin K 5. Jul 2006 16:26

Re: Prüfen, ob Bitmap leer ist ?
 
Zitat:

Zitat von Khabarakh
Alle vier sind richtig, wenn jeweils dein Code davor dazu passt. Soll heißen, dieser muss korrigiert werden, und dazu müssten wir ihn erst einmal kennen.

Naja, das Bitmap "leere" ich mit:
Delphi-Quellcode:
Bitmap.FreeImage;
Eine andere Möglichkeit kenne ich nicht :?

markusj 5. Jul 2006 17:28

Re: Prüfen, ob Bitmap leer ist ?
 
<Müll>Dann machst du danach noch ein Bitmap := nil; und dann passt deine Abfrage ...</Müll>

mfG

Markus

EDIT: Müll korrigiert. Du musst nachdem du das Bitmap geleert hast, eine der Propertys, die du hinterher abfragen willst, auf den gewünschten Wert setzen. z.B. Bitmap.width := 0, danach zieht deine Abfrage dann ... ich kenne mich aber nicht so gut mit TBitmap aus ... es kann sein, dass dir TBitmap so eine Funktion gar nicht anbietet ...

Thorben77 5. Jul 2006 17:41

Re: Prüfen, ob Bitmap leer ist ?
 
Zitat:

Zitat von markusj
Dann machst du danach noch ein Bitmap := nil; und dann passt deine Abfrage ...

Aber auch nur die 1. und die 2. (Hat sich erledigt.)

Ich glaube das, was Du suchst, ist die 3. "Variante":

[oh]Mit Empty kann festgestellt werden, ob ein Bitmap in das Bitmap-Objekt geladen oder mit Hilfe der Eigenschaft Canvas gezeichnet wurde. Wenn das Bitmap-Objekt leer ist, d.h. das Bitmap-Objekt enthält kein Bitmap, hat Empty den Wert true, ansonsten false.[/oh]

Nachtrag:
Wenn man die Breite und Höhe auf 0 setzt, dann ist Empty false. Ich fänd's aber nicht so elegant, dann zu prüfen, ob die Breite/Höhe 0 ist, Empty ist "selbsterklärender".

Martin K 5. Jul 2006 17:52

Re: Prüfen, ob Bitmap leer ist ?
 
Erstmal danke für eure Antworten :thumb:

Ich könnte natürlich, überall wo ich mein Bitmap leere noch ein
Delphi-Quellcode:
Bitmap := nil;
//oder:
Bitmap.Width := 0;
dahinter setzten, das würde gehen...

Komisch ist nur, dass dies nicht automatisch geschieht.
Dachte mit Bitmap.FreeImage, würde ein Bitmap komplett geleert werden und ich hab wieder ein leeres Bitmap (so, wie wenn ich eines neu create).

Hab mal ein bisschen rumprobiert, anscheinend bewirkt Bitmap.FreeImage überhaupt nix.
Danach ist noch dasselbe Bitmap drin wie vorher...

Laut Delphi-Hilfe wird aber das ursprünglich geladene Bild aus dem Speicher freigegeben, nur Pixelformat und Farbtiefe kann erhalten bleiben.

Meine Frage:
Wie leert/löscht ihr Bitmaps ???

Werde es jetzt vielleicht so leeren:
(das Bitmap.FreeImage komplett weglassen)
Delphi-Quellcode:
Bitmap := nil;
Dann funktioniert wenigstens die zweite Abfrage ...

Thorben77 5. Jul 2006 17:56

Re: Prüfen, ob Bitmap leer ist ?
 
Zitat:

Zitat von Martin K
Werde es jetzt vielleicht so leeren:
Delphi-Quellcode:
Bitmap := nil;
Dann funktioniert wenigstens die zweite Abfrage ...

Wenn Du das umbedingt so machen willst, dann schreib wenigstens
Delphi-Quellcode:
FreeAndNil(BmpVariable);
Ansonsten dümpeln etliche nicht freigegebene TBitmap-Instanzen im Speicher rum.

Martin K 5. Jul 2006 18:01

Re: Prüfen, ob Bitmap leer ist ?
 
Zitat:

Zitat von Thorben77
Wenn Du das umbedingt so machen willst, dann schreib wenigstens
Delphi-Quellcode:
FreeAndNil(BmpVariable);
Ansonsten dümpeln etliche nicht freigegebene TBitmap-Instanzen im Speicher rum.

Ähhh... Nö!
Ich habe ja das Bitmap immer noch, es soll nur kein Bild enthalten :wink:

Habe die Bitmap-Variable global, und ganz am Ende wird sie auch selbstverständlich wieder freigegeben.

Okay, es gäbe natürlich noch diese Möglichkeit, aber sowas macht man IMO nicht:
(Bitmap freigeben und gleich danach wieder neu erstellen)
Delphi-Quellcode:
FreeAndNil(Bitmap);
Bitmap := TBitmap.Create;

Thorben77 5. Jul 2006 18:11

Re: Prüfen, ob Bitmap leer ist ?
 
Zitat:

Zitat von Martin K
Ähhh... Nö!

Ähhh... doch! :wink:

Mit
Delphi-Quellcode:
Bmp := nil
sagst Du, dass die Variable Bmp keiner Klasseninstanz mehr zugewiesen ist. Daher kannst Du auch später nicht mehr auf die Instanz zugreifen (und sie freigeben).

Free löst allerdings keinen Fehler aus, wenn die Variable auf keine Klasseninstanz mehr verweist.

Ergo:
Delphi-Quellcode:
FreeAndNil(BitmapVariable);

Martin K 5. Jul 2006 19:08

Re: Prüfen, ob Bitmap leer ist ?
 
Aber ich will doch, nachdem ich das Bitmap geleert habe, z.B. mit LoadFromFile wieder ein neues Bild dem Bitmap zuordnen können.
Nachdem ich das Bitmap aber mit FreeAndNil freigegeben habe, kann ich kein neues Bild mehr laden.

Ich veranschauliche mal das ganze Problem mit einer StringList anstatt einem Bitmap:
Delphi-Quellcode:
var SL: TStringList;
{...}

{Irgendwo wird die StringList erzeugt:}
SL := TStringList.Create;

{Dann wird etwas in die StringList geladen:}
SL.LoadFromFile('C:\test.txt');

{Der Inhalt der StringList wird gelöscht:}
SL.Clear; //genau das brauche ich fürs Bitmap!
//Bitmap := nil; wäre mein Vorschlag

{Es soll überprüft werden, ob die StringList leer ist:}
if SL.Count = 0 then //beim Bitmap wäre dass dann Bitmap = nil oder so

{Nachdem der Inhalt gelöscht ist, soll wieder Inhalt hinzugefügt werden:}
SL.LoadFromFile('C:\hallo.txt');

{Ganz zum Schluss wird freigegeben:}
FreeAndNil(SL);
[OT]
Was ist eigentlich besser:
Bitmap.Free;
FreeAndNil(Bitmap);
:?:
[/OT]

pacman1986 5. Jul 2006 19:10

Re: Prüfen, ob Bitmap leer ist ?
 
bitmap.free gibt den speicher frei er existiert aber freeandnil loescht direkt den inhalt.

Waldteufel 5. Jul 2006 19:12

Re: Prüfen, ob Bitmap leer ist ?
 
Hi Leute.

Zitat:

Zitat von pacman1986
bitmap.free gibt den speicher frei er existiert aber freeandnil loescht direkt den inhalt.

Nö! FreeAndNil löscht die Referenz auf den Speicher.

Martin K 5. Jul 2006 19:12

Re: Prüfen, ob Bitmap leer ist ?
 
Zitat:

Zitat von pacman1986
bitmap.free gibt den speicher frei er existiert aber freeandnil loescht direkt den inhalt.

Hmm...
Und was ist in der Praxis besser ?

xaromz 5. Jul 2006 19:32

Re: Prüfen, ob Bitmap leer ist ?
 
Hallo,
Zitat:

Zitat von Martin K
Hmm...
Und was ist in der Praxis besser ?

das kommt immer darauf an. Beide Befehle machen im Grunde das Selbe. Der einzige Unterschied ist, dass die Objektvariable bei FreeAndNil auf nil gesetzt wird, während sie bei .Free weiterhin auf den (nun nicht mehr benutzten) Speicher zeigt. Wenn Du also über eine Objektreferenz entscheiden willst, ob sich dahinter auch wirklich ein gültiges Objekt verbirgt, ist FreeAndNil die richtige Wahl.
Hier mal ein Beispiel:
Delphi-Quellcode:
Bitmap := TBitmap.Create;
Bitmap.Free;
if Assigned(Bitmap) then // Assigned sagt True, weil Bitmap <> nil
  Bitmap.Width := 10; // Hier kracht's
Delphi-Quellcode:
Bitmap := TBitmap.Create;
FreeAndNil(Bitmap);
if Assigned(Bitmap) then // Assigned sagt False, weil Bitmap = nil
  Bitmap.Width := 10; // Wird nie ausgeführt
Aber jetzt mal zurück zum Thema:
TBitmap.FreeImage macht genau das, was auch in der Hilfe steht: Es gibt Speicher frei, was sich auf das Bitmap auswirken kann. Ein solcher Aufruf löscht nicht das Bitmap.

Wenn ich ein Bitmap löschen möchte, gehe ich immer so vor:
Delphi-Quellcode:
OldHeight := Bitmap.Height;
Bitmap.Height := 0;
Bitmap.Height := OldHeight;
Damit sage ich dem TBitmap, dass es bitte ein neues Bitmap (Windows-Objekt, nicht Delphi-Objekt) anlegen soll. Leider gibt es keine fertige Funktion, die sowas macht.

Gruß
xaromz

Martin K 5. Jul 2006 19:40

Re: Prüfen, ob Bitmap leer ist ?
 
Danke für Deine Antwort :thumb:

Schade, dass es so eine Funktion nich in Delphi gibt.
Naja, dann mach ich es halt einfach so:
Delphi-Quellcode:
Bitmap.Width := 0;
Bitmap.Height := 0;
Warum dann wieder auf die alte Größe setzen :gruebel: ?
So funktioniert wenigestes die 4. Variante aus dem ersten Posting.

Thorben77 5. Jul 2006 19:48

Re: Prüfen, ob Bitmap leer ist ?
 
Zitat:

Zitat von Martin K
Warum dann wieder auf die alte Größe setzen :gruebel: ?

Die alte Göße musst Du nur setzen, wenn Du auf dem Canvas der Bitmap zeichnen willst und Du 'ne bestimmte Größe brauchst.

Zitat:

Zitat von Martin K
So funktioniert wenigestes die 4. Variante aus dem ersten Posting.

Bitmap.Empty (die 3. Variante) funktioniert, wenn beide Größenangaben 0 sind, aber auch wenn Du die Größe änderst, aber noch nichts gezeichnet hast. (Ich würde Empty auch Width = 0 vorziehen.)

Martin K 5. Jul 2006 21:12

Re: Prüfen, ob Bitmap leer ist ?
 
Danke nochmal für eure Antworten!

Das "leeren" des Bitmaps mache ich jetzt, indem ich die Breite und Höhe auf 0 setze.
Die alte Größe brauch ich nicht mehr, da ich nicht mit Canvas zeichne sondern mir eine neues Bitmap über eine der Bitmap.LoadFrom...-Methoden hole.

Das Überprüfen, ob das Bitmap leer ist, mache ich jetzt mit Bitmap.Empty.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:50 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