一般に、ハードコードされた型ではなくConst(型なし)パラメータを利用してポインタを使用すると、多くの古典的なデザイントラップを回避しています。これにより、高度なグラフィカル関数を実行しながら、技術的な詳細をコンパイラに任せることができます。また、DelphiとFree Pascalで同じコードを最小限の変更で簡単に使用できるようにしました。しかし、最近私はEmbarcaderoのDelphiの進化に関する声明文と、これからの安全モデルのために疑問を持ち始めました。例えばconstパラメータとtypecastingは以前と同じようにDelphi 64bitで動作しますか?
、次の例concider:
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)は、ウィル64の下で生き残りますか?私は個人的にはなぜそうではないのか分かりませんが、Embarcaderoは新しい "安全"モデルとポインタの使用に関してあまり漠然としているので、将来私のコードを守るのは少し難しいでしょう。
私の人生のために私はあなたがそれを書いている理由を見ることはできません: 'ProcessSomeData(Const a Input :Byte; var aOutput:Word); ' –
あなたはそのサンプルコードへのポインタを渡しませんか?好奇心の外に、ビルトインタイプのシステムに何が問題なのですか?ポインタのスピードは? –
@Sertacスピードはここで同じです。このようなvar typelessパラメータとconst型なしパラメータと汎用ポインタの間には微妙な違いがあります。const型なしのパラメータは変更しないでください。ポインタは常に変更できます。このような型のないvarを使うと、コード中に^文字をいくつか入力することを避けることができます:PWord(aOutput)^:= 13例えば、生成されたアセンブラは単語(aOutput):= 13と同じになります。 –