![]() |
|
|
![]()
|
|
| iDeus |
|
||||||
![]() Deus vult ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 5.6.2008 Где: Vladivostok Репутация: нет Всего: нет |
Здравствуйте, помогите пожалуйста разобраться в такой ситуации:
Есть 2 формы, UsersForm и UserAddForm, которые наследуют друг друга. На форме UsersForm лежит заполненный StringGrid. На этой же форме кнопка, по нажатию которой, модально выводится UserAddForm В UserAddForm сравниваются введенные там данные с данными в StringGrid'е на первой форме. Компилятор не выдает ошибок, но при попытке выполнить сравнение выводится ошибка: ![]() Обращаюсь к СтрингГриду так:
В чем может быть проблема? Пробовал переносить TStringGrid *sg_users; в UserAddForm.h из __published в public, так при компиляции вообще пишет, что класс TStringGrid не найден. Само собой, правильность индексов элементов СтрингГрида к которым обращаюсь перепроверил. На всякий случай: UsersForm.h
UserAddForm.h
|
||||||
|
|||||||
| artsb |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Вы делаете цикл по строкам от 1 до UsersForm->sg_users->RowCount. А это не правильно. Индексы идут от 0 до (UsersForm->sg_users->RowCount - 1). Если вам нужно просто пропустить первую строку (если это шапка таблицы, например), то:
Добавлено через 4 минуты и 26 секунд И зачем вам бежать по всем записям, если вы изменяете один единственный флаг. Лучше так:
Это сообщение отредактировал(а) artsb - 6.10.2011, 10:51 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||
|
|||||
| iDeus |
|
||||||
![]() Deus vult ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 5.6.2008 Где: Vladivostok Репутация: нет Всего: нет |
artsb, исправил, как вы сказали, но это не помогло.
похоже проблема все-таки с доступом к СтрингГриду. проверил это так: добавил перед циклом ShowMessage(UsersForm->sg_users->Cells[1][1]); в результате увидел туже самую ошибку. Более того, подобная ошибка выводится если, пробоваться обращаться к компоненту PSQLQuery, который как и СтрингГрид лежит на первой форме. (стрингрид заполняется из результата запроса к Pg) Может какая-то ошибка в наследовании? В первой форме я наследую вторую:
Во второй - первую:
Вот код функции, где все происходит (кнопка на второй форме)
|
||||||
|
|||||||
| artsb |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
iDeus, а попробуйте так:
Плюс, можете поставить точку останова на эту строку и посмотреть валидны ли указатели UsersForm и sg_users. Тут естьдва варианта, ИМХО: 1. В СтрингГриде нет записей. 2. Вы убрали форму UsersForm из списка автосоздаваемых. Потом создаёте эту форму отдельно, но всё ещё обращаетесь по указателю UsersForm, который, естественно, не валиден. Попробуйте ещё вместо строчки
написать так:
-------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||||
|
|||||||
| iDeus |
|
||||||||
![]() Deus vult ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 5.6.2008 Где: Vladivostok Репутация: нет Всего: нет |
Приводит к той же ошибке. Да, вы совершенно правы, форма убрана из автосоздаваемых и создается отдельно, из предыдущей формы.
Насколько я понял, трюк с динамическим преобразованием именно для этого случая. Попробовал заменить
на
но это ни к чему не привело. Условие if(frm) не выполняется, а если вынести ShowMessage(frm->sg_users->Cells[1][1]); за if, то это приводит к появлению все той же ошибки. ![]() СтрингГрид не пуст. Может я не верно понял, что нужно сделать с dynamic_cast, что все заработало? |
||||||||
|
|||||||||
| artsb |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Вы при создании формы UserAddForm также указываете Owner'ом Application?
Если да, то тогда у вас два пути: 1. Передавать указатель на форму UsersForm в конструктор UserAddForm. И далее использовать его. 2. Создавать форму UserAddForm так:
и потом делать как я уже писал:
-------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||
|
|||||
| iDeus |
|
|||
![]() Deus vult ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 5.6.2008 Где: Vladivostok Репутация: нет Всего: нет |
artsb, большое спасибо. Все заработало.
При создании UserAddForm, указал владельцем this, а дальше через
Еще раз спасибо. |
|||
|
||||
| artsb |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2280 Регистрация: 17.7.2007 Где: центр Вселенной Репутация: 39 Всего: 64 |
Кстати, совсем забыл, есть же ещё третий вариант
- При создании формы UsersForm использовать глобальный указатель, т.е. это
заменить на:
И теперь в форме UserAddForm использовать указатель UsersForm как обычно. Просто у вас получилось так: есть глобальный указатель на форму TUsersForm - UsersForm. Он объявлен в конце .h-ника с описанием формы. Но вы объявили ЛОКАЛЬНЫЙ указатель с таким же именем. Вот и получилось, что вы не "видели" эту форму в UserAddForm. Это сообщение отредактировал(а) artsb - 7.10.2011, 08:07 -------------------- Чем отличается умный человек от мудрого? Умный - выпутается из любой ситуации. Мудрый - просто в неё не попадёт. |
||||
|
|||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |