Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2010, 16:53   #1
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию ГЛЮКИ при наследовании фреймов Delphi 7

Здравствуйте.

Хотел написать конкретную проблему, но, замечал раньше, а сейчас, при попытке решить эту проблему разными способами, выяснилось, что делфя просто категорически не желает нормально работать с фреймами, созданными на основе какого-либо.

Вот, для примера.

есть фрейм, пусть, для определённости, frmRec
есть его наследник - frmRecNew

у наследника, чтобы он заработал, в тексте файла-наследника фрейма заменил вручную

object frmRecNew: TfrmRec
на
inherited frmRecNew: TfrmRec

фрейм создаётся динамически (т.е. нужный тип определяется в программе)

при старте delphi периодически вываливается сообщение, что-то вроде ancestor TfrmRecnew not found (пишу по памяти), но фиг с ним, всё компилировалось, работало. Сообщение позже даже появляться перестало

В общем, всё работало прекрасно, пока, в один момент не докидал на наследника контролов. И тут же поправил контролы у предка (которые наследуется) Теперь, при попытке инициализации фрейма, валится с ошибкой "Control 'Label_new' has no parent window."

Полчаса долбился, пытаясь разобраться, наконец-то сделал так. Удалил все новые контролы, на наследнике, и наставил их заново, на те же места, точно так же называя - всё работает! ошибка не вылазит

Позже специально пробовал - открываю (блокнотом) ufrmSpecERI.pas - вставляю в объявлении новый контрол, открываю ufrmSpecERI.dfm, делфёй (может, в этом дело??), вставляю там его же объявление
Код:
  object Label_New: TLabel [1]
    Left = 65
    Top = 112
    Width = 35
    Height = 13
    Caption = 'Обозн.'
  end
закрываю всё, открываю проект, запускаю, при попытке вызова формы - та же ошибка, "Control 'Label_new' has no parent window."
Удаляю вручную созданный лабел, кладу на форму новый, называю его LabelNew, даже значения свойств дал те же самые, - проверяю, в файле фрейма записано то же самое, что я до этого вставлял вручную, в объявлении - тоже. Всё работает.

Мистика какая-то. Может, это нормально, и уже на сто раз встречалось? Погуглил - ничего толкового не нашёл
AnTe вне форума Ответить с цитированием
Старый 09.12.2010, 17:28   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Сколько работаю с фреймами, запомнил одну истину - с этим зверем нужно аккуратнее. Накидал один раз компонентов на него, все на экземпляре куда вставляешь компоненты не кидай, не удаляй на экземпляре, не дыши на него.
Потому многие программисты и не рекомендуют Фреймы, ибо в них очень легко нарваться на неприятность.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.12.2010, 05:57   #3
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

Спасибо, что-то подобное я и предполагал.

Но вот что мне не даёт покоя. В чём принципиальная разница, как эти фреймы создавать?

Почему, когда я угрохал из фрейма проблемную кнопку, и поставил её заново, в дезигн-тайме, - проблема исчезла?

Ведь код фрейма, в pas-файле и при просмотре dfm - идентичен!

Более того - если этот же код после удаления в файлы фрейма вписать вручную - кнопка на форме появляются, но после её вызова - те же проблемы....

по идее - какая разница, каким образом созданы pas и dfm-файлы?

полагаю, тут только два варианта.

1. У delphi хранятся какие-то хвосты, о создании
2. (по мне - наиболее вероятный) что-то важное хранится в dfm-файле, ведь это не простая текстуха.

может, кто-нибудь разбирал, что за зверь такой - формат dfm ?

Моя необходимость разобраться в том, что вся логика программы завязана на этой куче наследников фрейма, и всё работает прекрасно, просто офигенно, но теперь появилось опасение, что неожиданно в какой-то (как обычно, самый неудачный) момент всё ёкнется. Как бы подстраховаться. В тексте формы, и в текстовом виде dfm-файла ничего сложного нет. Где же возникают сложности?
AnTe вне форума Ответить с цитированием
Старый 10.12.2010, 09:02   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ничего не могу посоветовать кроме как... Сменить стратегию.
Не работал с фреймами глубоко по вышеуказанной причине. Меня вполне устраивает их обычное контейнерское назначение. Динамически на них ничего создавать не стараюсь, дабы избежать сложностей.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызываются конструкторы объектов при наследовании? TwiX Общие вопросы C/C++ 10 17.11.2010 13:59
TMediaPlayer DisplayRect - глюки при изменении Dmitry333 Мультимедиа в Delphi 6 22.03.2010 22:35
глюки при численном интегрировании (Delphi) Bazookин Помощь студентам 5 23.04.2009 13:12
Перегрузка == при наследовании paramon Общие вопросы C/C++ 5 17.06.2008 00:17