gpt4 book ai didi

delphi - 在 Delphi 5 中将 TDateTimePicker.Font.Style 设置为斜体时出错

转载 作者:行者123 更新时间:2023-12-02 05:57:51 25 4
gpt4 key购买 nike

是否可以将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 的功能吗,还是我做错了什么?

最佳答案

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

基于窗口的控件的某些方面要求将该控件放置在其容器窗口上。这通常反射(reflect)了底层窗口类本身的一些要求(不是 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];

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

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

仅供引用:我强烈建议为“Canvas”面板控件选择不同的名称。

附录: -------

它是对 CMFontChanged() 消息处理程序中的 InvalidateRect() 的调用,需要一个窗口句柄(这又要求该控件具有父级)。

如果您绝对需要能够在修改字体之后设置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私有(private)方法复制的。如果您仅更改 Font.Style,您可能不需要重现此代码,并且可以删除它以及对它的调用,但如果您更改 Font 的其他属性那么这应该确保控件的大小正确。

当您调用inherited时,将调用私有(private)AdjustHeight()机制,因此在这种情况下无需调用该过程的本地副本。

关于delphi - 在 Delphi 5 中将 TDateTimePicker.Font.Style 设置为斜体时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1324376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com