Loading the app’s icon into a TImage on Windows

  

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.

Comments are closed.