Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Merkwürdigkeit bei TBitmap
GuaAck - Do 13.09.12 13:51
Titel: Merkwürdigkeit bei TBitmap
Hallo,
ich habe folgende Merkwürdigkeit, die ich nicht verstehe:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| mybitmap :=TBitmap.create; mybitmap.loadfromresource(... Bild_1 ...); stretchblt(... von mybitmap.canvas auf ein Bitmap_1.canvas....);
mybitmap.loadfromresource(... Bild_2 ...); stretchblt(... von mybitmap.canvas auf ein Bitmap_2.canvas....); |
Merkwürdigerweise enthält dann Bitmap_2 auch das Bild_1 und nicht wie beabsichtigt Bild_2. Wenn ich nach dem ersten stretchblt einfüge:
Delphi-Quelltext
1: 2: 3: 4:
| ... mybitmap.free; mybitmap :=TBitmap.create; .... |
dann läuft es, Bild_2 ist also wirklich in der Resource vorhanden und kann geladen werden.
Hat da jemand eine Erklärung? Kann man eine Bitmap nicht neu laden?
Gruß
GuaAck
Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 13.09.2012 um 14:47
Narses - Do 13.09.12 14:56
Moin!
GuaAck hat folgendes geschrieben : |
Hat da jemand eine Erklärung? Kann man eine Bitmap nicht neu laden? |
Habe gerade keine Zeit im Quelltext zu wühlen, aber ich vermute mal, dass beim .LoadFromResource() nicht wirklich ein weiteres Bitmap erzeugt wird, sondern nur das Handle der Resourcen-Version gesetzt wird. :idea:
cu
Narses
GuaAck - Fr 14.09.12 19:47
Hallo Nurse,
kann schon sein, das da nur ein Handle gesetzt wird. Aber trotzdem wäre zu erwarten, dass eben für Bild_2 nur ein neues Handle kopiert wird. Dann sollte das strechblt trotzdem Bild_2 kopieren. Stretchblt kopiert ja auf jeden Fall, denn das Bild wird ja in der Größe verändert.
Gruß
GuaAck
mandras - Fr 14.09.12 21:39
Ich kann keine zuverlässige Erklärung bieten aber:
LoadFromRessourceID/Name verwendet intern LoadFromStream.
Und diese Funktion ist zumindest unter D6 buggy wie ich einmal leider feststellen mußte (Es ging um den Austausch von Bildern in Quickreports, also ähnliche Situation: Vorhandenes Bitmap muß ersetzt werden).
Im XE2 habe ich noch nicht nachgesehen.
Im Netz fand ich einige Workaraounds die aber nicht generell funktionierten, es hängt von der Farbtiefe ab, ob Windows/OS2-Bitmap, ob komprimiert.
Da ich nicht zu viele Stunden verwenden wollte hab ich es für den damaligen Einsatz für einen Typ einer Farbtiefe hinbekommen.
Zusammenfassend würde ich empfehlen nicht zu viel darüber nachzudenken sondern vor Wiederverwendung die Bitmap neu erzeugen (Free/Create) :)
Sollte hier aber jemand genau wissen wie das LoadFromStream in D6 gepatcht werden kann wäre ich auch an einer Lösung interessiert.
GuaAck - Fr 14.09.12 22:38
Hallo Mandras,
vielen Dank, von D6 nach D7 kann der Bug ja durchaus erhalten geblieben sein. Jedenfalls unterstützt mich Deine Erfahrung darin, es einfach bei dem zwischen geschobenen free/create zu belassen. Habe mir den Tipp gleich in der Hilfe als Notiz vermerkt, und hoffentlich denke ich bei der nächsten Anwendung daran.
Danke also und schönes Wochenende
GuaAck
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!