一些背景(类似于的延续):
因此,我有一个应用程序,它加载不同的插件,并为每个插件在一个上创建一个新的选项卡。
对于这种“插件”类型的应用程序,我似乎遇到了许多新问题(但有很好的学习经验)。
因此,我目前的斗争是尝试有一个插件没有插入到一个TTabSheet,但将调整大小和对齐的形式直接。
因为这更容易用图片来解释:

现在,我可以手动进行对齐和调整大小,但我更希望让VCL对齐过程(alClient、alTop等)为我做。那样的话,我只需要在它的形式上设置插件对齐,而无需考虑。
在查看了VCL源代码之后,我开始逐步了解对齐代码以及它是如何调用的。基本上,当一个TControl获得一个WM_RESIZE时,它会:
调用AlignControl()
。
因此,我的想法是,如果我创建了一个新的TWinControl,将它的句柄设置为插件表单(窗口)句柄,并将其插入到FControls列表中,并使用适当的对齐方式来完成我的工作。
我当然在这里,所以很不幸地失败了。在退出有关无效窗口句柄的应用程序时,我甚至会得到一个AV。我的猜测是,我创建的TWinControl试图释放不再存在的插件表单(窗口)的句柄。
我试过的是:
procedure AddHandleToControlList(AHandle: DWORD; Align: TAlign);
var
NewWinControl : TWinControl;
begin
NewWinControl := TWinControl.Create(frmMain);
NewWinControl.WindowHandle := AHandle;
NewWinControl.Align := Align;
NewWinControl.Width := frmMain.ClientWidth;
NewWinControl.Height := 30;
NewWinControl.Parent := frmMain;
end;
procedure AddHandleToControlList(AHandle: DWORD; Align: TAlign);
var
NewWinControl : TWinControl;
begin
NewWinControl := TWinControl.Create(frmMain);
NewWinControl.WindowHandle := AHandle;
NewWinControl.Align := Align;
NewWinControl.Width := frmMain.ClientWidth;
NewWinControl.Height := 30;
TWinControl(frmMain).Insert(NewWinControl);
end;哦,有什么想法?
编辑1:
好的,这正确地将控件添加到列表中,并符合TAlign集(为什么我花了8个小时试图找出一些事情,我在这里发帖,然后答案就是appears...oh --有人可能会发现这个问题和我的漫谈很有用):
procedure AddHandleToControlList(AHandle: DWORD; AName: PChar; ATop, ALeft, AWidth, AHeight: Integer; AAlign: TAlign);
var
NewWinControl : TWinControl;
begin
NewWinControl := TWinControl.Create(frmMain);
With NewWinControl Do
begin
Name := AName;
Top := ATop;
Left := ALeft;
Width := AWidth;
Height := AHeight;
Align := AAlign;
WindowHandle := AHandle;
Visible := True;
end;
TWinControl(frmMain).InsertControl(NewWinControl);
end;现在的问题是,当应用程序关闭时,我将得到无效的错误AV.我将继续!!
编辑2: Ok,所以是TWinControl.DestroyWindowHandle引发AV,因为窗口句柄已经不存在了。我在想一个干净的解决方案。
发布于 2011-11-11 19:32:15
从TWinControl派生一个新类,并重写其虚拟DestroyWindowHandle()方法,以不释放所提供的HWND。TWinControl.DestroyWindowHandle()的默认实现调用Win32 API DestroyWnd()函数。
https://stackoverflow.com/questions/8098568
复制相似问题