Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.063 c
2-1136560210
sx
2006-01-06 18:10
2006.01.22
Excel


2-1135909201
ezorcist
2005-12-30 05:20
2006.01.22
Компонент NMSMTP


1-1134762156
Pavel__
2005-12-16 22:42
2006.01.22
Как узнать что в системе установлен хотя бы один принтер?


2-1136511035
Kolya
2006-01-06 04:30
2006.01.22
Удаление в ListView


14-1135334312
Pazitron_Brain
2005-12-23 13:38
2006.01.22
Прочитайте статью





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский