Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.07;
Скачать: CL | DM;

Вниз

Знатокам ООП вопрос   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
1-19222
LLong
2002-02-19 12:44
2002.03.07
Разные машины


1-19128
niksv
2002-02-20 09:41
2002.03.07
Шестнадцатиричный файл.Как с ним работать?


14-19321
vajo
2002-01-22 12:49
2002.03.07
Win2000


14-19320
Феликс
2002-01-22 02:20
2002.03.07
Оплата через Интернет?


1-19191
avr555
2002-02-18 17:25
2002.03.07
К чему привязано меню!