Обновление 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, поэтому я не могу добавить это.
не может быть лучше спасибо –
Я работаю над улучшениями, включая этот, так что проверьте JVCL позже, и это может быть уже исправлено. Я буду обновлять свой ответ, когда JVCL включает такие функции. –