Autor Beitrag
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Do 13.09.12 13:51 
Hallo,

ich habe folgende Merkwürdigkeit, die ich nicht verstehe:

ausblenden 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:

ausblenden 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 user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 13.09.2012 um 14:47
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 13.09.12 14:56 
Moin!

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
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

_________________
There are 10 types of people - those who understand binary and those who don´t.
GuaAck Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 432
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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