Форум: "Компоненты";
Текущий архив: 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