Перетаскивание во время разработки в Delphi? - PullRequest
7 голосов
/ 25 мая 2009

До того, как Delphi 2006 (я думаю) представил TFlowPanel и TGridPanel, я сделал элемент управления, который был похож на концепцию. Он по-прежнему выполняет несколько функций, которые не выполняются этими элементами управления, и при обновлении своего кода до Delphi 2009 я решил добавить к этому также несколько улучшений.

В настоящий момент порядок дочерних элементов управления определяется порядком их создания. FlowPanel и GridPanel показывают лучший способ с ControlIndex и другими отфильтрованными свойствами, но мне было интересно, есть ли способ управлять переупорядочением перетаскиванием во время разработки? Насколько я могу судить, перетаскивание элемента управления для редактирования и перетаскивание его на панель не вызывает ничего, к чему я могу получить доступ во время разработки.

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

Есть идеи?

Обновление: ОК, все заработало. Контейнерный элемент управления уже переопределял AlignControls для управления размещением элементов управления. Когда вы перетаскиваете вложенный элемент управления и опускаете его, снова вызывается AlignControls. Затем я сравнил новые координаты элемента управления с другими элементами управления в списке и переместил его в соответствующую позицию.

Было несколько проблем, с которыми мне пришлось работать (в основном, связанных с многочисленными вызовами AlignControls), но основная концепция достаточно проста. Спасибо всем комментаторам за помощь.

Ответы [ 3 ]

5 голосов
/ 25 мая 2009

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

Если элемент управления уже находится на вашей панели, и вы хотите переместить его в другое положение на панели, тогда панель может управлять макетом, переопределив метод TWinControl.AlignControls. Когда элемент управления перемещается, вызывается его метод SetBounds, и среди прочего происходит то, что он вызывает AlignControl(Self) в своем родительском окне. Это вызывает AlignControls. Загляните в Controls.pas , и вы увидите, что это сложный метод, но именно он отвечает за расположение дочерних элементов в элементе управления, и это именно то, что вы планируете изменить.

3 голосов
/ 26 мая 2009

Возможно, некоторые из этих предложений могут помочь.

Вы можете переопределить элемент управления в конструкторе без необходимости вырезать и вставить. Просмотрите панель структуры и просто перетащите визуальный элемент управления на узел другого родителя на панели структуры. Если у вас есть элементы в панели потоков, перетащите все из панели потоков и перетащите их обратно в том порядке, в котором вы хотите, чтобы они были.

(Вы можете переопределить ЛЮБОЙ визуальный контроль таким образом, не изменяя ничего, кроме его родителя. Я настоятельно рекомендую сделать это таким образом.)

Вы можете просматривать форму в виде текста и перемещать туда порядок объявлений - но, очевидно, вам нужно быть осторожным при непосредственном редактировании файла «ресурса».

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

0 голосов
/ 25 мая 2009

Вы пытались написать событие «OnDragDrop» для компонента сетки, где вы проверяете, находится ли ваш компонент в режиме разработки?

Я еще не написал такой компонент, но не понимаю, почему событие не должно срабатывать.

...