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

Вниз

VMT и TPropertyEditor.   Найти похожие ветки 

 
Palladin   (2003-05-12 15:10) [0]

Каким же образом манипулировать TPropertyEditor и VMT, что бы Object Inspector видел методы форм-предков?

Уважаемому Юрию Зотову.
Ну чтож, конечно же я не справился с Вашей задачей за две недели, (+1 день :) ). Признаю это без всякого огорчения, потому что в процессе копания не мало узнал интересных вещей и хоть как то размял мозги от рутины. За что Вам и спасибо.
Впредь постараюсь давать более подробные ответы-советы, если конечно вопросы этого заслуживают.

И все же вопрос мне жутко интересен.


 
vuk   (2003-05-12 15:29) [1]

Если Вы о необходимости видеть published свойства форм-предков, то там не VMT надо манипулировать, а CustomModule строить.


 
Palladin   (2003-05-12 15:47) [2]

нет
задача стояла в другом

существует иерархия форм, чистое описание, только описание, необходимо сделать видимыми published методы форм предков для Object Inspector


 
Skier   (2003-05-12 15:56) [3]

>Palladin
А зачем это ?
свойства и события в ИО это я понимаю, а вот зачем там методы ?
Или это из "спортивного" интереса ?


 
vuk   (2003-05-12 15:59) [4]

Это... Я, может, чего не понял? Bх и так видно.


 
vuk   (2003-05-12 16:01) [5]

Правим опечатки:

>Bх и так видно.
Их и так видно.


 
Palladin   (2003-05-12 16:03) [6]

нет


 
Mike_Goblin   (2003-05-12 16:08) [7]

Как Вам уже сказали _методы_ в Object Inspector - это очень оригинально (как вы их настраивать собираетесь)
а вот published свойства по умолчанию действительно не видны
читайте доку про RegisterCustomModule и будет Вам счастье


 
vuk   (2003-05-12 16:09) [8]

Delphi6:
Создаю форму, кидаю кнопку Button1, создаю два метода:

procedure Click1(Sender:TObject);
procedure Click2(Sender:TObject);

Делаю наследника формы. В ObjectInspector в списке обработчиков для Button1.OnClick вижу Click1, Click2.

Или Вы имеете ввиду что-то другое?


 
Юрий Зотов   (2003-05-12 17:44) [9]

Должен внести ясность. Задача ставилась так.

Есть иерархия форм. Только PAS, никаких DFM и никаких компонентов. Сами классы форм, их объявление и реализация - больше ничего. То есть, как у TCustomForm.

В этих классах объявлены (в секциях published) и реализованы какие-то методы, по структуре объявлений точно соответствующие каким-то типам обработчиков событий.

Теперь я порождаю рабочую форму с DFM, как потомка одной из этих форм. Естественно, она наследует упомянутые методы и видит их. Кладу на эту форму нужные компоненты и хочу через Object Inspector назначить их событиям эти самые унаследованные обработчики. Но в выпадающем списке их нет. По крайней мере, в D5.

А надо, чтобы были. Причем ВСЕ унаследованные, а не только от ближайшего предка. Но при этом чтобы не все подряд, а только те, которые соответствуют типу данного события. То есть, чтобы всё было, так, как будто эти методы прописаны в самой форме, а не в ее предках.

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

"VMT + TPropertyEditor".

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

Вот. Вроде бы, ничего не исказил (а если исказил, прошу поправить).


 
MalkoLinge   (2003-05-12 17:51) [10]

А я бы в силу своей неопытности формировал бы список (в редакторе компонента) опубликованных методов. Для этого есть замечательная технология RTTI. И намного проще на первый взгляд.


 
vuk   (2003-05-12 18:01) [11]

to Юрий Зотов:
>Есть иерархия форм. Только PAS, никаких DFM и никаких
>компонентов. Сами классы форм, их объявление и реализация -
>больше ничего.
Ну тогда всё равно без CustomModule не обойтись.

>в выпадающем списке их нет. По крайней мере, в D5.
В D6 видны методы не только непосредственного предка.


 
vuk   (2003-05-12 18:07) [12]

to MalkoLinge:
>А я бы в силу своей неопытности формировал бы список (в
>редакторе компонента) опубликованных методов.
И что Вы надеетесь таким образом получить? Ведь в режиме дизайна контейнером является не Ваш класс, а специальная форма-контейнер. А у нее в published совсем не то, что написано у Вас в исходном коде.



 
Skier   (2003-05-12 18:09) [13]

>vuk © (12.05.03 18:07)
форма-контейнер в дизайне является не контейнером, а владельцем.
Разница ! :)


 
Юрий Зотов   (2003-05-12 18:12) [14]

> MalkoLinge © (12.05.03 17:51)

Редактор - это да, только не компонента, а свойста (поэтому и было написано - TPropertyEditor). Но через RTTI Вы не получите список методов, его можно получить проходом по Method Table(поэтому и было написано - VMT). Хотя, строго говоря, это тоже часть RTTI, но не то, что обычно имеют в виду под этим словом.

И возникнет еще одна проблема - ведь этот редактор надо будет зарегистрировать для ЛЮБОГО события, независимо от компонента, которому оно принадлежит, а также независимо от названия и типа этого события. Первое и второе делается элементарно, а вот третье... тоже, в общем-то, пишется в пару строк, но, пока эту пару строк родишь, голову поломать придется изрядно, и полазить по исходникам VCL - тоже.


 
Юрий Зотов   (2003-05-12 18:24) [15]

> vuk © (12.05.03 18:01)
> Ну тогда всё равно без CustomModule не обойтись.

Я обошелся. Задача не высосана из пальца, такая действительно стояла и была решена на практике. Помните, я как-то говорил о том, что писал свою IDE? Вот там она и решалась.

А с CustomModule есть одна проблема. В нем все понятно, кроме одного - как правильно писать CreateDesignerForm (а вот он-то здесь и потребуется, если идти через CustomModule). Несколько месяцев назад мне пришлось повоевать с этой штукой, искал хотя бы один пример - так ничего и не нашел. И никакой документации тоже. Борландовая конференция по OTAPI тоже не помогла. В итоге написал по интуиции, но работало кривовато. Явно написал не то.


 
vuk   (2003-05-12 18:43) [16]

to Skier:
>Разница ! :)
Разницы нет. Владелец или контейнер - какая разница как называть? А результат один, и он таков, что то, что написано в исходнике, в режиме дизайна, не существует в виде исполняемого кода, и, следовательно RTTI для него отсутствует. Дизайнер же это всё получает исключительно путём парсинга исходников, а никак не через RTTI.

to Юрий Зотов:
>Я обошелся.
В своей IDE может и можно, но с IDE Delphi проблема, на мой взгляд, изложена выше. Или я где-то не прав?

А если насчет реализации CustomContainer, то насколько я знаю, в QuickReport такой подход используется. Осталось исходники посмотреть. :o)


 
Palladin   (2003-05-12 19:51) [17]

в том то и проблема, что ясен пень, задача из пальца не высосана, это видно по тексту задачи, и это интересно
но я не смог (или можно сказать не успел, но это отмазки, раз обещал, значит обещал, или провалился)


 
Юрий Зотов   (2003-05-12 20:56) [18]

> Palladin © (12.05.03 19:51)

Провалиться здесь не мудрено, задачка эта совсем не тривиальная, а для тех, кто раньше не имел дела с IDE - откровенно сложная (да и для тех, кто имел - тоже не слишком-то простая). А Вы еще и сами себе сократили срок до пары недель. Поверьте, я не зря писал - пара месяцев (и это еще при условии, что эти пару месяцев придется пахать часов по 15 в сутки). Правда, тогда я решил ее быстро, буквально за полдня, но это вовсе не показатель, потому что я был ГОТОВ к этому, а вот на эту ГОТОВНОСТЬ ушло несколько лет. Вот почему я и говорил - такой подсказки, в принципе, достаточно, но далеко не каждому, потому что в этом деле много специфики.

Если в ближайшее время отпустят в отпуск, то попробую воссстановить свой код (правда, придется по памяти, исходников нет, но идеи, вроде бы, не забыл), нарисую что-то типа редактора или эксперта IDE и выложу.


 
vuk   (2003-05-12 21:30) [19]

to Юрий Зотов:
Если не сложно, хотя бы намекните на то, как это было реализовано. А то я что-то не вижу реальной возможности выполнения вот этого:

>Теперь я порождаю рабочую форму с DFM, как потомка одной из этих
>форм.

кроме как через CustomContainer...


 
Юрий Зотов   (2003-05-12 22:09) [20]

> vuk © (12.05.03 21:30)

Какой тут нужен PropertyEditor, как высосать названия методов из Method Definition Table (рекурсивно по всем предкам) и как загнать эти названия в список - это думаю, для нас обоих не проблема. Тогда остаются, собственно говоря, 2 вопроса:
- фильтрация списка в GetValues по типу события;
- регистрация одного редактора для всех типов событий разом (поскольку nil вместо TypeInfo не напишешь).

Первый вопрос можно решить через RTTI - получаем список параметров для данного типа события и парсим объявление класса на соответствие параметров. Второй - надо покопаться в VCL, там есть что-то типа MapPropertyEditor - через эту штуку предыдущий TMethodProperty подменяется своим. Естественно, надо предусмотреть корректное восстановление при выгрузке пакета.

Что-то в этом роде, насколько я помню (все-таки уже года три прошло).


 
Юрий Зотов   (2003-05-12 22:15) [21]

> vuk © (12.05.03 21:30)

Елы-палы, ответил совсем не на тот вопрос... плохой стал...

Да какая разница, хоть через CCPack, хоть через свой, упрощенный. В принципе, никто не мешает и просто ручками изменить предка, а потом переоткрыть проект.


 
vuk   (2003-05-12 22:17) [22]

PropertyEditor - не проблема. Вот вытягивание из MDT - проблема, т.к. в дизайне у нас контейнер, мягко говоря, не тот (я это уже 3-й раз повторяю) и вытянется оттуда не то. А если тот, то это CustomContainer. Другого метода заставить дизайнер использовать в качестве контейнера что-то нестандартное я не вижу. Или я опять чего не понимаю...


 
vuk   (2003-05-12 22:19) [23]

to Юрий Зотов:
>В принципе, никто не мешает и просто ручками изменить предка, а
>потом переоткрыть проект.
Дык ни предок ни наша форма от этого в виде двоичного кода внутри IDE сами собой не образуются...


 
Юрий Зотов   (2003-05-12 22:32) [24]

Дык... елы палы.. а как Delphi-то сама делает? У нее же формы-предки (TCustomForm и TForm) в пакете сидят - отсюда и код берется. И здесь надо делать так же - загнать иерархию в пакет, а от него уже наследоваться. И все прокатывает.


 
vuk   (2003-05-12 22:39) [25]

Ну раз в пакет, тогда да. Только IMHO без регистрации там контейнер всё равно стандартный будет получаться. Не уверен, надо будет проверить...

По поводу подмены Property Editor.
Из DesignIntf.pas (D6):

type
TPropertyMapperFunc = function(Obj: TPersistent;
PropInfo: PPropInfo): TPropertyEditorClass;
TRegisterPropertyMapperProc = procedure (Mapper: TPropertyMapperFunc);

var
RegisterPropertyMapperProc: TRegisterPropertyMapperProc;

procedure RegisterPropertyMapper(Mapper: TPropertyMapperFunc);


 
Юрий Зотов   (2003-05-12 23:17) [26]

Во-во, об этом и говорилось. Я тогда эту штуку, наверное, целый час искал. Помнил, что видел, а где и как называется - напрочь забыл... В такой ситуации Search - как мертвому припарки, вот и копал ToolsAPI ручками.



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

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

Наверх





Память: 0.52 MB
Время: 0.008 c
3-94727
Инна
2003-05-08 01:52
2003.05.29
транзакции


14-95040
Soft
2003-05-07 16:21
2003.05.29
Какой Linux более стабилен, удобен, быстр...


1-94848
Duke DEE
2003-05-19 18:43
2003.05.29
Последовательность в if then else


6-94998
dir_er_
2003-03-29 03:13
2003.05.29
dialup2api


1-94935
adogg
2003-05-17 16:29
2003.05.29
Memo





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский