在我手动调用ClientHeight或手动调整大小之前,调整大小不会执行

时间:2012-08-07 19:55:05

标签: delphi

我想创建一个从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

继续在这里

2 个答案:

答案 0 :(得分:6)

您的控件来自TWinControlTWinControl来电Resize以响应WM_SIZE消息。因此,除非已创建控件的窗口句柄,否则不会调用Resize

分配ResizeHeight时未调用Width方法,因为尚未分配窗口句柄。

评估ClientHeight属性时,会导致创建窗口句柄,然后调用Resize。这是因为GetClientHeight调用GetClientRect,如下所示:

function TWinControl.GetClientRect: TRect;
begin
  Winapi.Windows.GetClientRect(Handle, Result);
end;

这是强制窗口句柄存在的Handle属性的评估。

答案 1 :(得分:2)

您的表单尚未显示,因此无法接收Windows消息(例如触发OnResize事件的调整大小消息)。