使用带有Delphi的JEDI VCL库,在主窗体上放置了一个JvDockServer,在另一个应该对接到主窗体的窗体上,我有使用对接样式JvDockVIDVCStyle的JvDockClient。
虽然停靠功能很好,但当客户端窗体从停靠模式更改为取消停靠(浮动)模式时,我希望收到通知。
更新JVCL现在被修改为包含内置的此功能!TForm的内置事件现在在您对接表单时触发。请查看JEDI JVCL中的DockingInCode演示,该演示现在(截至2012年3月27日)包含对接和取消对接事件触发的示例。TForm.OnEndDock现在在对接时被激发,TForm.OnUnDock
在解除对接时也是如此。很抱歉这些名字,那些区域已经在TForm
中了,我没有选择它们!
历史原因的旧答案:
您希望在表单浮动时收到通知。TForm已经有了OnUnDock
和OnEndDock
,但当您使用Jedi VCL dock Manager进行对接和解除对接时,它们(很遗憾)并没有被激发。
我能想到的最好的方法是修改JVCL。
修改JvDockSupportControl.pas,方法TJvDockCustomControl.WndProc:
procedure TJvDockCustomControl.WndProc(var Msg: TMessage);
var
CMUnDockClient: TCMUnDockClient;
DockableForm: TJvDockableForm;
allow:Boolean;
begin
if Msg.Msg = CM_UNDOCKCLIENT then
begin
CMUnDockClient := TCMUnDockClient(Msg);
// new code starts here
if CMUnDockClient.Client is TForm then begin
allow := true;
if Assigned(TForm(CMUnDockClient.Client).OnUnDock) then
TForm(CMUnDockClient.Client).OnUnDock(Self,CMUnDockClient.Client,TWinControl(nil),allow);
// if not allow then
// exit; // currently JvDocking has already deleted you from the dock tree, so we can't honor this.
end;
// new code ends here
if CMUnDockClient.Client is TJvDockableForm then
begin
...
不幸的是,这是组件设计中的一个疏忽,如果你将其登录到Jedi Bug Tracker中,并在此处发布链接。遗憾的是,JvDocking的内部很复杂,但上面的破解可能会让你从今天开始。
编辑JVCL的另一种选择是根据您喜欢使用的Dock样式创建自己的样式,并将OnDock和OnFloat事件添加到其中。例如,如果您使用的是VID(Visual Interdev)Dock样式,请将JvDockVIDStyle.pas复制到您自己的单元,然后将其重命名为其他内容。
在代码中查找此过程:
procedure TJvDockVIDTree.WindowProc(var Msg: TMessage);
将现有代码保留在该函数中,并在底部添加以下内容:
if (Msg.msg =CM_UNDOCKCLIENT)and Assigned(FOnUndock) then
FOnUndock( TObject(Msg.Client))
我认为我应该写一个更好的版本,并将其放入JVCL JvDocking中,因为这是一件直观的事情。此外,可能应该使OnEndDock发挥作用。OnStartDock与JvDocking不兼容,所以我无法添加。