Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-19047
harismatik
2002-02-06 16:55
2002.03.07
Аналог команды RecNo в Interbase


4-19396
BorisM
2002-01-07 19:40
2002.03.07
Как сделать Paste в другое приложение


1-19215
gary-gary
2002-02-18 10:57
2002.03.07
Проблема в работе с массивом


3-19077
Rub
2002-02-08 11:54
2002.03.07
Софтина использует BDE алиас типа для работы с корпоративной БД.....


7-19354
ashep
2001-11-30 09:33
2002.03.07
Помогите с портами





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский