はい、あなたは何か間違ったことをしています。:)
ウィンドウ ベースのコントロールの一部の側面では、コントロールをコンテナー ウィンドウに配置する必要があります。これは通常、基礎となるウィンドウ クラス自体 (VCL クラスではなく、コントロールを表す MS Windows ウィンドウ オブジェクト) の要件を反映しています。
この場合、 Parent プロパティの割り当てを移動して、 Font.Style を変更しようとする前にそれが発生するようにします。
DatEdit.OnEnter := CtrlInputProc;
DatEdit.OnExit := CtrlExitProc;
DatEdit.Enabled := false;
DatEdit.Parent := Canvas;
DatEdit.Font.Style := DatEdit.Font.Style + [fsItalic];
この方法でフォントを斜体に設定できるかどうかはわかりませんが、少なくとも例外に対処する必要があります。
更新:最初にコントロールの親を設定している限り、この方法でフォントを斜体にできることを確認しました。(私は Delphi 2009 を使用しましたが、Delphi 5 で動作しない場合は驚くでしょう)
参考までに、その「キャンバス」パネル コントロールには別の名前を選択することを強くお勧めします。
補遺: -------
ウィンドウ ハンドルを必要とするのは、CMFontChanged()メッセージ ハンドラーでのInvalidateRect()の呼び出しです(これには、コントロールを親にする必要があります)。
Fontを変更した後にParent を設定できることが絶対に必要な場合は、 TDateTimePickerから独自のコントロール クラスを派生させ、コントロールが親でない限り、継承された動作を抑制するCMFontChanged()メッセージへの応答を実装できます。
type
TMyDateTimePicker = class(TDateTimePicker)
protected
procedure CMFontchanged(var Message: TMessage); message CM_FONTCHANGED;
end;
procedure TMyDateTimePicker.CMFontchanged(var Message: TMessage);
procedure AdjustHeight;
var
DC: HDC;
SaveFont: HFont;
SysMetrics, Metrics: TTextMetric;
begin
DC := GetDC(0);
try
GetTextMetrics(DC, SysMetrics);
SaveFont := SelectObject(DC, Font.Handle);
GetTextMetrics(DC, Metrics);
SelectObject(DC, SaveFont);
finally
ReleaseDC(0, DC);
end;
Height := Metrics.tmHeight + (GetSystemMetrics(SM_CYBORDER) * 8);
end;
begin
if HasParent then
inherited
else
AdjustHeight;
end;
AdjustHeight()プロシージャはTDateTimePickerのプライベートメソッドから再現されていることに注意してください。Font.Styleのみを変更する場合は、このコードを再現する必要はなく、コードとその呼び出しを削除できますが、Fontの他のプロパティを変更する場合は、コントロールのサイズが正しくなるようにする必要があります。
継承を呼び出すと、プライベートAdjustHeight()メカニズムが呼び出されるため、その場合、そのプロシージャのローカル コピーを呼び出す必要はありません。