Форум » GUI » Вылет из программы... » Ответить

Вылет из программы...

Andrey: Всем привет ! Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) ? Т.е. хочу сделать сразу после появления MsgBox() вызов 2-3 функций и потом сделать DbCloseAll(). Как это реализовать ? Для чего это нужно, поясню: при входе в свою программу я пишу в базу кто и когда вошел в программу (логин пользователя). И при выходе из программы, стираю этого пользователя из базы. Если программа "вылетает", то юзер числится как работающий. Древнее наследие с клипера, хотел переделать, да так и осталось.

Ответов - 173, стр: 1 2 3 4 5 6 7 8 9 All

SergKis: Andrey пишет Можно как то избавиться от такой ошибки ? Думаю да, если планировать (на все приложение, на отдельные окна) используемые фонты и регистрировать их DEFINE FONT ... для дальнейшего использования, ненужные потом удалять. Ты используешь SIZE nFontSize, но не используешь имя FONT, вот что то где то потерялось в процессе работы

Andrey: Т.е. достаточно сделать [pre2]FONTCOLOR BLACK BACKCOLOR WHITE FONT cFont SIZE nFontSize PICTURE cFormat ; [/pre2] И ошибка исчезнет ? 6 часов использовали эту карточку периодически, а потом бах - ошибка...

Andrey: Версия МиниГуи 23.12 Моя большая система собирается и запускается отлично. Я уже порадовался, наконец то Харбор починили.... А НЕТ, не до конца ! Вот код:[pre2] :Event(500, {|ow,ky,cBtn| Local cRun, cFun, aPar, cPar, nPos, o, cMsg ky := ow o := This.&(cBtn).Cargo cRun := o:cRun nPos := At("{", cRun) cFun := Left(cRun, nPos-1) cPar := Subs(cRun, nPos) aPar := &(cPar) ? ProcNL(), "[" + cFun + "]", cPar, HB_ValToExp(aPar) IF !hb_IsFunction( cFun ) // здесь выдаёт ошибку ! cMsg := "Ошибка !;" cMsg += "Нет такой функции "+cFun+"("+cPar+") в ЕХЕ-файле !;" cMsg += 'Обратитесь к разработчику программы;;' cMsg += ProcNL() + ";" + ProcNL(1) AlertStop(cMsg, "Запуск модуля") ? SPACE(5) + cMsg ELSE hb_ExecFromArray(cFun, aPar) // запуск ф-ии ENDIF Return Nil } )[/pre2] Нажимаю на кнопку и у меня выдаётся ошибка: Беру, удаляю папку OBJ в проекте и компилирую с версией МиниГуи 29.09.2 + Harbour с версии МиниГуи 23.01 И о чудо, эта ошибка не появляется... И как это понимать ? Что там в Харборе сделали ???


alex_II: Несколько раз читал эту ветку, когда пытался решить проблему с потерей окна, результат отрицательный. Имеется у клиента: Operating system...: Windows 7 6.1 SP1 память 4 Гб MiniGUI version....: Harbour MiniGUI Extended Edition 24.01 (32-bit) ANSI Harbour version....: Harbour 3.2.0dev (r2312082217) Harbour built on...: Dec 11 2023 15:45:54 C/C++ compiler.....: Borland C++ 5.8.2 (32-bit) Multi Threading....: NO VM Optimization....: YES Размер экзешника 5.46 Мб Из окна: DEFINE WINDOW Form_dgrw AT 20,20 WIDTH w_win HEIGHT h_win ; TITLE titl MODAL NOSYSMENU NOSIZE ... Вызывается окно поиска : DEFINE WINDOW Form_sityFind AT 20,20 WIDTH w_win HEIGHT h_win ; TITLE tit MODAL NOSYSMENU NOSIZE ... по завершению поиска через пару секунд оно закрывается: Form_sityFind.Release и иногда, выдаётся ошибка на строку с Release: Error MGERROR/0 Window: Form_sityFind is not defined. Program terminated Уже давно при создании любых окон делаю сборку мусора.

gfilatov2002: alex_II пишет: Благодарю за полное описание ситуации и используемых инструментов. иногда, выдаётся ошибка на строку с Release Да, в таком сценарии это возможно. Поэтому рекомендую всегда использовать в таком случае команду DO EVENTS перед закрытием модального окна: DO EVENTS Form_sityFind.Release Надеюсь, это поможет решить проблему

Andrey: Нужно смотреть сам код этого окна и поиска. Лучше переделать на события, как советует Сергей. Мне это помогло.

Andrey: Вот очередная непонятка в МиниГуи. Вылет по ошибке и опять на Alert*(): [pre2]Error BASE/1132 Переполнение массива: Неверное количество аргументов Args: [1] = A { ... } length: 2 [2] = N 3 --------------------------------- Stack Trace --------------------------------- Called from EVENTS(0) Called from REDRAWWINDOW(0) Called from _REDRAWCONTROL(0) Called from _SETFONTCOLOR(0) Called from SETPROPERTY(0) Called from (b)SHOWERROR(0) Called from DO_WINDOWEVENTPROCEDURE(0) Called from FILLDLG(0) Called from HMG_ALERT(0) Called from _ALERT(0) Called from ALERTSTOP(0) Called from SHOWERROR(0) Called from DEFERROR(0) Called from (b)ERRORSYS(0) Called from EVENTS(0) Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from HMG_ALERT(0) Called from _ALERT(0) Called from ALERTYESNO(0) Called from RECNOINSERT(970) in module: form_4menu1butt2_tsb.prg Called from RECNOINSERT_TSB_PLTV1(26) in module: form_4menu1butt2_tsb.prg Called from (b)VVODCARDOPLATA(278) in module: form_4menu1butt2_card.prg Called from _DOCONTROLEVENTPROCEDURE(0) Called from EVENTS(0) Called from DOMESSAGELOOP(0) ....[/pre2] Код [pre2] IF AlertYesNo( "Вставить запись в таблицу ?", "Добавление записи" ) // строка 970 [/pre2] Ну и как правильно сделать ?

Andrey: Поймал вылет из программы без ошибки и без создания ErrorLog.htm Прога падает и всё... На простой функции [pre2] oBrw:FilterFTS( cVal, .T. ) [/pre2] Полдня бился с этим, пока не догадался отключить индекс на базу. Без него перестала падать прога и поиск пошёл. Почему так получается ? Как бы получать ошибку и не гадать что случилось ?

SergKis: Andrey пишет Полдня бился с этим, пока не догадался отключить индекс на базу. Без него перестала падать прога и поиск пошёл. Если бы ты задумался над своим тсб, то, понял, что колонка COLNUMBER { 1 , 50 }, которая заточена на работу с тэгом и oBrw:FilterFTS(cVal, .T.) несовместимая штука (oBrw:nLen подсчет свой), то не потерял бы время. Что бы совместить надо ручками потрудиться, написав обработчики ситуаций для совместной работы алгоритмов. PS Взяв в begin sequnce oBrw:FilterFTS(cVal, .T.), получил бы в лог сообщение, обработав.

Andrey: SergKis пишет: Что бы совместить надо ручками потрудиться, написав обработчики ситуаций для совместной работы алгоритмов. Это как ?

SergKis: Andrey пишет Это как ? Как обычно, вводишь признак работы по SET SCOPE TO ... или :FilterFTS(...) по вхождению и в колонку COLNUMBER { 1 , 50 } ставишь, например, в oCol:bDecode (oCol:bValue) и oCol:cFooting блоки кода, учитывающий состояние признака

Andrey: Не понял как. Вот есть первое обращение к [pre2] oRpt:FilterFTS( cVal, .T. ) [/pre2] Что нужно поставить для проверки ? А то методом тыка понял что там вылетает....

SergKis: Andrey пишет Что нужно поставить для проверки ? oRpt:FilterFTS( cVal, .T. ) меняет блок кода oBrw:bLogicLen, который (для dbf) до него имеет значение ::bLogicLen := {|| ( cAlias )->( iif( IndexOrd() == 0, LastRec(), ordKeyCount() ) ) } после вызова метода ::bLogicLen := {|| nLen } Если урезать просмотр тсб по SET SCOPE TO ... - это по ключу слева, а урезать просмотр тсб по oBrw:FilterFTS(cFind, lUpper, lBottom, lFocus, lAll) - это по вхождению значения в символьные поля при lAll := .F. [default] или во все поля при lAll := .T. Колонка COLNUMBER { 1 , 50 } вывод блоком кода таким (по тэгу) DEFINE COLUMN oCol DATA 'hb_ntos(iif( IndexOrd() > 0, ORDKEYNO(), RecNo() ))' ; с oBrw:FilterFTS(...) будет давать "дырки" в значениях, по идее надо делать нормальную нумерацию



полная версия страницы