代码之家  ›  专栏  ›  技术社区  ›  smok1

在Delphi 5中将TDateTimePicker.font.style设置为斜体时出错

  •  1
  • smok1  · 技术社区  · 15 年前

    是否可以将tdatetimepikers字体设置为斜体?我是用这个密码做的

    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.
    

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

    1 回复  |  直到 15 年前
        1
  •  7
  •   Deltics    15 年前

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

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

    在这种情况下,只需移动Parent属性的赋值,使其在尝试更改字体之前发生。样式:

      DatEdit.OnEnter := CtrlInputProc;
      DatEdit.OnExit := CtrlExitProc;
      DatEdit.Enabled := false;
      DatEdit.Parent := Canvas;
      DatEdit.Font.Style := DatEdit.Font.Style + [fsItalic];
    

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

    更新: 我已经确认字体可以用这种方式斜体,只要你先设置了控件父级。(我使用了Delphi2009,但如果它在Delphi5中不起作用,我会很惊讶)

    我愿意 强烈地 为“canvas”面板控件推荐不同的名称选择。

    附录:-------

    这是给 使rect()无效 CMfOnTunCe() 需要窗口句柄的消息处理程序(而窗口句柄又要求控件具有父级)。

    如果你绝对需要能够设置 起源 之后 修改 字体 ,您可以从 t日期时间选取器 并对 CMfOnTunCe() 禁止继承行为的消息,除非控件是父级的:

    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;
    

    请注意 AdTraceTyt() 程序复制自 私有的 方法 t日期时间选取器 . 如果你只是改变 字体风格 您可能不需要重新生成此代码并可以删除它和对它的调用,但如果您更改了 字体 这样可以确保控件大小正确。

    当你打电话 继承 私人 AdTraceTyt() 机制被调用,因此在这种情况下不需要调用该过程的本地副本。