Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с фиксингом глобальных ссылок при десериализации формы [D7]


far ©   (2004-08-21 13:17:00) 

Доброе утро, уважаемые.

Никто не в курсе, почему при чтении формы из бинарного потока, программа на Delphi не фиксит ссылки на глобальные объекты в свойствах компонентов так, как это делается при чтении формы из *.dfm?

Насколько я грешный смог разобраться, при чтении из *.dfm, если компонент имеет ссылки на глобальные объекты, то метод Loaded для него вызывается уже после выполнения GlobalFixupReferences. При чтении из потока этого почему-то не происходит... :(


far   (2004-08-21 14:11:00) [1]

Надо же, немного неправильно описал сабж.

Вообще-то ссылки (имеются в виду ссылки на компоненты, сохраняющиеся в поток в виде имени компонента) правильно привязываются и при чтении из потока, но проблема в том, что это делается уже послезагрузки всех компонентов формы.

При чтении из *.dfm, для компонентов, имеющих глобальные ссылки, метод Loaded вызывается не сразу, а уже после выполнения GobalFixupReferences.
А при чтении из моего файла, Loaded вызывается сразу после считывания компонента, что приводит к аварийной ситуации.

Я не могу понять почему это происходит. В конце концов, в обоих случаях для чтения используются одни и те же процедуры :(


@Ujin   (2004-08-21 13:32:00) [2]

Таким образом у Вас ничего не выйдет. Т.к. при записи в поток типа stm.WriteComponent(AForm)ссылка сохраняется, но при последующей загрузке она будет уже не действительна, т.к. находиться вне формы. А из dfm грузится без вопросов, но если ссылка на объект описанный в varразделе юнита, то Вас ничего не спасет, кроме как явное присвоение ссылок заново.


far   (2004-08-21 13:25:00) [3]

Спасибо за ответ.

AForm.DestroyComponents;
stm := TFileStream.Create('D:\!\1.txt', fmOpenRead);
stm.ReadComponent(AForm);


@Ujin   (2004-08-21 13:20:00) [4]

А каким образом Вы читаете форму?


Наверх

Титульная страница Поиск, карта сайта Написать письмо