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

Вниз

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

 
Yaral   (2004-07-24 19:36) [0]

Здравствуйте
В созданной форме создаю новое свойство. Затем при помощи репозитория наследую эту форму, но созданное свойство не отображается в инспекторе объектов. Как сделать, чтобы оно там отобразилось? Или нужно создавать новый компонент наследником от TForm, что тоже я не знаю как сделать, ведь форму нельзя добавить с палитры компонентов.


 
Юрий Зотов ©   (2004-07-24 20:19) [1]

Это делается с помощью RegisterCustomModule (форма с добавленными свойствами должна быть пустой (лучше даже вовсе без ресурсов) и находиться в пакете. Но проще и удобнее использовать уже говый эксперт CFPack от Сергея Орлика. В Сети легко найдете.


 
Yaral   (2004-07-24 20:44) [2]

Пустой это вообще без компонентов на ней?


 
Юрий Зотов ©   (2004-07-24 20:59) [3]

Да. Дело в том, что даже если компоненты на форме-предке и будут, то после вызова для нее RegisterCustomModule Вы все равно получите пустую форму-наследник. Поэтому лучще всего, когда форма, в которую Вы добавляете свойства (и для которой вызывается RegisterCustomModule) вообще не имеет ресурсов (как TForm).

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


 
Yaral   (2004-07-24 21:04) [4]

Спасибо буду пробовать!


 
Yaral   (2004-07-26 21:44) [5]

Поробовал... Создал пакет, форму, добавил в нее свойства, а как вызвать для нее RegisterCustomModule? Подскажите пожалуйста!
Кстати эксперт CFPack от Сергея Орлика я так и не смог найти, может дадите ссылку.


 
Юрий Зотов ©   (2004-07-27 04:47) [6]

1. В процедуре Register пакета пишете:
RegisterCustomModule(класс_формы, TCustomModule);

2. Вот здесь Вы найдете аж целых 8 страниц ссылок:
http://www.google.com/search?q=%43%46%50%61%63%6B


 
Yaral   (2004-07-28 00:41) [7]

1. В процедуре Register пакета пишете:
RegisterCustomModule(класс_формы, TCustomModule);

Я сделак как написоно, но при компилировании пакета выдается:

[Error] MDIChildUnit.pas(42): Undeclared identifier: "RegisterCustomModule"
[Error] MDIChildUnit.pas(42): Undeclared identifier: "TCustomModule"
[Fatal Error] MDI.dpk(31): Could not compile used unit "MDIChildUnit.pas"


 
Юрий Зотов ©   (2004-07-28 09:35) [8]

> Yaral   (28.07.04 00:41) [7]

Человек, пишущий собственное дерево форм, вероятно, уже должен знать, для чего служит предложение Uses, где лежат исходники VCL и как использовать поиск слова по ним?
:о)


 
s999   (2004-07-28 19:52) [9]


> Да. Дело в том, что даже если компоненты на форме-предке
> и будут, то после вызова для нее RegisterCustomModule Вы
> все равно получите пустую форму-наследник


Ну, это в общем то преодолимо написанием своего несложного эксперта, который будет "генерить" pas и dfm.


 
Юрий Зотов ©   (2004-07-28 20:05) [10]

> s999   (28.07.04 19:52) [9]

А Вы сами пробовали написать такой эксперт?

Если нет - советую попробовать. Будете сильно удивлены, обнаружив что Ваш dfm напрочь игнорируется. А если просто создать пустую форму-потомок и заливать на нее ресурсы предка "ручками", то слетает визуальное наследование.

А если да, и эксперт, к тому же еще и работает (именно при вызове RegisterCustomModule, потому что просто сгенерить pas и dfm - действительно не проблема) - то советую его продавать. Думаю, успех гарантирован - потому что, насколько я в курсе, за пределами Borland этого еще не смог сделать никто (хотя пытались, причем далеко не новички в этом деле). А то, что сделали в Borland, называется Delphi.


 
s999   (2004-07-28 20:29) [11]


> А Вы сами пробовали написать такой эксперт?


Я нет, но написали мои подчиненные в достаточно крупном проекте. Гм.. оказывается это достаточно нетривиально, а я их "лоботрясами" называл :)

Ну, вот сейчас смотрю их код, вроде ничего особенного нет. Похоже (не уверен) описанная Вами проблема преодолевается через:

TfnCustomFormCreator = class(TIModuleCreatorEx)
private
 ....

Креейтор этот используется при :

procedure TfnCustomFormExpert.RunExpert(ToolServices: TIToolServices);
var
 IModule: TIModuleInterface;
 IModuleCreator: TfnCustomFormCreator;
begin
 if Assigned(ToolServices) then
 begin
   IModuleCreator := TfnCustomFormCreator.Create;
   IModuleCreator.FUseUnits := FUseUnits;
   IModuleCreator.FormClass := FormClass;
   try
     IModule := ToolServices.ModuleCreateEx(IModuleCreator,
      [cmShowSource, cmShowForm, cmMarkModified, cmUnNamed, cmAddToProject]);
     IModule.Free;
   finally
     IModuleCreator.Free;
   end;
 end;
end;

Ну примерно вообщем так, если интересно, то могу покопать в этом "направлении".


 
Юрий Зотов ©   (2004-07-28 21:08) [12]

> s999   (28.07.04 20:29) [11]

> если интересно, то могу покопать в этом "направлении".

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

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


 
s999   (2004-07-29 12:53) [13]

Что-то мне все-таки кажется, что ничего особенного в этом нет. Смотрю в код и вижу только использование Tools API. Может быть, я что-то неправильно понял? Пожалуй просто опишу что есть и функционирует.

Итак, обычное для коллективной разработки требование, после синхронизации версий и перекомпилировании проектов все дизайн-тайм средства должны стать доступны. Недопустимо, чтобы один программист ходил и говорил другому: "А теперь нажми здесь, добавь это, тогда заработает" (это я про репозитарий).

"Синхронизившись и перекомпилившись" я запускаю Delphi и вижу в меню File->New список "наших" форм, кликнув на один из пунктов получаю новую форму (допустим справочник) с лежащими на ней визуальными компонентами и специфичными для справочника свойствами в инспекторе объектов.

Ну вот, собственно, и все. Pas-ы и dfm-ы точно создаются в эксперте кодом, либо из файлов-шаблонов(собственно, тоже кодом).  

P.S. К сожалению, сменился уже и проект и коллектив проекта, поэтому пиво лоботрясам смогу поставить только при встрече, но только если будет точно доказана их гениальность :))


 
Petr V.Abramov   (2004-07-29 13:46) [14]

> s999   (29.07.04 12:53) [13]
 Скорее всего, это сделано так:
   RegisterCustomModule пустой формы с published свойствами
   Помещаем ее наследники с компонентами в репозиторий (стандартный или самопальный)

 Без RegisterCustomModule свойства в Object Inspector не появятся.
 При загрузке ресурсов унаследованной формы IDE пойдет по ее предкам, загружая их dfm, пока не дойдет до формы, которая зарегистрирована через RegisterCustomModule. То есть, все ресурсы предков зарегистрированной формы просто не загрузятся со всеми вытекающими последствиями. Если залить их руками, то при сохранении они весело пропишутся в dfm унаследованной формы с приставкой "object"


 
Petr V.Abramov   (2004-07-29 13:48) [15]

Теоретически можно перехваить stream dfm`a, но при этом придется руками писать сихронизацию свойств. А после этого останется только сделать компилятор - и пол-Delphi готова



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

Форум: "Компоненты";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.04 c
14-1119416444
тихий вовочка
2005-06-22 09:00
2005.07.18
Поступление в ВУЗ


14-1117724473
NightStranger
2005-06-02 19:01
2005.07.18
Какую музыку предпочитаете, г-да программисты?


3-1118228870
paule
2005-06-08 15:07
2005.07.18
Не выполняется запрос!


4-1116776874
psa247
2005-05-22 19:47
2005.07.18
EnumObjects


3-1117977775
xroot
2005-06-05 17:22
2005.07.18
Сравнение дат





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