![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Знатокам ООП вопрос [D5]
kaif © (2002-02-20 13:22:00)При загрузке формы из потока методом TReader.ReadRootComponent загружаются компоненты формы, разрешаются внутренние ссылки и затем вызывается метод Loaded каждого загруженного компонента. Затем только разрешаются внешние ссылки (GlobalFixupReferences)
Если же один из компонентов, например IBQuery.Active = True, то так как внешние ссылки еще не разрешены, то возникает исключительная ситуация (не может увидеть компонент IBDatabase, находящийся вне данной формы).
1. Можно ли загрузить форму, не пользуясь ReadRootComponent, а затем вызвать вручную FixupReferences и затем только методы Loaded?
2. Можно ли как-то указать глобальные ссылки до момента вызова ReadRootComponent?
Глобальную процедуру поиска компонентов (FindGlobalComponent) я могу перехватить.
kaif (2002-02-20 20:26:00) [1]>Vuk
Да, компонент IBQuery активизируется во время Loaded, но все глобальные ссылки к этому моменту разрешены, только если все это компилятор уже оттранслировал (в EXE-файле). Загрузка формы в откомпилированном приложении происходит иначе, чем на стадии разработки. Если кто не верит, пусть удалит какой-нибудь компонент с палитры и попробует открыть форму в IDE. Форма прекрасно откроется, выведя сообщение, что такой-то компонент не найден. Однако в EXE-файл такую форму не засунешь (с неизветным компонентом) - компилятор не даст.
Поймите, я создаю искусственную runtime форму, причем читаю ее из потока. Что на этой форме - моя программа не знает, так как форму содал пользователь, пользуясь иными средствами. Форма создается прекрасно (из DFM-файла), все компоненты работают. Но глобальные ссылки не разрешаются к моменту Loaded, так как у меня (точнее, в пакете, которым я пользуюсь) форма создается методом TReader.ReadRootComponent, который разрешает глобальные ссылки послевызова методов Loaded, а до того разрешаются только ссылки между компонентами самойформы. Я внимательно пошагово прогнал ReadRootComponent в Classes и знаю, что говорю. И ищу выход из ситуации.
>Набережных С.
Компонент базы данных существует заранее и связь с базой давно установлена. Проблема не в этом. Я умею ставить компоненты на формы и знаю, когда что происходит.:))
Речь идет не о совсем обычной программе. И я не знаю, как указать глобальные объекты TReader-у перед вызовом ReadRootComponent.
А ООП вот при чем. Методы TReader достаточно запутанные, редко кто имеет с ними дело и мало, кто в них толком разбирается. Логика разрешения ссылок целиком связана с понятиями типа FindNestedComponent, Owner, Parent и т. п., свойственными именно ООП. Методы TReader являются неотъемлемой частью именно компонентной модели VCL, может, даже самой важной ее частью.
Набережных С. (2002-02-20 18:34:00) [2]
> vuk © (20.02.02 14:17)
В данном случае все происходит несколько иначе.
> kaif © (20.02.02 13:22)
Просто не надо ставить датасет на форму, которая создается раньше, чем DataBase. В этом нет никакого смысла.
P.S. И при чем здесь ООП?
vuk (2002-02-20 14:17:00) [3]Обычно в таких случаях реальное открытие набора данных делается в не сразу при чтении значения свойства из потока, а в методе Loaded, как раз тогда, когда уже все ссылки разрешены. Посмотрите, например, методы TDataSet.SetActive и TDataSet.Loaded.