Андрей Пащенко дата публикации 18-08-2003 20:46 КАТЕГОРИЯ | | ПРОГРАММИСТ .TFrame.Визуальное наследование "врукопашную" и его последствия | ПРОДУКТ | | Delphi | ПЛАТФОРМА | | |
В Delphi 7 при создании наследников от TFrame, а затем создания на их
основе новых наследников с последующим созданием объектов возникает
ошибка.
Условия:
Создаем проект. В данном проекте создаем новый модуль. В нем
прописываем наследника от TFrame.
TMyFrame = class(TFrame)
private
protected
public
procedure MyProcedure1; virtual; //добавляем новую функциональность.
procedure MyProcedure2; virtual;
published
end;
Далее в проекте создаем фрейм (TBadFrame) и меняем его родителя с
TFrame на TMyFrame.
На данном этапе проект работает и ошибок не появляется.
Сохраняем проект и закрываем его.
Открываем проект снова. Вызываем для визуального редактирования TBadFrame.
Получаем ошибку
Error reading ***. TabOrder: Property TabOrder does not exist.
После игнорирования данной ошибки и последующего полного перекомпилирования проекта
во время создания фрейма возникает ошибка:
Error reading ***. OldCreateOrder: Property OldCreateOrder does not exist.
- Создавать наследников TFrame в "чистом" модуле нельзя. Создание
базового фрейма (например TMyFrame), от которого планируется создание
наследников (TBadFrame), необходимо осуществлять стандартными средствами
Delphi, т.е. File->New->Frame.
Затем произвести все изменения, которые будут общими для наследников.
Для создания наследника от базового фрейма (TMyFrame), необходимо
пользоваться стандартными средствами Delphi. Выбрать File->New->Other.
Зайти на закладку соответствующую Вашему проекту. Там выбрать базовый
фрейм (TMyFrame).
Созданный фрейм будет являться наследником базового.
IMHO, это не ошибка Delphi, а именно подводный камень, который может
подстерегать Жителей Королевства, пытающихся решить определенную
проблему на первый взгляд очевидным решением (ручным кодингом).
В данной ситуации ручное кодирование намного сложнее, чем решение
проблемы вcтроенными средствами Delphi.
Проект прилагается: StoneTest_61.zip.
Обсуждение аналогичной ситуации на Круглом столе:
Это типичная ошибка программиста. Следует знать, что файл dfm - не просто "тупой ресурс",
а визуальное описание класса формы или фрейма, содержащегося в файле pas. При визуальной
разработке штатными средствами IDE Delphi следит за соответствием pas и dfm. А если
программист решил сам "подкорректировать" наследование класса формы или фрейма, он должен
внести соответствующее изменение и в dfm. Какое именно — можно увидеть, просматривая
текст dfm, получившийся в результате нормального визуального наследования.
А именно, волшебное слово inherited вместо object там, где фрейм
(или форма) произошел не от TFrame (или TForm), а от производного класса.
То же самое наблюдается и в отношении всех вложенных объектов (унаследованные объекты определены
как inherited, в отличие от вновь вставленных (object)).
При этом, естественно, новый базовый фрейм (или форма) должен иметь свой файл dfm,
даже если в нем не изменены и не добавлены никакие published свойства или вложенные
объекты. Так уж устроена VCL.
Зная всю эту "кухню", можно даже обходиться и без IDE, набирая dfm руками и компилируя проект
компилятором командной строки dcc32.exe.
[TForm] [TFrame] [DFM] [Дизайнер форм] [Репозиторий объектов] [Структура VCL-приложения] [Визуальное наследование форм]
Обсуждение материала [ 14-10-2003 04:35 ] 7 сообщений |