原則として、ハードコードされた型ではなくConst(型なし)パラメーターを利用することにより、ポインターを使用する際の多くの古典的な設計トラップを回避しました。これにより、技術的な詳細をコンパイラに任せながら、高度なグラフィカル関数を実行する際の速度が向上します。また、DelphiとFree Pascalで同じコードを最小限の変更で簡単に使用できるようになりましたが、最近、Delphiの進化に関するEmbarcaderoの大げさな発言と、今後の安全モデルのために、これに疑問を呈し始めました。
たとえば、次の例を考えてみましょう。
Type TSomeDataProc = procedure (const aInput;var aOutput) of Object;
(* Convert 8-bit pixel to 16-bit pixel *)
Procedure TMyClass.ProcessSomeData08x565(Const aInput;var aOutput);
var r,g,b: Byte;
Begin
FPalette.ExportTriplets(Byte(aInput),r,g,b);
Word(aOutput):=(R SHR 3) SHL 11 or (G SHR 2) SHL 5 or (B SHR 3);
End;
(* Convert 16-bit pixel to 24-bit pixel *)
Procedure TMyClass.ProcessSomeData565x888(Const aInput;var aOutput);
Begin
With TRGBTriple(aOutput) do
Begin
rgbtRed:=(((word(aInput) and $F800) shr 11) shl 3);
rgbtGreen:= (((word(aInput) and $07E0) shr 5) shl 2);
rgbtBlue:= ((word(aInput) and $001f) shl 3);
end;
End;
現在、同じ宣言を持つ2つのプロシージャがありますが、それらはピクセルデータを非常に異なる方法で処理します。これにより、ルックアップテーブルを使用して正しい「コンバーター」メソッドを取得できるという利点があります。これは、コンストラクターで、または次のように画像ビットマップが割り当てられている場所で実行する必要があります。
Private
FLookup: Array[pf8bit..pf32bit,pf8bit..pf32bit] of TSomeDataProc;
Procedure TMyClass.Create;
Begin
Inherited;
FLookup[pf8bit,pf16bit]:=ProcessSomeData08x565;
FLookup[pf16bit,pf24Bit]:=ProcessSomeData565x888;
end;
ピクセルを変換する必要があるときはいつでも、正しい方法を調べてそれを使用するだけです。構文はすべてのプロシージャで同じです。したがって、各プロシージャが「どのように」動作するかを心配する必要はありません。私たちのクラスに関する限り、それらはすべて同じように見えます。
Procedure TMyClass.ConvertTo(aFormat:TpixelFormat);
Begin
// Get function for the correct pixel converter
FConvertProc:=FLookup[CurrentFormat,aFormat];
//Use the pixel converter
FConvertProc(GetSourcePixelAddr(x,y),GetTargetPixelAddr(x,y));
end;
問題は次のとおりです。この種の型キャスト(例:Const to Byteまたは定義されたレコードタイプ)は64ビットでも存続しますか?個人的にはその理由はわかりませんが、Embarcaderoは新しい「安全」モデルとポインターの使用に関して漠然としているため、将来のためにコードを保護するのは少し難しいと思います。