首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Delphi5中将TDateTimePicker.Font.Style设置为斜体时出错

在Delphi5中将TDateTimePicker.Font.Style设置为斜体时出错
EN

Stack Overflow用户
提问于 2009-08-24 19:51:31
回答 1查看 754关注 0票数 1

是否可以将TDateTimePicker的字体设置为斜体?我在下面的代码中这样做

代码语言:javascript
复制
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异常,并显示一条消息:

代码语言:javascript
复制
„Control” has no parent window.

这是Delphi 5的特性,还是我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-08-24 19:58:59

是的,你做错了什么。:)

基于窗口的控件的某些方面需要将控件放在它的容器窗口上。这通常反映了基础窗口类本身的一些要求(不是VCL类,而是代表控件的MS Windows窗口对象)。

在这种情况下,只需移动Parent属性的赋值,以便在尝试更改Font.Style之前发生:

代码语言:javascript
复制
  DatEdit.OnEnter := CtrlInputProc;
  DatEdit.OnExit := CtrlExitProc;
  DatEdit.Enabled := false;
  DatEdit.Parent := Canvas;
  DatEdit.Font.Style := DatEdit.Font.Style + [fsItalic];

我不知道是否可以用这种方式成功地将字体设置为斜体,但这至少应该解决了您的异常。

更新:我已经确认可以用这种方式将字体设置为斜体,只要您首先设置了控件的父级。(我使用的是Delphi 2009,但如果它在Delphi 5中不起作用,我会感到惊讶)

仅供参考:我强烈建议为"Canvas“面板控件选择一个不同的名称。

附录:-

CMFontChanged()消息处理程序中对InvalidateRect()的调用需要一个窗口句柄(这又要求控件成为父级)。

如果您绝对需要在修改字体之后能够设置,则可以从TDateTimePicker派生您自己的控件类,并实现对CMFontChanged()消息的响应,该响应将禁止继承的行为,除非控件是父级的:

代码语言:javascript
复制
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,则可能不需要重新生成此代码,并且可以移除它和对它的调用,但如果更改字体的其他属性,则应确保控件的大小正确。

在调用继承的时,会调用私有AdjustHeight()机制,因此在这种情况下不需要调用该过程的本地副本。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1324376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档