Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Подводные камни
  
О разделе

Список по категориям
Общий список

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  08:07[Войти] | [Зарегистрироваться]

ПРОГРАММИСТ.TFrame.Визуальное наследование "врукопашную" и его последствия

Андрей Пащенко
дата публикации 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.



Типовые решения
  1. Создавать наследников 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 сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования