1

TDateTimePicker のフォントを斜体に設定することはできますか? 私はこのコードでそれをやっています

var
  DatEdit : TDateTimePicker;
begin
  //I know Canvas is a stupid name for TPanel
  DatEdit:=TDateTimePicker.Create(Canvas);

  DatEdit.OnEnter := CtrlInputProc;
  DatEdit.OnExit := CtrlExitProc;
  DatEdit.Enabled := false;
  DatEdit.Font.Style := DatEdit.Font.Style + [fsItalic]; //this line creates an exception
  DatEdit.Parent := Canvas;

end;

コードが最後の行を実行するたびに、EInvalidOperation 例外がスローされ、次のメッセージが表示されます。

„Control” has no parent window.

これは Delphi 5 の機能ですか、それとも何か間違っていますか?

4

1 に答える 1

7

はい、あなたは何か間違ったことをしています。:)

ウィンドウ ベースのコントロールの一部の側面では、コントロールをコンテナー ウィンドウに配置する必要があります。これは通常、基礎となるウィンドウ クラス自体 (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()メカニズムが呼び出されるため、その場合、そのプロシージャのローカル コピーを呼び出す必要はありません。

于 2009-08-24T19:58:59.130 に答える