Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
У меня есть какаята форма, скажем TCustomForm, которая имеет constructor Create(Param1,....); virtual;
Далее я создаю кучу наследованных форм от TCustomForm.
В базе данных записан тип формы который создал запись, ну скажем TCustomForm1,
и далее я хочу чтобы данную запись редактировала форма TCustomForm1.
Я пишу. TCustomForm(FindClass(Table.FieldByName('ClassName').AsString)).Create(Param1, .....), почему то не работает,
Или я что-то не так делаю?
A>>Это тодстаточно сложная тема чтобы можно было на нее ответить в сообщении. A>>Можешь посмотреть мою статью на эту тему:
А>Я пишу. TCustomForm(FindClass(Table.FieldByName('ClassName').AsString)).Create(Param1, .....), почему то не работает, А>Или я что-то не так делаю?
Это возможно только если параметры конструктора стандартные для всех классов.
Иначе компилятор не знает как вызывать конструктор.
Короче ты можешь класс по имени создать если у него есть стандартный конструктор с параметром Owner
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
A>>Это тодстаточно сложная тема чтобы можно было на нее ответить в сообщении. A>>Можешь посмотреть мою статью на эту тему:
A>>http://www.softforum.ru/html/index.asp?id=items&group=cps.borland.delphi&topic=item221101
А>Проблема не решается.
А>У меня есть какаята форма, скажем TCustomForm, которая имеет constructor Create(Param1,....); virtual; А>Далее я создаю кучу наследованных форм от TCustomForm. А>В базе данных записан тип формы который создал запись, ну скажем TCustomForm1, А>и далее я хочу чтобы данную запись редактировала форма TCustomForm1. А>Я пишу. TCustomForm(FindClass(Table.FieldByName('ClassName').AsString)).Create(Param1, .....), почему то не работает, А>Или я что-то не так делаю?
Попробуй разделить код на строчки и посмотреть, в какой момент вылетает ошибка:
type
TCustFormClass = class of TCustomForm;
function CreateCustForm(ClassName: String, Param1: ...): TCustomForm;
var
FormClass: TCustFormClass
begin
FormClass:= TCustFormClass(FindClass(ClassName));
Result:= FormClass.Create(Param1, ...);
end;
Скорее всего, проблема в том, что FormClass оказывается нилом. Это означает, что он не был правильно зарегистрирован. Чудес-то не бывает. Тогда надо не забыть пойти во все формы, которые были созданы, и добавить такую штуку в секцию инициализации соответствующих модулей:
RegisterClass(TMyCustForm1);
А дальше — включить галочку "Use debug DCUs" в опциях компилятора и пользоваться брекпойнтами.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте Andrey_Pavlov, Вы писали:
AP>В процедуру передаётся наименование класса в виде строки, AP>как создать класс с заданным именем.
если объект — то так:
OurClass := FindClass(ClassName);
if Assigned(OurClass) then
result := OurClass.Create
else
result := nil;
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))