Pokud vytvoříte FireMonkey aplikaci a chcete ji přenést na cizí Mac, tak to není tak jednoduché jako na Windows. Můžete použít platform assistant (PA) od Embarcadera nebo free nástroj bundler (přečtete si readme), který vytvoří zip, který OSX umí rozeznat. Platform assistant, který je součástí instalace XE2 slouží primárně k ladění a není určen k distribuci na zákazníkův počítač.
Ale pozor, je zde pár záludností a jednou z nich je deploy dialog - bez něj se nepohnete.
Spustíte ho Project - Deployment. Z mně neznámého důvodu v současné verzi jsem potřeboval kliknout na ikonu Revert to default ať se tam všechny soubory přidají (je to ta zeleno červená ikona vedle comboboxu) a dejte uložit projekt, ať je dostupný pro bundler. Nezapomeňte překládat Release verzi. Kromě programu se tam nejméně přidá i libcgunwind.1.0.dylib, což je knihovna která pomáhá zpracování výjimek, resp. odvíjení zásobníku při výjimce - aspoň si to myslím - protože jak Linux, tak BSD (tj. OSX) nemá přímo podporu výjimek jako MS Windows - Mac OS X Exception Handling od Eli Boling, který má na starosti přímo Delphi pro Mac (resp. jeden z nich) a mimochodem jeden ze zakládajících členů Kylix teamu.
Ale zpět.
Následně pokud používáte uvedený nástroj ho zavoláte z menu nástroje (kde byl předtím podle readme přidán) a on vám vytvoří zip se soubory co potřebuje OSX. Ten zip funguje jako by virtual folder, tj. jeho obsah je následně OSX přidán do systému jako "disk".
Po poklikání na něj OSX Váš program zpřístupní. A pokud máte reálný Mac tak by to mělo fungovat. Ve VmWare fungují bez problémů pouze console aplikace. Pokud má někdo tip jak na VmWare (novou verzi 8 jsem nezkoušel) tak sem s tím. Ono to podle všeho ve VmWare opravdu nefunguje - ale třeba někdo můj návod upřesní.
Update: Postup pro VMWare - pro původní XE2 bez update
Pro VMWare (emulace HW grafiky ve VMWare není úplně dokonalá) je nutné upravit kód v FMX.Filter.pas a upravenou jednotku dát do projektu - díky Leoši za tip:
function FilterByName(const AName: string): TFilter;
var
i: Integer;
begin
Result := nil;
if Filters = nil then
Exit;
if GlobalUseHWEffects then
begin
for i := 0 to Filters.Count - 1 do
if CompareText(TFilterClass(Filters.Objects[i]).FilterAttr.Name, AName) = 0
then
begin
Result := TFilterClass(Filters.Objects[i]).Create;
Exit;
end;
end;
end;
function FilterClassByName(const AName: string): TFilterClass;
var
i: Integer;
begin
Result := nil;
if Filters = nil then
Exit;
if GlobalUseHWEffects then
begin
for i := 0 to Filters.Count - 1 do
if CompareText(TFilterClass(Filters.Objects[i]).FilterAttr.Name, AName) = 0
then
begin
Result := TFilterClass(Filters.Objects[i]);
Exit;
end;
end;
end;
Navíc v dpr nastavte GlobalUseHWEffects := False; To platí jen ale pro VmWare.