Автор | Сообщение |
|
| постоянный участник
|
Пост N: 5855
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.05.18 21:33. Заголовок: Вылет из программы...
Всем привет ! Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) ? Т.е. хочу сделать сразу после появления MsgBox() вызов 2-3 функций и потом сделать DbCloseAll(). Как это реализовать ? Для чего это нужно, поясню: при входе в свою программу я пишу в базу кто и когда вошел в программу (логин пользователя). И при выходе из программы, стираю этого пользователя из базы. Если программа "вылетает", то юзер числится как работающий. Древнее наследие с клипера, хотел переделать, да так и осталось.
|
|
|
Ответов - 173
, стр:
1
2
3
4
5
6
7
8
9
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 4487
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.12.23 14:33. Заголовок: Andrey пишет Можно к..
Andrey пишет цитата: | Можно как то избавиться от такой ошибки ? |
| Думаю да, если планировать (на все приложение, на отдельные окна) используемые фонты и регистрировать их DEFINE FONT ... для дальнейшего использования, ненужные потом удалять. Ты используешь SIZE nFontSize, но не используешь имя FONT, вот что то где то потерялось в процессе работы
|
|
|
|
| постоянный участник
|
Пост N: 7647
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.12.23 14:56. Заголовок: Т.е. достаточно сдел..
Т.е. достаточно сделать FONTCOLOR BLACK BACKCOLOR WHITE FONT cFont SIZE nFontSize PICTURE cFormat ; И ошибка исчезнет ? 6 часов использовали эту карточку периодически, а потом бах - ошибка...
|
|
|
|
| постоянный участник
|
Пост N: 7650
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.01.24 19:28. Заголовок: Версия МиниГуи 23.12..
Версия МиниГуи 23.12 Моя большая система собирается и запускается отлично. Я уже порадовался, наконец то Харбор починили.... А НЕТ, не до конца ! Вот код: :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 } ) Нажимаю на кнопку и у меня выдаётся ошибка: Беру, удаляю папку OBJ в проекте и компилирую с версией МиниГуи 29.09.2 + Harbour с версии МиниГуи 23.01 И о чудо, эта ошибка не появляется... И как это понимать ? Что там в Харборе сделали ???
|
|
|
|
| |
Пост N: 174
Зарегистрирован: 12.07.06
|
|
Отправлено: 28.03.24 04:34. Заголовок: Вставлю свои пять копеек
Несколько раз читал эту ветку, когда пытался решить проблему с потерей окна, результат отрицательный. Имеется у клиента: 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 Уже давно при создании любых окон делаю сборку мусора.
|
|
|
|
| moderator
|
Пост N: 2301
Зарегистрирован: 11.02.10
|
|
Отправлено: 28.03.24 11:50. Заголовок: alex_II пишет: Благ..
alex_II пишет: Благодарю за полное описание ситуации и используемых инструментов. цитата: | иногда, выдаётся ошибка на строку с Release |
| Да, в таком сценарии это возможно. Поэтому рекомендую всегда использовать в таком случае команду DO EVENTS перед закрытием модального окна: цитата: | DO EVENTS Form_sityFind.Release |
| Надеюсь, это поможет решить проблему
|
|
|
|
| постоянный участник
|
Пост N: 7720
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.03.24 12:25. Заголовок: Нужно смотреть сам к..
Нужно смотреть сам код этого окна и поиска. Лучше переделать на события, как советует Сергей. Мне это помогло.
|
|
|
|
| постоянный участник
|
Пост N: 7726
Зарегистрирован: 12.09.06
|
|
Отправлено: 17.04.24 15:51. Заголовок: Вот очередная непоня..
Вот очередная непонятка в МиниГуи. Вылет по ошибке и опять на Alert*(): 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) .... Код IF AlertYesNo( "Вставить запись в таблицу ?", "Добавление записи" ) // строка 970 Ну и как правильно сделать ?
|
|
|
|
| постоянный участник
|
Пост N: 7734
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.04.24 13:01. Заголовок: Поймал вылет из прог..
Поймал вылет из программы без ошибки и без создания ErrorLog.htm Прога падает и всё... На простой функции oBrw:FilterFTS( cVal, .T. ) Полдня бился с этим, пока не догадался отключить индекс на базу. Без него перестала падать прога и поиск пошёл. Почему так получается ? Как бы получать ошибку и не гадать что случилось ?
|
|
|
|
| постоянный участник
|
Пост N: 4555
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.04.24 16:51. Заголовок: Andrey пишет Полдня ..
Andrey пишет цитата: | Полдня бился с этим, пока не догадался отключить индекс на базу. Без него перестала падать прога и поиск пошёл. |
| Если бы ты задумался над своим тсб, то, понял, что колонка COLNUMBER { 1 , 50 }, которая заточена на работу с тэгом и oBrw:FilterFTS(cVal, .T.) несовместимая штука (oBrw:nLen подсчет свой), то не потерял бы время. Что бы совместить надо ручками потрудиться, написав обработчики ситуаций для совместной работы алгоритмов. PS Взяв в begin sequnce oBrw:FilterFTS(cVal, .T.), получил бы в лог сообщение, обработав.
|
|
|
|
| постоянный участник
|
Пост N: 7735
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.04.24 18:58. Заголовок: SergKis пишет: Что ..
SergKis пишет: цитата: | Что бы совместить надо ручками потрудиться, написав обработчики ситуаций для совместной работы алгоритмов. |
| Это как ?
|
|
|
|
| постоянный участник
|
Пост N: 4556
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.04.24 19:37. Заголовок: Andrey пишет Это как..
Andrey пишет Как обычно, вводишь признак работы по SET SCOPE TO ... или :FilterFTS(...) по вхождению и в колонку COLNUMBER { 1 , 50 } ставишь, например, в oCol:bDecode (oCol:bValue) и oCol:cFooting блоки кода, учитывающий состояние признака
|
|
|
|
|
| постоянный участник
|
Пост N: 7736
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.04.24 19:57. Заголовок: Не понял как. Вот ес..
Не понял как. Вот есть первое обращение к oRpt:FilterFTS( cVal, .T. ) Что нужно поставить для проверки ? А то методом тыка понял что там вылетает....
|
|
|
|
| постоянный участник
|
Пост N: 4557
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.04.24 20:54. Заголовок: Andrey пишет Что нуж..
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(...) будет давать "дырки" в значениях, по идее надо делать нормальную нумерацию
|
|
|
Ответов - 173
, стр:
1
2
3
4
5
6
7
8
9
All
[только новые]
|
|