Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];

Вниз

Графический редактор графического компонента   Найти похожие ветки 

 
AZ   (2003-02-24 17:08) [0]

В предыдущей ветке я писал:
---
Пишу графический компонент, наследник TGraphicControl.
На нем располагаютя графические примитивы (прямоугольники, эллипсы, и т.п.).
При редактировании необходимо перемещать их, деформировать.
Обычная реакция IDE - растягивание, сжатие или перемещение клиентской области компонента.

Или писАть какой-то свой специфический редактор?
Варианты типа "на каждую фигуру свой контрол" не подходят.
---
Mike_Goblin © (24.02.03 10:08)
(спасибо ему!) посоветовал сделать редактор.
Вот и приступил я к созданию своего графического редактора графического компонента.
Что предлагает IDE:
function GetVerbCount: integer; override;
Количество пунктов меню редактора;
function GetVerb(Index: integer): string; override;
Список названий пунктов меню редактора
procedure ExecuteVerb(Index: integer); override;
Выполнение пунктов меню.
Хорошо, но мало.
Просмотрел интерфейс IDesigner и другие.
К сожалению, ничего подходящего себе не нашел, описания интерфейсов слишком скупы.
Может, господа профессионалы подскажут путь построения подобного редактора.


 
Mike_Goblin   (2003-02-24 17:22) [1]

Редактор компонента - экземпляр класса-наследника TComponentEditor
Вызов его происходит след образом
Вариант 1
щелчок правой кн мыши на компоненте-контекстное меню - пункт контекстного меню
Вариант 2
Дв клик левой кнопкой мыши на компоненте
Так вот методы
function GetVerbCount: integer; override;
procedure ExecuteVerb(Index: integer); override;
отвечают за формирование дополнительных(специфичных пунктов popup)
При двойном клике вызывается метод Edit класс TComponentEditor
Если ты не переопределил Edit, то он пытается вызвать первый пукт меню
ExecuteVerb(0)


 
Mike_Goblin   (2003-02-24 17:47) [2]

PS Конопку почитай, если есть возможность. Там это все очень хорошо изложено


 
AZ   (2003-02-24 18:51) [3]

С этим я уже знаком, простые редакторы уже писАл... :)
Непонятно, как пристегнуть к редактору мышиные события, так же как обычно:
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;
Или нужно что-то другое?


 
viajero   (2003-02-24 18:54) [4]

Стандартный редактор компонента предназначен
для интегрирования в среду дельфи и больше ни для чего.

Такое поведение, как ты описываешь, можно организовать,
заменив оконную ф-ю компонента:

procedure TTestCtrl.NewWndProc(var Message: TMessage);
var
Form: TCustomForm;
begin
if (csDesigning in ComponentState) then
begin
Form := GetParentForm(Self);

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

if not IsMessageForMyGraphicEditor(Message) then

// Standard process

if (Form <> nil) and (Form.Designer <> nil) and
Form.Designer.IsDesignMsg(Self, Message) then Exit;
end else
OldWndProc(Message);
end;

constructor TTestCtrl.Create(AOwner: TComponent);
begin
inherited;
OldWndProc := WindowProc;
WindowProc := NewWndProc;
end;


Но тогда всю функциональность перетаскивания и
масштабирования мышью тебе придётся реализовать самому.

Других путей я не вижу.


 
AZ   (2003-02-25 07:33) [5]

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


 
Юрий Зотов   (2003-02-25 08:08) [6]

> Непонятно, как пристегнуть к редактору мышиные события

Заместите метод Edit, а в нем создавайте форму редактирования. Сама форма делается, как обычно. На ней две кнопки - OK и Cancel, показ модальный. Обычно такая форма содержит тот же компонент, что и редактируемый (собственно, этот дубль она и редактирует, а не сразу оригинал - это дает возможность использовать откат по Cancel). При подъеме формы дубль "копирует" состояние оригинала (напр., через Assign), а при нажатии OK идет ModalResult := mrOK, обратный Assing и Designer.Modified (чтобы обновить Object Inspector). При нажатии Cancel просто ничего не делаем. То есть примерно вот что:

with TEditorForm.Create(nil) do
try
Дубль_на_форме.Assign(Component);
if ShowModal = mrOK then
begin
Component.Assign(Дубль_на_форме);
Designer.Modified
end
finally
Free
end;

Этот же код можно написать и не в Edit, а в ExecuteVerb, только сначала надо проверить, тот ли пункт меню был вызван. Обычно если пункт меню единственный, используется Edit, если несколько - ExecuteVerb.

Сама форма редактирования делается, повторюсь, самым обычным образом. Пишите в ней любые обработчики любых событий и сообщений. При вызове из редактора сама эта форма будет работать, как часть IDE - то есть, в run-time. Поэтому никаких проблем.


 
AZ   (2003-02-25 11:33) [7]

А если эти геометрич. примитивы должны находиться в определенном положении по отношению к другим, но другого компонента?
Тогда как тогда организовывать вывод других компонентов на новую форму?
Или ограничиться редактируемым компонентам, но запомнить координаты стыковки и в процессе редактирования подогнать стыкуемые места на нужное место? Неудобно, конечно, но тоже выход.


 
Юрий Зотов   (2003-02-25 21:57) [8]

Так положите на форму редактора дубли ВСЕХ нужных Вам компонентов и редактируйте их СОВМЕСТНО (а сам редактор можно зарегистрировать для ВСЕХ этих компонентов).

Поймите, главное - это то, что форма редактора и ВСЕ находящиеся на ней компоненты работают в run-time. Это РЕЗКО упрощает задачу. Ведь можно писать любые обработчики любых сообщений и событий - то есть, происходит развязка с design-time, с ее хуками и прочими недокументированными средствами.


 
AZ   (2003-02-26 03:43) [9]

ЗдОрово!
ИМХО, таким образом можно сделать общий для всех редактор и объединить их в пакет.
Хорошая мысль, и главное, вовремя.
Еще раз спасибо.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.01 c
3-16946
_NN
2003-02-16 21:24
2003.03.06
Удаление записи Paradox


1-17117
Alessio2003
2003-02-22 00:13
2003.03.06
Доступ к RichEdit


3-16918
malish
2003-02-15 19:00
2003.03.06
Парольна пародоксе


1-17155
Михайлов Антон
2003-02-23 11:16
2003.03.06
Memo1


9-16839
greenrul
2002-09-29 20:26
2003.03.06
Полоска здоровья: DelphiX





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский