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