Создание редактора форм в Delphi

Моя цель - создать простой редактор форм, подобный тому, который мы находим в Delphi IDE.

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

У меня есть 2 недостающие части, которые я хочу узнать идеи / код, чтобы помочь завершить:

1 - как переместить созданный визуальный компонент? Тот же эффект, что и в IDE для перемещения визуального компонента, например, Tpanel, изменения его верхней и левой позиции 2 - как нарисовать эти зацепки для компонента с фокусом на редакторе форм 3 - как изменить размер с помощью зацепок

Я хочу только часть, связанную с визуальной частью. Я не генерирую DFM или что-то подобное.

3 ответа

Решение

Проще говоря, ваш движущийся код должен сделать это:

  1. Когда мышь опускается, проверьте, находится ли положение мыши над элементом управления, который можно перетаскивать. Если так, то установите переменную с именем FDragControl сослаться на этот контроль. Этот код живет в OnMouseDown обработчик события.
  2. Когда мышь движется, если FDragControl не ноль, переместите элемент управления. Этот код живет в OnMouseMove обработчик события.
  3. Когда мышь поднимется, установите FDragControl до нуля

Это почти все, что нужно сделать. Главный нюанс в том, что вы также должны помнить значения X, Y мыши, когда перетаскивание началось. Так в вашем OnMouseDown обработчик ты пишешь:

FStartMousePos := Point(X, Y);
FStartDragControlPos := Point(FDragControl.Left, FDragControl.Top);

А потом в OnMouseMove код вашей позиции гласит:

FDragControl.Left := FStartDragControlPos.X + (X-FStartX);
FDragControl.Top := FStartDragControlPos.Y + (Y-FStartY);

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

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

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

Я не написал полную рабочую реализацию, поскольку ваш вопрос высокого уровня и концептуальный. Реализация зависит от вас.

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

Вы можете скачать пакет компонентов Cindy и использовать компонент cyResizer, который будет делать практически все, что вам нужно, а также очень настраиваемый.

Вы можете скачать его здесь: http://sourceforge.net/projects/tcycomponents/

Ища больше ответа, я мог найти эти статьи:

Как переместить и изменить размеры элементов управления во время выполнения http://delphi.about.com/library/weekly/aa102505a.htm

Как добавить дескрипторы размера к элементам управления, размер которых изменяется во время выполнения http://delphi.about.com/library/weekly/aa110105a.htm

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

В этих статьях показано, как реализовать и использовать класс TMover. Я сделал это и работаю правильно.

Я также скачал пакет TcyComponents и использовал TcyResizer. Это полнофункциональный редактор форм, содержащий практически все, что требуется для редактора форм, подобных Delphi. Рекомендую. Он поставляется с исходным кодом и отлично работает с версией XE2.

Другие вопросы по тегам