执行FormResize事件的代码

3

我尝试了许多方法来强制执行FormResize事件,包括SetWindowPos,但都没有成功。下面的代码在用鼠标调整大小时效果非常好,但我还需要用代码手动调用它。但我不想以任何方式改变表单。

procedure TFormMain.FormResize( Sender: TObject );
begin
  dxDockPanelFolders1.Height := dxVertContainerDockSite1.Height div 3;
  dxDockPanelFiles1.Height := dxVertContainerDockSite1.Height div 3;
  dxDockPanelPreview1.Height := dxVertContainerDockSite1.Height div 3;
end;

我在搜索网络时没有找到任何实现这一点的方法。

3个回答

5

我会使用一些间接方式:

procedure TFormMain.UpdateDockPanelLayout;
begin
  dxDockPanelFolders1.Height := dxVertContainerDockSite1.Height div 3;
  dxDockPanelFiles1.Height := dxVertContainerDockSite1.Height div 3;
  dxDockPanelPreview1.Height := dxVertContainerDockSite1.Height div 3;
end;

procedure TFormMain.FormResize(Sender: TObject);
begin
  UpdateDockPanelLayout;
end;

现在你可以在代码的任何地方直接调用UpdateDockPanelLayout
我知道你可以调用FormResize并传递一个Sender,但这种解决方案让我感觉很不舒服。按照上面建议的方法做也可以让你更具体地命名方法,并且不会和驱动它的UI事件耦合得太紧。

1
直接将事件处理程序作为方法调用,就像其他人的答案中所示,是不规范的。事件处理程序应该调用一个命名良好的函数,这个函数也可以单独调用。 - Warren P
我为了你能成为第一个,删除了我的相似答案。 - NGLN

0

你真的需要触发事件吗?还是仅执行事件处理程序就足够了?如果是后者,只需执行以下操作:

FormResize(Self);

如果你真的需要触发事件,只需执行以下操作:
Resize;

1
糟糕,28秒...今天我的网络提供商很慢。 - Marjan Venema
@Marjan 如果你不能成为第一,就要做得更好! - David Heffernan
@David,是的,那是个好主意。但在发现Andreas提交了与我几乎相同的答案并且比我早28秒(他后来进行了编辑)之后,你也打败了我给出更好的答案。 :-) 看来今天不是我的日子... :-) - Marjan Venema
谢谢大家。实际上我刚刚发现我可以使用dxDockSite1UpdateResizeZones事件来重新定位面板,但是知道如何执行FormResize事件也很好。感谢David Heffernan的建议。 - Bill

-1

嗯,只需调用

FormResize(nil);

当你需要调整控件时?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接