Converting to D2009: How to keep PNGs in TImage
Hi,
if you have been using Gustavo Daud’s PNGImage before and consider migrating existing projects to D2009 you must keep in mind that you will loose all previously assigned PNGs in your TImages.
As you all know Delphi 2009 ships with native PNG support but there are some differences. In PngImage.pas CodeGear declared
type TPNGObject = TPngImage deprecated 'Use TPngImage.';
So the classname for PNGs changed and the old one is marked as deprecated.
The problem: All TImage pictures are stored within the form’s .DFM file. Before inserting the binary data the IDE stores the classname (and it’s length) as a prefix to the data.
When using Gustavo’s component in D2006 it will store 0A54504E474F626A656374 which is in ASCII TPNGObject (the 1st 0A is the length of the following classname). In Delphi 2009 it stores 0954506E67496D616765 which is in ASCII TPngImage (again 09 is the length).
So when opening an existing form in D2009 the IDE searches for TPNGObject classname and as it cannot find it anymore the images are emptied.
With the help of Andreas Hausladen I came up with a solution for this:
PngClassWrapper.pas
{$IFDEF VER200}
uses
Classes, Graphics, PngImage;
type
TPngObject = class(TPngImage);
{$ENDIF}
implementation
{$IFDEF VER200}
initialization
TPicture.RegisterFileFormat('PNG', 'Portable Network Graphics (Compatibility Wrapper)', TPngObject);
finalization
TPicture.UnregisterGraphicClass(TPngObject);
{$ENDIF}
After discussing the issue Uwe Raabe yesterday published a fix inside of the PngComponents for Delphi 2009.
He used:
type
TPNGObject = class(TPngImage);
begin
TPicture.RegisterFileFormat('', '', TPNGObject);
end.
The empty strings will help to hide the wrapper from the FileOpen Dialog within the filter selection in the IDE.
An updated version if his port of the PngComponents for D2009 is available at CG:
PngComponents for Delphi 2009
Btw: The PngComponents Uwe published is still compatible with older Delphi Versions (tested with Delphi 2006). Only the PngImage Gustavo previously released on SourceForge is not available anymore as the license has been revoked as D2009 now ships with an enhanced version of it.


Thanks for this article. I would like someone to elaborate on the implications for us all of “open source” type licences being revoked. What implication does it have for existing users who do not upgrade and what impications are there in general for any “open source” software /source code you might have downloaded from source forge or other sites if a company can come along and buy up the rights to the software. Thanks, Richard
Hi Richard,
> Thanks for this article.
You’re welcome!
I generally agree with your thoughts about open source licenses being revoked.
As far as I know regarding PNGImage there are two things to mention:
1) PngImage was never really “open source” but had been released under some kind of proprietary freeware license in the past. So there might be a difference for the latter – but this is also depending on user’s legislation.
2) I have been told that CodeGear still allows usage of existing copies. Publishing the library itself is not allowed anymore. They are actually trying to remove existing copies on the Internet (e.g. the message posted at Microsoft’s CodePlex http://www.codeplex.com/PNGImage).
An interesting aspect is the release of open source applications being developed in Delphi. As a fact the same happened to the TntUnicode components as Troy gave (sold) them to TMS Software: Imagine the well-known MySQL Admin Tools. It has been open source, written in Delphi and it used TntUnicode. And then? There are still copies of TntUnicode available but the license has been revoked in a comparable way – only Troy and/or TMS are not trying to remove them from the Internet…
Best regards
Arvid
Hi Arvid,
After I read your article, I am excited and downloaded the PngComponents for D2009. But I have no luck installing it’s packages (*.dpk).
When I use D2009 install package, it said invalid package.
How did you install it? Could you please share?
Thanks.
Hi Steve,
I don’t see such problems here. Be sure to use Uwe’s Version from http://cc.codegear.com/Item/26127.
Then first compile PngComponents.dpk and afterwards compile and install the design-time package called PngComponentsDesign.dpk. Both files are located in the \PackagesD2009 folder of PngComponents.
Feel free to post your full error message here!
Regards,
Arvid
Thank you…
I have this problem: when I try to load PNG Image (TPngBitBtn & TPngSeepdButton) I get this error:
Invalid graphic format
[20AE8998]{designide120.bpl} PicEdit.TGraphicProperty.Edit (Line 272, “PicEdit.pas” + 10) + $12
+ $11
+ $A
+ $0
+ $FFFB
[207ABC62]{coreide120.bpl} PropInsp.TPropertyInspector.PropListEditDblClick (Line 883, “PropInsp.pas” + 20) + $5
[20BA7451]{vclide120.bpl} IDEInspListBox.TInspListBox.DoEditDblClick (Line 976, “IDEInspListBox.pas” + 2) + $A
[20BA91E7]{vclide120.bpl} IDEInspListBox.TInspListBox.ListButtonClick (Line 1665, “IDEInspListBox.pas” + 2) + $2
[501C5BC3]{vcl120.bpl } Controls.TControl.Click (Line 6758, “Controls.pas” + 9) + $8
[20B9E306]{vclide120.bpl} IDEListBtns.TListButton.WMLButtonUp (Line 582, “IDEListBtns.pas” +
[501C565A]{vcl120.bpl } Controls.TControl.WndProc (Line 6642, “Controls.pas” + 91) + $6
[10F43BE9]{cxLibraryD12.bpl} Cxcontainer.TcxCustomInnerListBox.CNDrawItem + $691
[50006D40]{rtl120.bpl } System.TObject.GetInterface (Line 10013, “System.pas” +
[501C95F3]{vcl120.bpl } Controls.TWinControl.IsControlMouseMsg (Line 9121, “Controls.pas” + 1) + $9
[501C9CE7]{vcl120.bpl } Controls.TWinControl.WndProc (Line 9336, “Controls.pas” + 136) + $6
[501C9400]{vcl120.bpl } Controls.TWinControl.MainWndProc (Line 9065, “Controls.pas” + 3) + $6
[500591DC]{rtl120.bpl } Classes.StdWndProc (Line 12703, “Classes.pas” +
[50062E92]{rtl120.bpl } Contnrs.TComponentList.GetItems (Line 380, “Contnrs.pas” + 1) + $4
[501EEABD]{vcl120.bpl } Forms.TApplication.ProcessMessage (Line 9660, “Forms.pas” + 30) + $1
[501EEB02]{vcl120.bpl } Forms.TApplication.HandleMessage (Line 9690, “Forms.pas” + 1) + $4
[501EEE2D]{vcl120.bpl } Forms.TApplication.Run (Line 9827, “Forms.pas” + 26) + $3
[004259DA]{bds.exe } bds.bds (Line 198, “” +
Hi Daniel,
> Thank you…
You’re welcome!
> I have this problem: when I try to load PNG Image (TPngBitBtn &
> TPngSeepdButton) I get this error:
> Invalid graphic format
Looks like you have another package conflicting with the PNG format used by the Speed and BitBtn. Probably something e.g. from DevExpress or Envision which registered their own PNG handler.
I worked around such issues by manually editing the DFM source and replacing the header mentioned above to fit “TPngImage”.
Try with a clean D2009 installation. It will work!
Cheers,
Arvid
Im having issues installing this into Delphi 2009 as well. Its a fresh install with only a couple of additional packages that I have added (in house built ones).
I open up the first PngComponents.dpk file, compile it and then open up the second, compile it, but then I can’t get any further as I get an error message…
[DCC Fatal Error] PngComponentsDesign.dpk(34): E2202 Required package ‘PngComponents’ not found
Hi,
@Leaky
I verified the download from CodeCentral (http://cc.embarcadero.com/Item/26127) and didn’t encounter such issues.
Before the Designtime Package can be installed you need to build the Runtime Package – like you did. Did you receive any errors or messages on building the Runtime Package (PngComponent.dpk)?
Anyway I am quite sure this is not related to the component package provided by Uwe Raabe as this is basic Delphi IDE behaviour…
Good luck, and feel free to post or mail your results back!
Best regards,
Arvid
Hi and thanks for your work, I’m trying to upgrade my app from D7 to D2009, and I encounter a problem with PngComponent. I have installed your fixed version which works well at design time (I haven’t lost any image or imagelist), but some EReadError exceptions are raised at runtime : ” EReadError : Bitmap property does not exist”. This occurs on the TPngImageList objects and when I look at dfm files I see a “Bitmap = {}” property at the end of my IL definition. I have tried to remove them manually but D2009 re-insert it as soon as I open my forms.
Any idea ?
Thanks for your GREAT work.
Solved my problem, an old version of PngComponent with a path pointing on it stayed in my folders. Sorry and thank you again for your work.
Hi Yann,
thank you for your feedback and your kind words! Good to hear that you had been able to solve the problem.
Cheers,
Arvid
I’m unable to add an item in the tpngbitbnt control
Invalig Graphic Format
[20DCC9A0]{designide140.bpl} PicEdit.TGraphicProperty.Edit (Line 272, “PicEdit.pas” + 10) + $12
+ $0
+ $12FFB
[03656F48]{PngComponentsDesign140.bpl} Pngcomponenteditors.TEditProperty.EnumProperty + $34
[20D99AC3]{designide140.bpl} DesignEditors.GetComponentProperties (Line 2645, “DesignEditors.pas” + 95) + $23
[03656EC5]{PngComponentsDesign140.bpl} Pngcomponenteditors.TEditProperty + $81
[03656B19]{PngComponentsDesign140.bpl} Pngcomponenteditors. + $0
[03656DE1]{PngComponentsDesign140.bpl} Pngcomponenteditors.TPngButtonEditor.ExecuteVerb + $31
[519EBCA2]{vcldesigner140.bpl} VCLSurface.TVclDesignSurface.ComponentVerb (Line 2503, “VCLSurface.pas” + 3) + $B
[502801CB]{vcl140.bpl } Menus.TMenuItem.Click (Line 2520, “Menus.pas” + 19) + $8
[50281787]{vcl140.bpl } Menus.TMenu.DispatchCommand (Line 3383, “Menus.pas” + 5) + $2
[50282966]{vcl140.bpl } Menus.TPopupList.WndProc (Line 4489, “Menus.pas” + 4) + $E
[501D2A86]{vcl140.bpl } Graphics.FreeMemoryContexts (Line 6935, “Graphics.pas” + 12) + $F
[50299D60]{vcl140.bpl } Controls.TWinControl.MainWndProc (Line 9540, “Controls.pas” + 3) + $6
[502828B5]{vcl140.bpl } Menus.TPopupList.MainWndProc (Line 4464, “Menus.pas” + 2) + $5
[50076360]{rtl140.bpl } Classes.StdWndProc (Line 13014, “Classes.pas” +
[502C8749]{vcl140.bpl } Forms.TApplication.ProcessMessage (Line 9784, “Forms.pas” + 30) + $1
[502C878E]{vcl140.bpl } Forms.TApplication.HandleMessage (Line 9814, “Forms.pas” + 1) + $4
[502C8AB9]{vcl140.bpl } Forms.TApplication.Run (Line 9951, “Forms.pas” + 26) + $3
[0043094A]{bds.exe } bds.bds (Line 200, “” +
Any idea?
After lots of experiments, I’ve fou the package that was confliting with the PNGComponents… GExperts!
I don’t know exactly why, but I’ll try to find out or contact them directly.
@João Santos
Hi João,
thank you for your comments. I didn’t experience such problems but I didn’t try PngComponents together with GExperts on D2010 yet – with D2009 it’s working fine here.
Have you tried a clean installation just with PngComponents to see if it works? And right after installing GExperts the TPngBitBtn fails?
Be sure to post a follow-up!
Cheers and good luck,
Arvid
Hi,
I can commit V1.33 of the GExperts for Delphi2010 cause the “Invalid Graphic Format” if installed. Uninstalling GExperts solves the problem.
@Harald Binkle
Uwe Raabe already mentioned something at his project page at the EDN. Hopefully he is able to sort it out together with the help of the GExpert component developers…
I’ve got the latest snapshot for GExperts from SVN
Built using D2010. It now works fine with PngComponents
Download instructions here
http://www.gexperts.org./devfaq.html
@MrCOLOMBO
Thank you very much for the feedback and pointing towards a solution!
Cheers,
Arvid