2013-05-10 2 views
3

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

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

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

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

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

ответ

5

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

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

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

+0

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

+1

@eelias нарисовать его на бланке формы с помощью форм 'OnPaint' event –

+2

Существует очень приятный компонент, который является частью пакета под названием Cindy Components. Компонент, который вы хотите, называется cyResizer, и он может перемещать, изменять размер и предотвращать выходя из скажем, границы панелей и т. д. Ссылка: http://sourceforge.net/projects/tcycomponents/ посмотреть, что вы думаете, что это очень настраиваемый ... – Shambhala

1

Поиск больше для ответа я мог бы найти эти статьи:

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

Как добавить размер Ручки для управления изменение размера в Run-Time http://delphi.about.com/library/weekly/aa110105a.htm

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

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

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

+2

добавьте это как обновленную информацию. – RBA

2

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

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

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

+0

@eelias Я не думаю, что ваш ответ должен был быть обновлением к вопросу. Но я также не думаю, что это отличный ответ. Это результат веб-поиска. Любой может это сделать. Поэтому я не думаю, что ваш ответ действительно отвечает на вопрос. Или, если это так, то вопрос должен быть закрыт как не реальный вопрос. –

Смежные вопросы