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