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

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

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

Ответов - 189, стр: 1 2 3 4 5 6 7 8 9 10 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(...) будет давать "дырки" в значениях, по идее надо делать нормальную нумерацию

Andrey: Добавил к себе в большой проект ещё 2 программки - примерно 400 Кб текстов (2 новые таблицы) и труба... Началось зависание в работающих ветках программы, вызываешь меню и прога висит. Опять потеря фокуса, помогает только снятие программы через Менеджер программ.

Andrey: Опять вопрос по зависанию моей большой проги. Имеется один клиент, у которого постоянно вешается моя большая прога на МиниГуи в различных местах программы. Толи руки у него такие, толи виноват СЕРВЕР (прога запускается как сервер-терминалов) но постоянно прога подвешивается. На неделе несколько раз. Вот сегодняшний случай, на рабочем столе 1С, Ворд и прога на МиниГуи, в проге окно MAIN, STANDART и MODAL(1), далее окно MODAL(2) и вызывается расчёт отчета, потом возврат к MODAL(1) окно, и потом вызов Экселя. Эксель не прогрузился, прога висит. Окно проги НЕЛЬЗЯ закрыть и переключится на другие программы, МиниГуи на экране и всё. Крестика закрыть у юзера нет, и снять окно через Диспетчер программы - НЕЛЬЗЯ, это прога запущена на сервере, снять её не возможно !!! Только перезагрузка СЕРВЕРА админом. Как быть и что делать ??? Почему нет возврата на окно MODAL(1) ??? Думал что только такое у этого клиента, ан НЕТ. Делаю уже 1,5 месяца небольшую тестовую программу и поймал вчера точно такой же ГЛЮК на 2-х MODAL окнах. Так как на окнах использую везде ТСБ, то видно что после закрытия окна MODAL(2) фокус в проге возвращается СРАЗУ на MAIN окно. А окно MODAL(1) висит поверх окна MAIN. Вот так примерно наверное происходит у клиента. Как в самом МиниГуи исправить/добавить чтобы закрытие окна MODAL(2) приводило к переводу в фокус окна окна MODAL(1) ?

SergKis: Такое есть в Modal(2) ?[pre2] FUNC Modal2(cParent, ...) // cParent - имя Modal(1) ... ACTIVATE WINDOW &cForm IF _IsWindowDefined(cParent) DoMethod(cParent, "SetFocus") ENDIF RETURN aRet [/pre2]

SergKis: Andrey пишет снять её не возможно NOTIFY MENU на MAIN окно, пробовал делать (проверить жива ли прога, закрыть окна modal, ...) ?

Andrey: SergKis пишет: NOTIFY MENU на MAIN окно, пробовал делать (проверить жива ли прога, закрыть окна modal, ...) ? Боюсь добавлять, прогу собираю на версии 23.09.2 с Харбором от версии Минигуи 23.01 Более новые версии - ломают прогу, я писал ранее, функции Харбора перестают работать, прога пишет что нет такой функции. Труба одним словом. Пробовал переписать заново, увяз, столько работы уже не осилю... Вроде на 7.70 пошла, но не доделал, а сейчас вообще времени нет, новую прогу пишу заказчику. SergKis пишет: Такое есть в Modal(2) ? Конечно нет. Я задолбаюсь писать у себя в коде все эти переходы. Вот и просил проверить ядро МиниГуи и туда это вставить, если нет такого.

Andrey: БОЛЬШАЯ ПРОСЬБА исправить функции Alert*, включая MsgDebug() Вот экран программы которая тупо повисла: картинка ссылка Прога из 3-х окон. MAIN с таблицей, далее окно (1) MODAL и ещё окно (2) MODAL Вызываю для тестирования окно MsgDebug(), назначил левую клавишу мышки. Если MsgDebug() закрыть клавишей Esc (правда не всегда это получается), иногда кнопкой Ок - то фокус улетает на предыдущую таблицу - окно (1) MODAL, стрелками потыкать вверх вниз и видно курсор в ТСБ движется !!! А окно с этой таблицей так и висит на экране, закрыть невозможно ! Если бы окна были на весь экран, то точно было ничего НЕ СДЕЛАТЬ, только снятие проги через снятие программы. Наверное окно MsgDebug() портит что-то в окнах МиниГуи...

gfilatov2002: Andrey пишет: Наверное окно MsgDebug() портит Благодарю за сообщение и пример! Поправил, надеюсь, эту функцию для следующей сборки.



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