Форум: "Начинающим";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
ВнизОбращение к БД при активизации формы Найти похожие ветки
← →
Alex7 (2005-12-30 08:38) [0]Уважаемые мастера! С наступающим Вас!
Помогите, пожалуйста, решить следующую проблему:
В обработчике активизации формы мне нужно
обратиться к одному из полей БД.
Например:
procedure TForm1.FormActivate(Sender: TObject);
begin
r := Table1.Field[0].Text
end;
Компилятор выдает "Access violation".
Т.е, наверное обращаться во время активизации
нельзя. А от значени "r" зависит "Visible" соответствующего
компонента этой формы. Где выход?. Спасибо.
← →
Digitman © (2005-12-30 08:53) [1]
> Компилятор выдает "Access violation".
AV выдает не компилятор, а сама работающая программа.. компилятор тут совершенно ни при чем
скорее всего, объект Table1 в этот момент не существует
> Где выход?
а почему именно OnActivate ?
Это событие будет возникать всякий раз при получении формой фокуса..
А в твоем случае, наверно, достаточно будет единожды прочитать значение из поля таблицы .. к примеру, в обработчике OnCreate
Если же предполагается, что значение этого поля может изменяться в ходе работы программы, то самый простой выход - поместить код считывания значения поля в событие OnUpdate объекта TContainedAction в составе компонента TActionList, брошенного на форму в дизайн-тайм
← →
evvcom © (2005-12-30 09:14) [2]
> к примеру, в обработчике OnCreate
лучше в DataSet.AfterOpen
← →
Digitman © (2005-12-30 09:17) [3]
> evvcom © (30.12.05 09:14) [2]
> лучше в DataSet.AfterOpen
можно и там, но при условии что значение поля не меняется на всём протяжении работы программы
← →
Johnmen © (2005-12-30 09:19) [4]А если ещё и указатель не будет двигаться в НД, то и вообще ничего этого писАть не надо...:)
← →
evvcom © (2005-12-30 09:21) [5]ну да. Я это к части цитаты про OnCreate. Потому как в OnCreate, возможно и очень вероятно, что DataSet.Active = False. Если, конечно, автор еще в дизайне не пооткрывал все наборы сразу. :)
← →
evvcom © (2005-12-30 09:23) [6]
> Johnmen © (30.12.05 09:19) [4]
:-)
Верное замечание. А ежели он все-таки двигаться будет, то и [2] не лучше, а лучше DataSet.AfterScroll
← →
Alex7 (2005-12-30 11:43) [7]Спасибо за участие, но мне кажется, что
решение где-то в стороне.
"After Open" и "OnCreate" проверил. Результат тот же-
-"Access violation".
Значение поля меняется, но эта проблема
меня решена. Я обращаюсь к таблице и
все работает. А вот при открытии формы-нет.
Может быть можно програмно создать
какое-нибудь событие уже после открытия формы
и в обработчик вставить обращение к таблице?
Вот как это сделать не соображу.
← →
Digitman © (2005-12-30 11:51) [8]
> Результат тот же-
> -"Access violation"
и что говорит по этому поводу отладчик ?
← →
Alex7 (2005-12-30 13:31) [9]А что отладчик ? В пошаговом режиме дошел до оператора обращения к полю и при его выполнении " AV процесс остановлен по адресу 00404
в модуле ........... Читай из адреса 00000198 " А что с этой информацией делать моей квалификации не хватает. Даже не знаю, где можно прочитать
что-то на эту тему.
← →
Digitman © (2005-12-30 13:34) [10]поймай брейкпойнт на этой строчке.
наведи курсор мыши на идент-р "Table1" - какой хинт выдишь ?
← →
Плохиш © (2005-12-30 13:43) [11]О, ветка для телепаторов, только свой из ремонта обратно получил :-) Опробуем :-)
Включаем, ага, говорит Table1 или не создана, или не открыта.
← →
Digitman © (2005-12-30 14:03) [12]
> Плохиш © (30.12.05 13:43) [11]
Скорей всего именно так дело и обстоит
← →
Alex7 (2005-12-30 16:35) [13]> поймай брейкпойнт
Поймал. "Inaccessible value". Т.е. предположение
подтвердилось. Но как это совместить с тем, что
все происходит в "AfterOpen"?
← →
Digitman © (2005-12-30 16:42) [14]
> Alex7 (30.12.05 16:35) [13]
чеши репу.
факт отсутствия объекта, на который сей момент должна ссылаться переменная Table1, дебагер подтвердил.
← →
Плохиш © (2005-12-30 16:53) [15]
> Alex7 (30.12.05 16:35) [13]
Можно спросить? Что такое это Table1? Где описано и где создаётся?
← →
Digitman © (2005-12-30 16:59) [16]
> как это совместить с тем, что
> все происходит в "AfterOpen"?
без детального исследования исх.текста - никак.
← →
ASoft (2005-12-30 17:45) [17]Если база создается в DataModul"e, то ессно, создание ее происходит после create главной формы (если не вызван обработчик создания в create гл. формы, конечно). В таком случае можно обратиться к таблице в onShow гл. формы. имхо
← →
Alex7 (2005-12-30 18:25) [18]> Если база создается в DataModul"e
Похоже, что тут и зарыта собака.
База действительно в DataModul"e.
Проверю.
И на этом закрыли вопрос.
Думаю, что беседа была полезной.
Во всяком случае для меня.
Еще раз большое спасибо и с
наступающим Новым годом.
← →
Johnmen © (2005-12-31 01:03) [19]>ASoft (30.12.05 17:45) [17]
>Если база создается в DataModul"e, то ессно, создание ее происходит после
>create главной формы
Уважаемый, откуда вы откопали такую естественность?
Просто интересно....
← →
Alex7 (2005-12-31 04:03) [20]Спешу поделиться. Все оказывается очень просто.
В главном модуле поменял местами
Application.CreateForm(TDataModul, DataModul);
и
Application.CreateForm(TForm1, Form1);
Т.е. модуль данных должен создаваться раньше
формы.
← →
Anatoly Podgoretsky © (2005-12-31 11:51) [21]Неверно, это объект должен создавать до его использования.
← →
Alex7 (2005-12-31 12:44) [22]> Anatoly Podgoretsky
Тем не менее факт налицо. Все заработало
только после перестановки.
← →
sniknik © (2005-12-31 13:18) [23]> Тем не менее факт налицо.
не верь своим фактам, верь Anatoly Podgoretsky - любой обьект должен создаваться до его использования. неважно как и где но до, и еще до уничтожения (т.е. в промежутке между созданием и уничтожением).
а твой факт просто частный случай, создание одного/них обьекта/тов ты вынес раньше создания других. и все.
> Все заработало. только после перестановки.
чудо. обыкновенное чудо.
т.к. (судя по коду в [0]) Table1 никакого отношения к датамодулю не имеет а "лежит" просто на форме (TForm1).
← →
Alex7 (2005-12-31 14:00) [24]> sniknik
Ну приведенный код - упрощенный вариант.
(Я не думал, что ДатаМодуль влияет).
На самом деле Table1 лежит в ДМ.
А мысль о влиянии мне подал ASoft.
Но я еще раз проверю (переставлю обратно),
т.к. в чудеса не верю.
← →
sniknik © (2005-12-31 15:07) [25]> Ну приведенный код - упрощенный вариант.
вот это самая главная ошибка спрашивающих, приводить и обсуждать не то что есть на самом деле.
подумай, если ты приводиш упрощение то должен перенести туда и ошибку, верно? ичаче смысла нет. а если ты ее туда можеш перенести значит знаеш в чем она, так? значит в этом случае в вопросе смысла нет. искать то что и так знаеш где...
упрощение действительно только в одном случае, когда на реальном примере моделируют глюк, и убирают все лишнее а глюк все еще проявляется. только на это почемуто никто время не тратит... проще вопрос в форум кинуть, неутруждаясь. (и + исковеркать исходные данные, чтобы отвечающие свои телепаторы тренировали, не расслаблялись...)
> Но я еще раз проверю (переставлю обратно),
чудо, это то, что непонимаеш как сделано и обьяснить с материальной точки зрения не получается.
можеш не проверять, перенеся создание датамодуля до глайной формы ты перенес и создание лежащего в нем обьекта до того как использовал. (т.е. это частный случай [21])
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.01.22;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.058 c