При работе с окнами вываливается программа (именно exe-шник)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
FunkyMonk
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 26.08.2007 (Вс) 20:08
Откуда: Москва

При работе с окнами вываливается программа (именно exe-шник)

Сообщение FunkyMonk » 27.08.2007 (Пн) 13:16

Всем доброго дня! Прошу помощи, ситуация следующая:
пишу программку, которая взаимодействует с СУБД, все отображение данных из БД вывожу в TDBGrid с использованием Data. Всю внутреннюю обработку данных (редактирование отдельных записей, получение id, других атрибутов из БД) осуществляю с помощью DAO.Recordset.
Так вот, в процессе разрастания программы (добавления новых окон) вдруг обнаружил, именно при работе exe-шника после открытия и закрытия окон программа вываливается с ошибкой: "Приложение ХХХ вызвало ошибку и будет закрыто.....". В среде разработки когда эмулирую работу программы, никаких проблем нет.
Стал пытаться найти место, которое вызывает ошибку, но такое ощущение что это не зависит от какого-то конкретного оператора, а проблемы где-то с инициализацией или окон или переменных DAO.
При этом обнаружил еще один момент в работе программы, если дополнительное окно я открываю модальным, а в основном окне по событию Activate пытаюсь установить фокус на таблицу, то выдается ошибка что вызывается не валидный метод SetFocus. И еще, в процессе поиска места вываливания, ставил отладочные сообщения, в результате наблюдалось, какое-то зацикливание активности двух окон, главного и дополнительного, это все видно было в режиме эмуляции.

Если есть опыт решения похожих проблем подскажите куда зрить?
А так же, подскажите, какие средства отладки и как их можно использовать, применительно к описанной выше проблеме.

FunkyMonk
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 26.08.2007 (Вс) 20:08
Откуда: Москва

В дополнение

Сообщение FunkyMonk » 27.08.2007 (Пн) 15:10

Продолжаю сейчас тестировать программу: вываливается программа железно после следующих действий: запускаю программу-открывается основное окно, нажимаю функц. кнопку-открывается еще одно (дополнительное) окно-пытаюсь в нем, в комбе, выбрать значение-валиться, если ни чего с элементами доп. окна не делать а просто закрыть его то при повторной попытке открыть это окно программа тоже валиться....
что за беда такая? ведь координальных изменений кода с момента версии, которая не падала, не было.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 27.08.2007 (Пн) 15:28

Код кривой. Код в студию! :twisted:
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

FunkyMonk
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 26.08.2007 (Вс) 20:08
Откуда: Москва

Сообщение FunkyMonk » 28.08.2007 (Вт) 9:30

Отдельные фрагменты боюсь ни чего не прояснят, поэтому выкладываю проект целиком. Хотя он достаточно большой.
Необходимо СУБД заюзать, у меня MySQL используется, в проекте есть дампик БД.
Еще в проекте используется True DBGrid и нестандартный прогресбар, .ocx в проекте в папке advpgrbar, их надо подключить к списку компонентов.

Шаги по воспроизведению бага: необходимо запустить программу, в первом окне логинимся, вводим имя: ulanov и жмем кн. ОК (пароль не проверяется), далее открывается основное окно, в нем внизу жмем кнопку редактирования заявки (карандашик), откроется окно с содержимым заявки, закрываем его и снова пытаемся его открыть, программа должна вывалиться.
Второй вариант: делаем все аналогично первому, после открытия окна редактирования заявки пытаемся в комбе установить любое значение, программа валиться.
Третий вариант: аналогично первому, после открытия окна редактирования заявки внизу жмем кнопку редактирования записи (тоже карандашик), программа валиться.

Хотел подчеркнуть еще, что по отдельности вроде все окна работают корректно, т.е. если каждое окно с его функционалом в виде отдельной программы закомпилить.
Из последних изменений, после которых все стало падать - добавил в основное окно меню, пункты которого вызывают процедуры обработки аналогичных кнопок.
Вложения
wizit.rar
Архив с проектом, смотрите, к сожалению комментариев маловато, постараюсь здесь же на форуме необходимые места пояснить.
(347.75 Кб) Скачиваний: 100

FunkyMonk
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 26.08.2007 (Вс) 20:08
Откуда: Москва

Сообщение FunkyMonk » 29.08.2007 (Ср) 11:33

Опытным путем пока выясняется, что причина в работе с DAO. Подскажите, какие есть ограничения на его применение: имена переменных, кол-во подключений. Возможно есть какие-то проблемы связки DAO с драйвером ODBC для MySQL.
Может что-то я делаю не так, у меня в каждом окне, где происходят обращения к БД, описаны переменные (с одинаковыми именами):
Код: Выделить всё
Dim wsZ As Workspace
Dim DB As Database
Dim rsZ1 As DAO.Recordset

Далее, во время загрузки окна они инициализируются:
Код: Выделить всё
Set wsZ = CreateWorkspace("", "root", "", dbUseODBC)
Set DB = wsZ.OpenDatabase("zaiavka", dbDriverNoPrompt, True, "ODBC;DSN=zaiavka;DATABASE=zaiavka;UID=root;PWD=;")

После чего, данные из БД я получаю так:
Код: Выделить всё
Set rsZ1 = DB.OpenRecordset("SQL запрос", dbOpenDynamic)
ПеременнаяХ = rsZ1.Fields(Х)

Посмотрите, может есть явные ошибки, или какие-то правила не соблюдаются.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 29.08.2007 (Ср) 11:52

Ну перехвати ошибку и посмотри ее сообщение.
И выясни строку на которой валится - оно же несложно...

p.s True DBGrid далеко не у всех есть и ставить его ради данного примера ну дюже не охота...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

FunkyMonk
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 26.08.2007 (Вс) 20:08
Откуда: Москва

Сообщение FunkyMonk » 29.08.2007 (Ср) 12:34

Похоже, ответ найден.
У меня использовалась библиотека Microsoft DAO 3.6, при этом существуют версии по старей, и еще есть библиотека Microsoft DAO 2.5/3.51 Compatibility Library, как только подключил её вместо 3.6 программа перестала валиться.
О как!
А собственно, начал копать в сторону инициализации WorkSpace, Database и обнаружил что для новых версий DAO это делается несколько иначе (можно использовать метод OpenConnection), возможно если переписать для новой версии, то и с 3.6 будет работать.

FunkyMonk
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 26.08.2007 (Вс) 20:08
Откуда: Москва

Сообщение FunkyMonk » 29.08.2007 (Ср) 12:40

Andrey Fedorov писал(а):Ну перехвати ошибку и посмотри ее сообщение.
И выясни строку на которой валится - оно же несложно...

да вот я и хотел узнать по подробней как это сделать, Debug не умею пользоваться, во всяком случае на подозрительных местах я не смог правильно вызвать Debug.Print. Если подскажешь, на примере вот этого кода (т.к. все сходилось сюда), буду благодарен
Код: Выделить всё
Set rsZ1 = DB.OpenRecordset(qUser2 & intUserIn_Id, dbOpenDynamic)

Andrey Fedorov писал(а):p.s True DBGrid далеко не у всех есть и ставить его ради данного примера ну дюже не охота...

согласен, но сами же попросили код в студию... я то начал вопрос из далека: "были-ли у кого аналогичные ситуации, и каким средствами можно отлаживаться", к исследованиям кода не склонен был...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 29.08.2007 (Ср) 13:09

FunkyMonk писал(а):да вот я и хотел узнать по подробней как это сделать, Debug не умею пользоваться, во всяком случае на подозрительных местах я не смог правильно вызвать Debug.Print.


Debug.Print работает только из IDE, да здесь он и не нужен.

По Help-у почитать про On Error.

Примитивно - чтобы вычленить вызывающую падение строку иногда можно навставлять MsgBox-ов с цифирками - увидишь до какого не дойдет...

FunkyMonk писал(а): Если подскажешь, на примере вот этого кода (т.к. все сходилось сюда), буду благодарен


Код: Выделить всё
Sub ТвояПроцедураИлиФункция
   On Error Goto Err_
   Set rsZ1 = DB.OpenRecordset(qUser2 & intUserIn_Id, dbOpenDynamic)
   ...
   Exit Sub

Err_:
   Msgbox Err.Description, vbCritical, "Ошибка № " & Err.Number
End Sub
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

FunkyMonk
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 26.08.2007 (Вс) 20:08
Откуда: Москва

Сообщение FunkyMonk » 29.08.2007 (Ср) 13:29

Спасибо! В будущем попробую использовать..
Andrey Fedorov писал(а):Примитивно - чтобы вычленить вызывающую падение строку иногда можно навставлять MsgBox-ов с цифирками - увидишь до какого не дойдет...

ну а это то очевидно, именно с этого я и начал, но когда ставишь сообщения изменяется динамика работы программы, что влияет на причины ошибок, так например у меня было с комбиком, когда сообщением я стопил работу все работало, как только убирал сообщение снова вываливались ошибки.
В описанном случае я выяснил что место это связано с DAO, в одном месте еще при создании коннекции, а в другом, при выполнении запроса... но знаний этих было абсолютно недостаточно, т.к. ранее этот код работал и в последствии не модернизировался, поэтому я попал в тупик, почему я и написал сюда

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 29.08.2007 (Ср) 14:46

FunkyMonk, почитай темы (возможно, что-то полезное почерпнешь):
http://bbs.vbstreets.ru/viewtopic.php?t=25841
http://bbs.vbstreets.ru/viewtopic.php?t=11863
http://bbs.vbstreets.ru/viewtopic.php?t=473

Почти во всех программах сейчас юзаю MZTools + HuntErr -- очень удобно добавлять шаблончик обработчика ошибок.

P.S. Если не секрет, почему используешь DAO, а не ADO?
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 29.08.2007 (Ср) 16:52

Хм.. У меня была похожая фигня, никак правда не связанная с БД..
Когда из формы по комбинации клавиш вызывалось модальное окошко для ввода данных. После чего прога падала при закрытии или сворачивании этого окошка.. Причем только в экзешнике..
On Error Resume Next эффекта не давало... Решилось по-идиотски. После открытия окна, но перед провркой возвращаемого значения воткнул DoEvents. Заработало.
Бред. ))
label:
cli
jmp label

udpn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 24.07.2007 (Вт) 11:43

Сообщение udpn » 30.08.2007 (Чт) 8:13

Если создавать TextBoxы (Multiline = True, ScrollBars = Both, Index = Count), менять Container, а после этого завершать приложение Endом можно получить в некоторых случаях вылет с нехорошим окошком. Помогает введение процедуры UnMain, из которой выгружать все созданные элементы. Однако при отладке кнопка End на панели дает тот же результат. Могу поделиться исходником.

Глюков в самом вб несчетное множество, что же говорить о dll...
Не ищите смысла там, где его не ложили (c) проф. В.В. Горяйнов

FunkyMonk
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 26.08.2007 (Вс) 20:08
Откуда: Москва

Сообщение FunkyMonk » 30.08.2007 (Чт) 11:15

VVitafresh
Спасибо за ссылки! А указанные средства отладки можешь кинуть мне на ящик?
VVitafresh писал(а):P.S. Если не секрет, почему используешь DAO, а не ADO?

Да честно говоря почитав на этом же форуме и еще где-то информацию, понял что принципиальной разницы нет, посему в хелпах к VB просто подсмотрел примерчик, опробовал его на себе, он заработал, и был написан он с использованием DAO, так оно и пошло.
Вообще я с VB впервые столкнулся, просто до этого пришлось для редактирования документов Word написать множество макросов, а потом появилась задачка с БД, C-шником давно не пользовался, вот и решил начать с VB, расчитывал на простоту написания кода. Так что, это первый опыт, а для него не важно было с чего начинать, главное начать! )))
А вот теперь, уже начинаю копать глубже, посмотрим, может найду для себя какое-то иное, более эффективное решение.
Последний раз редактировалось FunkyMonk 30.08.2007 (Чт) 11:30, всего редактировалось 1 раз.

FunkyMonk
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 26.08.2007 (Вс) 20:08
Откуда: Москва

Сообщение FunkyMonk » 30.08.2007 (Чт) 11:19

udpn
Хм, интересные вещи... т.е. какой-то глюк библиотек или компилятора...
Могу поделиться исходником

Давай.... интересно так же как определить набор созданных элементов, который следует закрыть.... т.к. у меня в зависимости от ветки кода может быть создан или не создан ряд переменных.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 01.09.2007 (Сб) 16:40

FunkyMonk писал(а):VVitafresh
Спасибо за ссылки! А указанные средства отладки можешь кинуть мне на ящик?

http://www.mztools.com/v3/mztools3.aspx
http://www.urfinjus.net/UJv3/prodvb6/hunterr.aspx
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Majestic-12 [Bot] и гости: 53

    TopList  
cron