Как узнать, где будет закреплен элемент управления, и как предотвратить стыковку?

Я использую «обычную» стыковку Delphi (с DockSite = True и UseDockManager = True). Теперь есть несколько элементов управления DockSite и несколько закрепляемых форм. Однако не каждая стыкуемая форма должна входить в каждую стыковочную площадку.

Формы знают, к какому типу элементов управления они должны подключаться; элементы управления, OTOH, не знают, какую форму принимать или нет.

Моя проблема сейчас в том, что происходит несколько событий, при которых вы можете отменить операцию перетаскивания / перетаскивания (или перетаскивания / закрепления): DragOver, StartDock и т. Д. Но все они происходят на «принимающей» стороне, а не на стороне отбрасываемый контроль; и именно здесь я хотел бы это сделать - чтобы стыкуемая форма могла отказаться от стыковки с определенным элементом управления.

Есть ли такое событие, я что-то не замечаю или мне придется решать это по-другому?


person Martijn    schedule 06.09.2011    source источник
comment
При правильной настройке отключение док-станции с любой стороны должно работать нормально. Есть ли причина, по которой пункт назначения, отказывающийся от дока, не работает для вас?   -  person Jerry Gagnon    schedule 06.09.2011
comment
Я хочу, чтобы формы были как можно более «подключаемыми» и содержали всю необходимую логику (и ссылки на бизнес-классы); но я хотел бы, чтобы элементы управления местом назначения были свободны от каких-либо сведений о формах, которые они будут содержать. В будущем мне может потребоваться добавить новые (классы) стыкуемых форм.   -  person Martijn    schedule 06.09.2011
comment
Разве вы не можете использовать базовый класс для закрепляемых форм? Это значительно уменьшит площадь, занимаемую элементами управления.   -  person Jerry Gagnon    schedule 06.09.2011
comment
Я знаю, что это возможно благодаря расширенным функциям стыковки, предоставляемым элементами управления JVCL Jvdocking.   -  person Warren P    schedule 07.09.2011
comment
@JerryGagnon: Как использование базового класса уменьшает занимаемую площадь для элементов управления док-станцией?   -  person Martijn    schedule 07.09.2011
comment
@WarrenP: ... но не стандартная стыковка Delphi? К сожалению, сейчас мне не нужно менять наборы элементов управления.   -  person Martijn    schedule 07.09.2011
comment
Я имел в виду, что при использовании базовой настраиваемой формы все элементы управления должны будут знать, как работать с этой формой, независимо от того, что еще может быть добавлено к ней позже или потомком.   -  person Jerry Gagnon    schedule 07.09.2011
comment
@JerryGagnon: по сути, мне нужно, чтобы все элементы управления стыковкой запрашивали (базовую) форму, должна ли она принимать входящую форму. Поскольку может показаться, что стандартная стыковка Delphi не позволяет этого по-другому, думаю, мне придется с этим согласиться. Спасибо!   -  person Martijn    schedule 07.09.2011
comment
Мартейн; Он расширяет классы, которые уже есть в VCL. Короче говоря, он предоставляет расширенные функциональные возможности, которые вы ищете, для которых требуется создание подклассов, а не замена кода закрепления VCL.   -  person Warren P    schedule 07.09.2011
comment
@WarrenP: хм ... В таком случае, я могу взглянуть на это. Спасибо за указатель!   -  person Martijn    schedule 08.09.2011


Ответы (2)


Я решил, что должен добавить это как ответ, а не просто комментарий. Создайте базовую форму для ваших пользовательских форм и поместите в нее свою логику. Тогда каждый элемент управления просто должен знать, как взаимодействовать с одним классом формы. Каждая создаваемая вами новая стыковочная форма должна происходить от этой базовой формы. Прелесть этого в том, что вам не нужно будет создавать собственные версии элементов управления, поскольку все можно обрабатывать с помощью стандартных обработчиков событий.

person Jerry Gagnon    schedule 07.09.2011

Событие OnStartDock запускается для закрепляемого элемента управления / формы, а не для закрепляемого элемента управления DockSite. Таким образом, вы можете назначить OnStartDock обработчик событий своим прикрепляемым формам или, лучше, переопределить виртуальный метод DoStartDock().

person Remy Lebeau    schedule 18.09.2011
comment
OnStartDock запускается, как только элемент управления начинает перетаскиваться. Это аналог OnStartDrag элемента управления, когда DragKind имеет значение dkDock. Тогда нет никакого намека на то, куда будет пристыкован элемент управления. - person Sertac Akyuz; 18.09.2011
comment
Как говорит Сертак: OnStartDock запускается до того, как станет известен целевой элемент управления. И я также не могу найти способ обнаружить это изнутри DragDockObject: его свойство DragTarget читает и записывает непосредственно в поле, поэтому нет метода, который я мог бы переопределить. - person Martijn; 18.09.2011