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

Вниз

Обращение к БД при активизации формы   Найти похожие ветки 

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

Наверх




Память: 0.53 MB
Время: 0.11 c
2-1136559332
_kostet
2006-01-06 17:55
2006.01.22
RAISERROR


9-1122809087
Gamer
2005-07-31 15:24
2006.01.22
GLScene


4-1131538341
Spose
2005-11-09 15:12
2006.01.22
Скрыть окно чужого приложения


2-1136221175
St74
2006-01-02 19:59
2006.01.22
Как использовать данную Функцию!


2-1135800242
KvORubin
2005-12-28 23:04
2006.01.22
Пацаны, Как просто удалить файл???