2012-01-30 13 views
0

Используя библиотеку JEDI VCL с Delphi, я поместил JvDockServer в основную форму, и на другую, которая должна быть состыкована с основной формой, у меня есть JvDockClient, используя док-стиль JvDockVIDVCStyle.Delphi JvDockServer Уведомление JvDockClient для разблокировки (плавающей) клиентской формы

В то время как Docking отлично работает, я хотел бы получать уведомление о том, что форма клиента изменяется из состыкованного в безопасный (плавающий) режим.

ответ

2

Обновление JVCL теперь модифицирован, чтобы содержать эту встроенную функцию! Встроенные события TForm теперь запускаются, когда вы закрепляете форму. Посмотрите демонстрацию DockingInCode в JEDI JVCL, которая теперь (по состоянию на 27 марта 2012 года) содержит образцы запуска Docking and Undocking. TForm.OnEndDock теперь запущен при стыковке, как и TForm.OnUnDock при отстыковке. Извините за имена, те области уже в TForm, и я их не выбрал!

OLD ANSWER по историческим причинам:

Вы хотели бы уведомление, когда форма была сделана, чтобы плавать. У 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 состоит в том, чтобы создать собственный стиль, основанный на стиле док-станции, который вы предпочитаете использовать, и добавить к нему события OnDock и OnFloat. Например, если вы используете стиль док-станции VID (Visual Interdev), скопируйте 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, поэтому я не могу добавить это.

+0

не может быть лучше спасибо –

+0

Я работаю над улучшениями, включая этот, так что проверьте JVCL позже, и это может быть уже исправлено. Я буду обновлять свой ответ, когда JVCL включает такие функции. –