![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с фиксингом глобальных ссылок при десериализации формы [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]А каким образом Вы читаете форму?