Kupodivu mne stále ještě něco napadá, takže opět pár dalších poznámek. Dnes to bude zmínka o 64bit assembleru, FireMonkey, memory manageru, linkování COFF v Delphi a CnWizards. A na závěr kousek elegantního kódu.
FireMonkey a ClipChildren
Mám rád FireMonkey - podle mne je to velmi zajímavá platforma s velkým potenciálem. Má sice mouchy (i když se postupně odstraňují - např. zrychlení iOS aplikací v update 1), ale myšlenka je jasná. Přesto mne některé věci překvapují a tím nemyslím přejmenování některých Caption na Text (proč? a když tak proč ne všude?). Ale například toto:
Mějme PaintBox na formuláři (zároveň si ukážeme jak se liší kreslení od VCL):
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
R: TRectF;
begin
Canvas.Clear(claBlue);
Canvas.Stroke.Color := TAlphaColors.Red;
Canvas.StrokeThickness := 1;
Canvas.Stroke.Kind := TBrushKind.bkSolid;
Canvas.StrokeDash := TStrokeDash.sdSolid;
Canvas.Fill.Kind := TBrushKind.bkSolid;
Canvas.Fill.Color := TAlphaColors.Aliceblue;
with PaintBox1 do
R := RectF(0, 0, Max(Width, Height), Max(Width, Height));
FitRect(R, PaintBox1.LocalRect);
Canvas.Fill.Color := TAlphaColors.Gold;
Canvas.FillEllipse(R, PaintBox1.AbsoluteOpacity);
Canvas.DrawEllipse(R, PaintBox1.AbsoluteOpacity);
end;
a pokud to spustíme, máme pokreslený celý formulář, nikoliv jen PaintBox. Klíčové je totiž nastavení property PaintBox.ClipChildren, která je podle mne nelogicky def. nastavená False. Jejím nastavením na True dostaneme požadované - tj. pokreslený PaintBox.
Letem webem
O tom, že Delphi XE2 umí linkovat COFF objektové soubory z VC++, jsem se již myslím zmiňoval. Normálně Delphi používá OMF (Object File Format) pro obj soubory. Ale obě verze XE2 (tj. 32bit i 64bit) nově umožňují i COFF - což výrazně zjednoduší život uživatelům XE2, na druhou stranu to možná zkomplikuje život u předchozích verzí.
Pěkné ukázky použití jsou zde: Using COFF C object files with Delphi X2
Allen Bauer napsal pokračování svého úvodu do 64bit ASM v Delphi - tentokrát o direktivách usnadňujících předávání parametrů pro 64bit - ono 64bit Windows ABI (Application Binary Interface) je trošku maso. Doporučuji si nejméně zapamatovat .NOFRAME. Tato direktiva zamezí generování rámce zásobníku pro "slepé funkce", tj. pro funkce, které už nic nevolají. V 64bit ABI musí mít totiž jinak každá funkce rámec zásobníku, pro zajištění korektního generování výjimek (resp. doufám že je to pro to). Ale pro slepé funkce je to zbytečné a zdržující - proto ta direktiva, která to vynutí. Kompilátor to většinou pozná - ale prý může nastat situace (někde jsem i viděl nějaký příklad), kdy to nepoznal - takže tímto mu pomůžete.
Porovnání Memory Managerů použitelných v Delphi - závěr je, že pro single thread (nebo s málo vlákny) aplikace je opravdu nejlepší FastMM (pro neznalé použijte tagy dole), pro více vláknové to je komplikovanější. Původní správce ze starších Delphi (tj. <D2006) se už ani neúčastnil, protože je opravdu už zastaralý. Zajímavé, že byl testován i ten z MSVCRT nebo co používá FireFox a obojí bylo horší.

Poslední CnWizards přidávají pěkný editor TImageList, který zároveň obsahuje volitelně vyhledávač ikon.
Kód na dobrou noc (sice ne Delphi, ale i tak pěkný):
function R(a,i,j,m,g){for(i=80;a[i];i--||+a);
for(m=10;g=a[i]=--m;g&&R(a))
for(j in a)g*=a[j^i==j]^m||i/9^j/9&&i%9^j%9&&i/27^j/27|i%9/3^j%9/3}
zdroj: Barry Kelly twitter (mimochodem jeden z R&D Delphi).
Vůbec nevím co to dělá a nemám odvahu to zkusit. Doufám, že jen to není část Delphi kompilátoru. Přiznám se, že klidně by to mohlo být napsané i japonsky a výsledek by byl stejný.