我想创建一个从TPanel派生的自定义控件,其中包含一个图像和一堆其他控件。 编写代码后,我的程序中有一些奇怪的行为。我意识到一些应该在TDisplay.Resize(override)中初始化的变量从未被初始化,因为从未执行过Resize。
要“解决它”我在表单上放了一个按钮并调用LoadSample函数调用ClientHeight,它首先调用Resize!
constructor TDisplay.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Ready := FALSE;
Parent := Owner as TWinControl;
Width := 200;
Height := 86;
Color := clSilver;
Caption := '';
DoubleBuffered:= TRUE;
InternalDisplay:= TImage32.Create(Self);
with Display DO
begin
Parent := Self;
Bitmap.Width := 1;
Bitmap.Height := 1;
RepaintMode := rmOptimizer;
Align := alClient;
SetupBitmap(TRUE, clBlack32);
Visible := TRUE;
OnMouseDown := DMouseDown;
end;
...
end;
更新
在我在运行时手动调整表单(控件)之前,InternalDisplay也不会与其父级大小对齐。只有这样它才会起到应有的作用(与alClient保持一致)。
更新2:
Resize声明如下:procedure Resize;覆盖;
更新3:
我从我的construnctor中删除了ClientHeight行并将其移到此处:
procedure TDisplay.LoadSample(VAR Obj: TMySample; CONST bReleaseOnExit: boolean)
begin
ClientHeight; <--------- this will call Resize for the first time and my code will be finally initialized. But until this point my display will look odd because the code was never initialized. So the user will see weird stuff until it pushes the 'LoadSample' button.
more code here....
end;
更新4:
我使用了大卫建议的HandleNeeded,它解决了初始化问题。但是,除非我手动调整表单/控件的大小,否则Image仍然不会与整个客户区对齐。
更新5
大卫建议:TImage won't align to parent
答案 0 :(得分:6)
您的控件来自TWinControl
和TWinControl
来电Resize
以响应WM_SIZE
消息。因此,除非已创建控件的窗口句柄,否则不会调用Resize
。
分配Resize
或Height
时未调用Width
方法,因为尚未分配窗口句柄。
评估ClientHeight
属性时,会导致创建窗口句柄,然后调用Resize
。这是因为GetClientHeight
调用GetClientRect
,如下所示:
function TWinControl.GetClientRect: TRect;
begin
Winapi.Windows.GetClientRect(Handle, Result);
end;
这是强制窗口句柄存在的Handle
属性的评估。
答案 1 :(得分:2)
您的表单尚未显示,因此无法接收Windows消息(例如触发OnResize事件的调整大小消息)。