![]() |
Png im TImage: Konversion von D2006 auf D2009 schlägt fehl
Hi DPler,
mal ein interessantes Problem: Ich lade ein Projekt von D2006 in D2009 und verliere alle TImage Bilder - sprich diese sind wieder leer. Bei den Bildern handelt es sich um PNGs. Nun habe ich mir mal die DFM vor und nach dem Konvertieren angesehen: In D2006 fängt Picture.Data so an: 0A54504E474F626A656374, danach dann das PNG 89504E470D0A1A0A0000000D49484452000000200000... Wenn ich jetzt das Bild manuell in TImage unter Delphi 2009 lade, fängt Picture.Data so an: 0954506E67496D616765, danach geht es 100% identisch zu D2006 weiter. Warum es danach identisch ist, ist klar: Es folgen die Hex-Binärdaten des PNG. Das muß ja identisch sein. Ich gehe jetzt davon aus, daß CG hier etwas am TImage gedreht hat, was dazu führt, daß meine Images nicht mehr geladen werden können. Warum weicht der TImage.Picture.Data Header hier ab? Ist dies jemandem anderes schon aufgefallen? Insbesondere wenn Ihr auch zuvor schon PngImage genutzt habt? Gruß Assertor |
Re: Png im TImage: Konversion von D2006 auf D2009 schlägt fe
Zitat:
0954506E67496D616765 bedeuted 'TPngImage' Also hat Borland den Classennamen intern geändert und nicht bedacht, dass dies deinen beschriebenen Nebeneffekt hat. |
Re: Png im TImage: Konversion von D2006 auf D2009 schlägt fe
Hi sx2008,
Zitat:
Hmm, dann werd ich mal versuchen schnell einen Wrapper zu schreiben. Gruß und Danke! Assertor |
Re: Png im TImage: Konversion von D2006 auf D2009 schlägt fe
Hi,
ich habe das gerade eben mal probiert mit einem "Wrapper" à la
Delphi-Quellcode:
Das klappt aber leider nicht so einfach: Die Klasse wird korrekt registriet, denn es steht danach im D2009 TImage Picture-Dialog 2x PNG als Dateitype zur Auswahl und beim 2. auch der Text mit "Compatibility Wrapper".
type
TPngObject = type TPngImage; initialization TPicture.RegisterFileFormat('PNG', 'Portable Network Graphics (Compatibility Wrapper)', TPngObject); finalization TPicture.UnregisterGraphicClass(TPngObject); Die vorhandenen PNGs in den TImages aus D2006 werden jedoch noch immer geleert. Soweit ich es verstanden habe, fügt ja Delphi in den Binärdaten im DFM als Prefix den Klassennamen (und die Länge des Namens davor) ein. Hier sollte eigentlich bei korrekt registrierter TPngObject-Klasse ja auch das Laden klappen... Hat noch jemand eine Idee? Gruß Assertor |
Re: Png im TImage: Konversion von D2006 auf D2009 schlägt fe
Zitat:
Wenn du einen anderen Klassennamen willst, dann geht das nur so:
Delphi-Quellcode:
TPngObject = class(TPngImage);
|
Re: Png im TImage: Konversion von D2006 auf D2009 schlägt fe
Schreib dir doch einfach ein Tool, das diese Zeichenfolge in deinen DFMs ersetzt.
|
Re: Png im TImage: Konversion von D2006 auf D2009 schlägt fe
Hi,
Zitat:
Und für alle, die mal vor dem gleichen Problem stehen: Der Klassenname ist auch Case-Sensitiv, also TPngObject != TPNGObject für die DFM Daten ;) Ich hatte zuerst in D2009 nun 0A54506E674F626A656374 statt 0A54504E474F626A656374 raus. Da hat Delphi natürlich recht ;) Leider hat CodeGear in der neuen PngImage.pas
Delphi-Quellcode:
gesetzt.
type
TPNGObject = TPngImage deprecated 'Use TPngImage.'; Damit muß man entweder einen Wrapper nutzen, oder alle PNG-Daten in den DFMs manipulieren. Gruß Assertor @NamenLozer: Die Idee ist natürlich gut - hatte ich auch schon überlegt. Ich wollte nur dem Problem gerne auf den Grund gehen und auch einen "Live-Fix" haben. An sich müsste es ja auch mehr Delphi Programmierer geben, die in Forms schon früher PNGs hatten ;) |
Re: Png im TImage: Konversion von D2006 auf D2009 schlägt fe
Folgende Zeilen an geeigneter Stelle führen zum Erfolg:
Delphi-Quellcode:
Die Neudeklaration von TPNGObject ist notwendung, um die deprecated Declaration von CodeGear zu überschreiben, ansonsten wird TPNGObject nicht erkannt (danke Andreas!). Die beiden Leerstrings (eigentlich nur der erste) verhindern eine Doppelauflistung der Extension im Filterstring.
type
TPNGObject = class(TPngImage); begin TPicture.RegisterFileFormat('', '', TPNGObject); end. Auf Anregung von Assertor habe ich mir erlaubt, den Fix in die ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:26 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 by Thomas Breitkreuz