Обновление 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, поэтому я не могу добавить это.