Delphi JvDockServer JvDockClient уведомление о расстыковке (плавающей) клиентской формы - PullRequest
0 голосов
/ 30 января 2012

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

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

1 Ответ

2 голосов
/ 30 января 2012

Обновление JVCL теперь модифицируется, чтобы содержать эту встроенную функцию!Встроенные события TForm теперь запускаются, когда вы прикрепляете форму.Посмотрите демонстрацию DockingInCode в JEDI JEDI, которая теперь (по состоянию на 27 марта 2012 г.) содержит примеры срабатывания событий Docking и Undocking.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), скопируйте 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, поэтому я не могу добавить это.

...