Last time I showed how to load the icon of an FMX for Android app into a TImage. In practice, a lot of the debugging of a Delphi mobile app is likely to be with a Win32 ‘mobile preview’ build though… in which case it would be useful to load the icon when running on Windows as well.
To do that, you need to first add a *.ico version to the project. This is done via Project Options: select the Application item on the left, then All configurations – 32 bit Windows platform from the combo box at the top. Probably stating the obvious, but the icon loaded here should be a .ico version of the .png files set up for Android.
Once done, the most direct equivalent of the Android code I presented previously would be to use the LoadIcon Windows API to load the icon, then GetIconInfo and so forth to get the bitmap bits to copy to a FMX bitmap. Easier is to use the VCL however – since Vcl.Graphics.pas doesn’t bring in anything else of the VCL, there’s little point in deliberately avoiding it. As such, here’s an expanded version of the code I presented last time with a VCL-based Windows implementation added:
unit AppIconLoader; interface uses System.SysUtils, System.Classes, FMX.Graphics; function GetAppIcon(Dest: TBitmap): Boolean; implementation uses {$IF DEFINED(ANDROID)} AndroidApi.JniBridge, AndroidApi.Jni.App, AndroidApi.Jni.GraphicsContentViewText, FMX.Helpers.Android, {$ELSEIF DEFINED(MSWINDOWS)} Vcl.Graphics, {$ENDIF} FMX.Surfaces; function GetAppIcon(Dest: FMX.Graphics.TBitmap): Boolean; {$IF DEFINED(ANDROID)} var Activity: JActivity; Drawable: JDrawable; Bitmap: JBitmap; Surface: TBitmapSurface; begin Result := False; Activity := SharedActivity; Drawable := Activity.getPackageManager.getApplicationIcon(Activity.getApplicationInfo); Bitmap := TJBitmapDrawable.Wrap((Drawable as ILocalObject).GetObjectID).getBitmap; Surface := TBitmapSurface.Create; try if not JBitmapToSurface(Bitmap, Surface) then Exit; Dest.Assign(Surface); finally Surface.Free; end; Result := True; end; {$ELSEIF DEFINED(MSWINDOWS)} var Icon: TIcon; Stream: TMemoryStream; begin Result := False; Stream := nil; Icon := TIcon.Create; try Icon.LoadFromResourceName(HInstance, 'MAINICON'); if Icon.Handle = 0 then Exit; Stream := TMemoryStream.Create; Icon.SaveToStream(Stream); Stream.Position := 0; Dest.LoadFromStream(Stream); finally Icon.Free; Stream.Free; end; Result := True; end; {$ELSE} begin Result := False; end; {$ENDIF} end.
![](http://stats.wordpress.com/b.gif?host=delphihaven.wordpress.com&blog=7665935&post=3134&subd=delphihaven&ref=&feed=1)