Автор | Сообщение |
|
| постоянный участник
|
Пост N: 5855
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.05.18 21:33. Заголовок: Вылет из программы...
Всем привет ! Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) ? Т.е. хочу сделать сразу после появления MsgBox() вызов 2-3 функций и потом сделать DbCloseAll(). Как это реализовать ? Для чего это нужно, поясню: при входе в свою программу я пишу в базу кто и когда вошел в программу (логин пользователя). И при выходе из программы, стираю этого пользователя из базы. Если программа "вылетает", то юзер числится как работающий. Древнее наследие с клипера, хотел переделать, да так и осталось.
| |
|
Ответов - 167
, стр:
1
2
3
4
5
6
7
8
9
All
[только новые]
|
|
|
| |
Пост N: 1246
Зарегистрирован: 20.02.11
|
|
Отправлено: 14.05.18 21:57. Заголовок: Andrey пишет: Как м..
Andrey пишет: цитата: | Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) |
| изменить стандартный обработчик ошибок. см. Errorsys.prg
| |
|
|
| постоянный участник
|
Пост N: 5856
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.05.18 23:55. Заголовок: Haz пишет: изменить..
Haz пишет: цитата: | изменить стандартный обработчик ошибок. см. Errorsys.prg |
| Т.е. нужно будет сделать следующее: 1) Изменить файл MiniGUI\SOURCE\ErrorSys.prg под себя - примерно так: Скрытый текст
STATIC PROCEDURE ShowError( cErrorMessage, oError ) *-----------------------------------------------------------------------------* STATIC _lShowError := .T. IF _lShowError _lShowError := .F. #ifdef _TSBROWSE_ _TSB_aControlhWnd := {} #endif MsgStop( iif( _lShowDetailError(), cErrorMessage, ErrorMessage( oError ) ), 'Program Error', NIL, .F. ) ErrorLevel( 1 ) MyExitFunction() // вызов моих функций DbCloseAll() // закрыть все базы ReleaseAllWindows() ENDIF RETURN
| 2) Добавить этот файл к себе в проект. Достаточно этого будет ? Дело в том, что не всегда на сервере закрываются базы ! Приходиться вручную закрывать открытые базы пользователя. Не знаю кто оставляет их открытыми: терминалка на хХарборе или МиниГуи. Но с таким периодически я сталкиваюсь. Если в качестве сервера юзера пользуются Win ХР, то такое бывает чаще. А избавиться от ХР никак не получается.
| |
|
|
| |
Пост N: 1248
Зарегистрирован: 20.02.11
|
|
Отправлено: 15.05.18 00:12. Заголовок: Andrey пишет: Доста..
Andrey пишет: Чтоб не писать свой обработчик ошибок. Можно и так. Этого достаточно.
| |
|
|
| постоянный участник
|
Пост N: 795
Зарегистрирован: 13.10.05
|
|
Отправлено: 15.05.18 08:44. Заголовок: "Опасные" у..
"Опасные" участки программы обрамить конструкцией try catch MyExitFunction() // вызов моих функций DbCloseAll() // закрыть все базы end
| |
|
|
| |
Пост N: 6826
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.05.18 09:12. Заголовок: Andrey пишет: И при..
Andrey пишет: цитата: | И при выходе из программы, стираю этого пользователя из базы. |
| Rlock() записи юзера не подходит ? Если вылет , запись разблокируется (надеюсь что так).
| |
|
|
| постоянный участник
|
Пост N: 5857
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.05.18 12:04. Заголовок: Vlad04 пишет: "..
Vlad04 пишет: цитата: | "Опасные" участки программы обрамить конструкцией try catch MyExitFunction() // вызов моих функций DbCloseAll() // закрыть все базы end |
| Это лишнее. Опасные участки я делаю через такой код примерно: BEGIN SEQUENCE WITH { |e|break( e ) } .... RECOVER .... END SEQUENCE Этого достаточно. Dima пишет: цитата: | Rlock() записи юзера не подходит ? |
| Нет, не подходит. Если программа аварийно слетела или ещё какие то причины (не знаю какие) база на сервере (даже Win2008) остаётся открытой, т.е. занятой пользователем. Такое редко на Win2008 бывает. И приходиться вручную через панель администратора закрывать базы, а там штук 60 баз... 60 раз кликов мышки на файл, потом на кнопку закрыть. Работа та ещё. Или сервер перегрузить нужно, но всех юзеров замучишься по кабинетам обходить и выгонять из подключений к серверу.
| |
|
|
| постоянный участник
|
Пост N: 5879
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.05.18 18:31. Заголовок: Сделал как посоветов..
Сделал как посоветовал Haz ! Отлично работает ! MyExitFunction() // вызов моих функций - отрабатывает нормально. Дело в том что у меня главная программа на МиниГуи, через неё вызываю терминальные окна программы и запоминаю хендлы открытых окон, а при аварийном вылете программы на МиниГуи, закрываю заодно и терминальные окна. Классно проходит закрытие... Заодно и пользователя из dbf-журнала пользователей программы (кто в программе) удаляю. Спасибо за помощь !
| |
|
|
| постоянный участник
|
Пост N: 5893
Зарегистрирован: 12.09.06
|
|
Отправлено: 31.05.18 00:11. Заголовок: Привет всем ! Появил..
Привет всем ! Появился у меня вылет из программы, при сбое соединения с PostgreSQL. При сбое отправки в PostgreSQL вывожу окно MODAL. А оно не выводиться. Появляется вот такая ошибка и вылет: Error MGERROR/0 Release a window in its own ON RELEASE procedure or release the Main Window in any ON RELEASE procedure is not allowed. Program terminated. Called from MSGMINIGUIERROR(0) Called from RELEASEALLWINDOWS(0) Called from SHOWERROR(194) in module: Source\ErrorSys.prg Called from DEFERROR(131) in module: Source\ErrorSys.prg Called from (b)ERRORSYS(64) in module: Source\ErrorSys.prg Called from MSGMINIGUIERROR(0) Called from _ACTIVATEWINDOW(0) Called from WAIT_WINDOW_MY(308) in module: Source\WaitWin.prg Called from WAITWINDOWERROR(157) in module: Source\WaitWin.prg Called from FIELDSTOPGSQLZAIV2(776) in module: Source\form_site.prg Called from COPYPGSQL3ALGORITM(1275) in module: Source\form_site.prg ......... Как исправить эту ошибку ? Что нужно делать ? P.S. ErrorSys.prg добавлен свой, чуть-чуть скорректирован, как Игорь посоветовал.
| |
|
|
| постоянный участник
|
Пост N: 1827
Зарегистрирован: 17.02.12
|
|
Отправлено: 31.05.18 07:09. Заголовок: Andrey Возможно дел..
Andrey Возможно делаешь CloseAllWindow(), а где то в др. окне в on release\on interactiveclose делаешь вызов ее или Form_?.Release или DoMethod(..., 'Release'), похоже на такой компот ...
| |
|
|
| постоянный участник
|
Пост N: 5894
Зарегистрирован: 12.09.06
|
|
Отправлено: 31.05.18 18:34. Заголовок: SergKis пишет: Возм..
SergKis пишет: цитата: | Возможно делаешь CloseAllWindow() |
| Нет, не делаю. Ошибка приходит из PostgreSQL, текстовая строка, сделал вывод в отладку - нормально выглядит. Called from FIELDSTOPGSQLZAIV2(776) in module: Source\form_site.prg вот кусок кода: IF nResultStatus == PGRES_COMMAND_OK .... ELSE cMsg += " - Результат: " + GetResultStatus( nResultStatus, 2 ) + " - " cMsg += GetResultStatus( nResultStatus, 3 ) + CRLF + CRLF cMsg += "Файл ошибки: " + cFileNoPath( ChangeFileExt( cFile, ".err" ) ) + CRLF ? VALTYPE(cMsg) ? cMsg WaitWindowError(cMsg) // строка 776 ENDIF Функции простые, работают в других местах без сбоев: Called from WAIT_WINDOW_MY(308) in module: Source\WaitWin.prg Called from WAITWINDOWERROR(157) in module: Source\WaitWin.prg А что за ошибки такие, перед ними: Called from MSGMINIGUIERROR(0) Called from RELEASEALLWINDOWS(0) Called from SHOWERROR(194) in module: Source\ErrorSys.prg Called from DEFERROR(131) in module: Source\ErrorSys.prg Called from (b)ERRORSYS(64) in module: Source\ErrorSys.prg Called from MSGMINIGUIERROR(0) Called from _ACTIVATEWINDOW(0) ?
| |
|
|
| постоянный участник
|
Пост N: 1427
Зарегистрирован: 27.01.07
|
|
Отправлено: 31.05.18 18:58. Заголовок: Andrey пишет: А что..
Andrey пишет: цитата: | А что за ошибки такие, перед ними: Called from MSGMINIGUIERROR(0) Called from RELEASEALLWINDOWS(0) Called from SHOWERROR(194) in module: Source\ErrorSys.prg Called from DEFERROR(131) in module: Source\ErrorSys.prg Called from (b)ERRORSYS(64) in module: Source\ErrorSys.prg Called from MSGMINIGUIERROR(0) Called from _ACTIVATEWINDOW(0) |
| Видимо твой подкорректированный Errorsys и есть причина того что "Error MGERROR/0 Release a window in its own ON RELEASE procedure or release the Main Window in any ON RELEASE"
| |
|
|
|
| постоянный участник
|
Пост N: 1828
Зарегистрирован: 17.02.12
|
|
Отправлено: 31.05.18 18:58. Заголовок: Andrey пишет А что з..
Andrey пишет цитата: | А что за ошибки такие, перед ними: |
| это стек вызовов в момент ошибки используй begin sequnce, что бы не падало и вывели тексты не в окно. а в log.
| |
|
|
| постоянный участник
|
Пост N: 1829
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.06.18 07:31. Заголовок: Andrey пишет Появляе..
Andrey пишет цитата: | Появляется вот такая ошибка и вылет: Error MGERROR/0 Release a window in its own ON RELEASE procedure or release the Main Window in any ON RELEASE |
| *-----------------------------------------------------------------------------* FUNCTION _ReleaseWindow ( FormName ) *-----------------------------------------------------------------------------* ... IF _HMG_ThisEventType == 'WINDOW_RELEASE' IF GetFormIndex ( FormName ) == _HMG_ThisIndex MsgMiniGuiError( "Release a window in its own ON RELEASE procedure or release the Main Window in any ON RELEASE procedure is not allowed." ) ENDIF ENDIF * If the window to release is the main application window, RELEASE ALL WINDOWS command will be executed IF GetWindowType ( FormName ) == 'A' IF _HMG_ThisEventType == 'WINDOW_RELEASE' MsgMiniGuiError( "Release a window in its own ON RELEASE procedure or release the Main Window in any ON RELEASE procedure is not allowed." ) ELSE ReleaseAllWindows() ENDIF ENDIF ... т.е. уже находясь в событии release window -> IF _HMG_ThisEventType == 'WINDOW_RELEASE', выполняется новый release window
| |
|
|
| постоянный участник
|
Пост N: 5896
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.06.18 10:38. Заголовок: SergKis пишет: т.е...
SergKis пишет: цитата: | т.е. уже находясь в событии release window -> IF _HMG_ThisEventType == 'WINDOW_RELEASE', выполняется новый release window |
| Да не делаю я нигде WINDOW_RELEASE. Программа работает нормально. Как приходит ошибка отправки в PostgreSQL, то и появляется эта ошибка. Поставил вывод в лог-файл и убрал вызов моей функции WaitWindowError(cMsg). Программа перестала падать. Значит дело в моей функции WaitWindowError(cMsg), т.е. там не может создать окно. Вроде делаю всё как обычно... Непонятки одни с этим окном.
| |
|
|
| постоянный участник
|
Пост N: 1830
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.06.18 11:34. Заголовок: Andrey пишет Непонят..
Andrey пишет цитата: | Непонятки одни с этим окном. |
| STATIC PROCEDURE OnRelease() ThisWindow.Release ... если This окно, по какой то причине, Form_Main, то release вызовет RELEASEALLWINDOWS(0), т.к. окно не проявляется, то вполне может залезть в ситуацию сообщения "Release a window in its own ON RELEASE..." поставь трассировку по WaitWindowError - куда лезет узнаешь
| |
|
|
| постоянный участник
|
Пост N: 5897
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.06.18 12:03. Заголовок: SergKis пишет: пост..
SergKis пишет: цитата: | поставь трассировку по WaitWindowError - куда лезет узнаешь |
| Я уже пытался. Подскажи как ?
| |
|
|
| постоянный участник
|
Пост N: 1831
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.06.18 17:18. Заголовок: Andrey пишет Подска..
Andrey пишет Пример (на идеи из BASIC\WAIT_WINDOW_2) на событиях без потоков. http://my-files.ru/1ykqd9 Твой WaitWindowError можно сделать аналогично.
| |
|
|
| постоянный участник
|
Пост N: 1832
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.06.18 00:32. Заголовок: PS Если сделать прав..
PS Если сделать правку, будет нагляднее по окнам FUNCTION StartWait( oWnd, nEvent ) ... LOCAL aWnd := array(4) WHILE _IsWindowDefined( cWnd := '_w_' + hb_ntos( ++nId ) ) END cTitle += ' ' + hb_ntos( nId ) aWnd[1] := { nY , nX } ...
| |
|
|
| постоянный участник
|
Пост N: 1833
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.06.18 09:23. Заголовок: Может будет интересн..
Может будет интересно, пример продолжение http://my-files.ru/gkupot Добавлен выбор, дублклик в календаре и перенос выбора на wait окна
| |
|
|
| постоянный участник
|
Пост N: 6924
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.03.21 15:21. Заголовок: Так я и не разобралс..
Так я и не разобрался с падением программы, другое пришлось делать. Вот такая ошибка у меня периодически у некоторых юзеров возникает: Time from start: 0 days 1 hours 45 mins 36 secs Error MGERROR/0 ACTIVATE WINDOW: activate windows within an ON RELEASE window procedure is not allowed. Program terminated. --------------------------------- Stack Trace --------------------------------- Called from MSGMINIGUIERROR(100) in module: h_error.prg Called from _ACTIVATEWINDOW(1311) in module: h_windows.prg Called from WAIT_WINDOW_MY(354) in module: Source\WaitWin.prg Called from WAITWINDOWERROR(171) in module: Source\WaitWin.prg Called from SITEDBFLOG(1093) in module: Source\form_site.prg Called from COPYPGSQL3ALGORITM(1293) in module: Source\form_site.prg Called from PGSQL3ALGORITM(1259) in module: Source\form_site.prg Called from ZAIVKAONERECNO(372) in module: Source\Tbrw_table01.prg Called from FCARDSITE(325) in module: Source\Tbrw_table01.prg Called from (b)SHOW_CARD(258) in module: Source\Tbrw_fCard.prg Called from _DOWINDOWEVENTPROCEDURE(1936) in module: h_windows.prg Called from EVENTS(3730) in module: h_events.prg Called from MYEVENTSHANDLER(1500) in module: Source\main.prg Called from DOEVENTS(0) Called from COPYPGSQL3ALGORITM(1326) in module: Source\form_site.prg Called from PGSQL3ALGORITM(1259) in module: Source\form_site.prg Called from ZAIVKAONERECNO(372) in module: Source\Tbrw_table01.prg Called from FCARDSITE(325) in module: Source\Tbrw_table01.prg Вижу что что-то сбоит в PostgreSQL, а появление окна с ошибкой нет. Вылетает по ON RELEASE window procedure is not allowed Куда можно поставить свою отладку ? И как понять из-за чего свалилась программа ?
| |
|
|
| постоянный участник
|
Пост N: 3634
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.03.21 17:03. Заголовок: Andrey пишет И как п..
Andrey пишет цитата: | И как понять из-за чего свалилась программа ? |
| тут Called from SITEDBFLOG(1093) in module: Source\form_site.prg Called from COPYPGSQL3ALGORITM(1293) in module: Source\form_site.prg Сообщение о ON RELEASE это уже следствие, т.к. окно нормальное, наверно, есть и окно WaitWindow висит индикатором.
| |
|
|
|
| постоянный участник
|
Пост N: 6925
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.03.21 22:03. Заголовок: Понял тебя. Убрал на..
Понял тебя. Убрал нафиг это самописное окно, поставил стандартное и сделал вывод в лог-файл. Спасибо !
| |
|
|
| постоянный участник
|
Пост N: 6926
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.03.21 22:30. Заголовок: Вот сегодняшняя ошиб..
Вот сегодняшняя ошибка у юзера. На кнопке вызываю контекстное меню - примерно как в примере SAMPLES\BASIC\Menu\menudemo6.prg У меня не вылетает, а у юзера 7 минут работы и вылет... Вот такая ошибка: Time from start: 0 days 1 hours 7 mins 13 secs Error MGERROR/0 Form Form_3Card is not defined. Program terminated. --------------------------------- Stack Trace --------------------------------- Called from MSGMINIGUIERROR(100) in module: h_error.prg Called from GETFORMHANDLE(2248) in module: h_windows.prg Called from _DEFINECONTEXTMENU(709) in module: h_menu.prg Called from DYNAMICCONTEXTMENUEXTEND(159) in module: Source\menu_context.prg Called from SPISKI_MENU_PRINT(808) in module: Source\tsb_form_card.prg Called from (b)FORM_TSB_CARD(274) in module: Source\tsb_form_card.prg Called from DO_WINDOWEVENTPROCEDURE(82) in module: h_objmisc.prg Called from TWNDDATA:DOEVENT(726) in module: h_objects.prg Called from DO_ONWNDLAUNCH(250) in module: h_objmisc.prg Called from (b)INIT(123) in module: h_init.prg Called from EVENTS(1241) in module: h_events.prg Called from MYEVENTSHANDLER(1511) in module: Source\main.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1516) in module: h_windows.prg Called from FORM_TSB_CARD(282) in module: Source\tsb_form_card.prg Вот код: _ShowContextMenu(cForm, nY, nX, .F. ) ; InkeyGui(10) // menu runs through the queue RELEASE FONT Font_1dcm RELEASE FONT Font_2dcm DEFINE CONTEXT MENU OF &cForm // deleting menu after exiting - строка 159 END MENU И почему окно теряется ? Как исправить ?
| |
|
|
| постоянный участник
|
Пост N: 3635
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.03.21 22:52. Заголовок: Andrey пишет И почем..
Andrey пишет цитата: | И почему окно теряется ? Как исправить ? |
| Почему нет окна, ты скорее ответишь. Исправить, как обычно IF _IsWindowDefined( cForm ) DEFINE CONTEXT MENU OF &cForm // deleting menu after exiting - строка 159 END MENU ENDIF
| |
|
|
| постоянный участник
|
Пост N: 6932
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.04.21 15:34. Заголовок: Появляется периодиче..
Появляется периодически вот такая ошибка: Error BASE/2020 Неверный аргумент: PQRESULTSTATUS --------------------------------- Stack Trace --------------------------------- Called from PQRESULTSTATUS(0) Called from TPQSERVER:LISTTABLES(237) in module: tpostgre.prg Called from MYISTABLEPG(122) in module: Source\use_Postgres.prg Called from PGSQLMYOTVET(554) in module: Source\form_site2otvet.prg Called from DOWNLDOTVETMAST(354) in module: Source\form_site2otvet.prg Called from (b)SHOW_OTVETMASTER(198) in module: Source\form_site2otvet.prg Вылет идёт в модуле самой библиотеки. А как понять и исправить чтобы не вылетало ? Во второй программе такая же ошибка: Error BASE/2020 Неверный аргумент: PQRESULTSTATUS</p> --------------------------------- Stack Trace --------------------------------- Called from PQRESULTSTATUS(0) Called from TPQSERVER:LISTTABLES(237) in module: tpostgre.prg Called from MYISTABLEPG(122) in module: use_Postgres.prg Called from PGSQLMYOTVET(616) in module: form_site3otvet.prg Called from DOWNLDOTVETMAST(544) in module: form_site3otvet.prg Called from (b)FORM_OTVETMASTER(269) in module: form_site3otvet.prg Called from DO_WINDOWEVENTPROCEDURE(82) in module: h_objmisc.prg Called from TWNDDATA:DOEVENT(726) in module: h_objects.prg Called from DO_ONWNDLAUNCH(250) in module: h_objmisc.prg Called from (b)INIT(123) in module: h_init.prg Called from EVENTS(1241) in module: h_events.prg Посмотрел сам исходник: METHOD ListTables() CLASS TPQserver LOCAL result := {} LOCAL i LOCAL res := PQexec( ::pDB, ; "SELECT table_name" + ; " FROM information_schema.tables" + ; " WHERE table_schema = " + DataToSql( ::Schema ) + " AND table_type = 'BASE TABLE'" ) IF ( ::lError := PQresultStatus( res ) != PGRES_TUPLES_OK ) ::cError := PQresultErrorMessage( res ) ELSE FOR i := 1 TO PQlastrec( res ) AAdd( result, PQgetvalue( res, i, 1 ) ) NEXT ::cError := "" ENDIF RETURN result // строка 237 Мой исходник: cPgTable := "response" // Проверка на существование таблицы lRet := MyIsTablePg( cPgTable, M->oServer ) IF !lRet ? "Нет таблицы ["+cPgTable+"] на СЕРВЕРЕ-БД !" // выводим надпись ...... // Проверка на существование таблицы FUNCTION MyIsTablePg( cNamePgTable, oSrvPg ) LOCAL oTbl, cTable, lSeek := .f. cTable := LOWER( cNamePgTable ) oTbl := oSrvPg:ListTables() // строка 122 ? ProcNL() Я библиотеку C:\MiniGUI\SOURCE\HbPgSql собрал ещё в 2017 году и так не менял. А нужно менять ?
| |
|
|
| постоянный участник
|
Пост N: 3709
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.04.21 16:42. Заголовок: Andrey пишет А как п..
Andrey пишет цитата: | А как понять и исправить чтобы не вылетало ? |
| Ты уже приходил с таким вопросом и даже согласился использовать begin .. sequnce ... И где оно ... Например так сделать FUNC aSrvPgListTables( oSrvPg, nWhl ) LOCAL lRet, oTbl Default nWhl := 10 WHILE nWhl-- > 0 lRet := .F. BEGIN SEQUENCE WITH { |e|break(e) } oTbl := oSrvPg:ListTables() lRet := .T. END SEQUENCE IF lRet ; EXIT ENDIF wApi_Sleep(100) END Default oTbl := {} RETU oTbl И замени oTbl := oSrvPg:ListTables() на oTbl := aSrvPgListTables(oSrvPg, 20) // ~ 2 сек. IF Empty(oTbl) ; MsgStop("Нет данных о таблице[ах]", "ERROR") ENDIF
| |
|
|
| постоянный участник
|
Пост N: 6933
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.04.21 17:25. Заголовок: SergKis пишет: Ты у..
SergKis пишет: цитата: | Ты уже приходил с таким вопросом и даже согласился использовать begin .. sequnce ... |
| Да поставил дополнительно PQping( M->cPubPgConnInfo ) // проверка доступности сервера и пропала та ошибка, сейчас другая вылезла. Спасибо !
| |
|
|
| постоянный участник
|
Пост N: 6937
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.04.21 18:02. Заголовок: Блин, как это достал..
Блин, как это достало... Переделал сохранение данных вместо формы на контейнер, т.е. на окно делаю так: (This.Object):Cargo := oKeyData() // создать объект (контейнер) для окна &cFormName oCrg := (This.Object):Cargo oCrg:aGlobalSection := aGlobalSection oCrg:aRunFunc := {cGlobSection,cFormName,nTable} oCrg:cAlias := ALIAS() oCrg:aMemIndexOpen := aCargoMemIndexOpen ... и т.д. порядка 20 переменных Прога перестала падать в местах где читаю/записываю данные в контейнер. Всего 4 раза упала за этот день, и то 2 раза по ОДИНАКОВОЙ ошибке. Достижение. Классно ! Спасибо SergKis ! Но вот с выводом сообщений на форму - беда. Теперь там стала падать. Вот ошибка: User: SERVER/User2/Алла 1раз - Time from start: 0 days 1 hours 16 mins 27 secs 2раз - Time from start: 0 days 3 hours 6 mins 56 secs Error MGERROR/0 Control: Label_Filter Of Form_Table_Abon Not defined. Program terminated. --------------------------------- Stack Trace --------------------------------- Called from MSGMINIGUIERROR(0) Called from VERIFYCONTROLDEFINED(0) Called from GETPROPERTY(0) Called from TSBLBL_FILTER(890) in module: Source\Tbrw_table.prg Called from MYINITFORMTABLE(839) in module: Source\Tbrw_table.prg Called from (b)FORM_MYTABLE(353) in module: Source\Tbrw_table.prg Called from DO_WINDOWEVENTPROCEDURE(0) Called from TWNDDATA:DOEVENT(0) Called from DO_ONWNDLAUNCH(0) Called from (b)INIT(0) Called from EVENTS(0) Called from MYEVENTSHANDLER(1539) in module: Source\main.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from FORM_MYTABLE(706) in module: Source\Tbrw_table.prg Called from TBRWABONENT(36) in module: Source\Tbrw_1Run.prg Called from (b)HB_MACROBLOCK(0) .... Вот мой код: FUNCTION TsbLbl_Filter(cForm, cLabel) LOCAL nLblWidth := GetProperty(cForm, "Label_Filter", "Width") // строка 890 LOCAL nSize := GetProperty(cForm, "Label_Filter", "FontSize" ) LOCAL cFont := GetProperty(cForm, "Label_Filter", "FontName" ) LOCAL cStroka := "Поиск: " + cLabel // nSize и cFont оставил для изменения шрифта для длиного текста SetProperty(cForm, "Label_Filter", "Value" , cStroka) SetProperty(cForm, "Label_Filter", "Tooltip" , cStroka) RETURN NIL И как эту ошибку обойти ? Куда делся объект Label_Filter с формы ? Форма на экране, объект тоже должен быть - ОКНО ЖЕ НЕ ЗАКРЫТО !
| |
|
|
| постоянный участник
|
Пост N: 6941
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.04.21 17:33. Заголовок: Всем привет ! Хочу п..
Всем привет ! Хочу поделиться своим опытом по работе ТСБ в МиниГуи. Делал программу, одновременная работа одного модуля с пятью похожими таблицами. Кол-во полей для редактирования от 50 до 200. Прога создавалась с 2015 года, вроде работала, но коряво, постоянно терялись объекты на окнах и вылет программы. За день раз 10 программа могла упасть у одного пользователя, а если открывал несколько таблиц, то труба, обязательно упадёт. Пока не помог SergKis исправить данную ситуацию, перевести все на контейнер и события ! Огромное спасибо тебе SergKis ! Сейчас прога перестала вылетать на этом модуле. Правлю другие вылеты проги. Кому интересно, привожу заготовку как надо делать. На кнопки всегда ставлю НОМЕР события и имя объекта (имя кнопки), а уже в событие ставлю функции обработки. Писать код в событиях одно удовольствие. В ини-файле описываю все поля, цвета, кнопки таблицы, иконки, фонты и т.д. Скрытый текст
[Section_Dogovor] Поля_БД = { "NDOG", "DateDog", ....} Поля_карточки = { "NDOG", "DateDog", ....} Название_полей_карточки = { "Номер договора", "Дата договора", ....} [Tsb_Dogovor/Таблица_Настройки] Font_0=------------ фонты таблицы ----------------- Font_1={"Tahoma", 18, .F., .F.} Font_2={"Times New Roman", 18, .T., .F.} Font_3={"Times New Roman", 18, .F., .F.} Font_4={"Arial Black", 20, .T., .F.} Font_5={"DejaVu Sans Mono", 18, .F., .F.} Font_6={"Snap ITC", 20, .T., .F.} Font_7={"Comic Sans MS", 12, .T., .F.} HandleFont_1=Font_Tsb_Cell1 HandleFont_2=Font_Tsb_Head1 HandleFont_3=Font_Tsb_Foot1 HandleFont_4=Font_Tsb_SpcHd1 HandleFont_5=Font_Tsb_Edit1 HandleFont_6=Font_Tsb_SuperHd1 HandleFont_7=Font_Tsb_DelRecno1 SizeColonm={115, 30, 142, 123, 655, 142, 138, 127, 149, 151, 190, 265, 265, 213, 0, 0} .......... [Section_Abonent] ..........
| Примерный шаблон программы: Скрытый текст
Вызов на кнопках c главного меню программы: FormMyTable("Form_Dogovor",1,"Section_Dogovor",....) FormMyTable("Form_Abonent",2,"Section_Abonent",....) ..... FormMyTable("Form_Oplata",5,"Section_Oplata",....) FUNCTION FormMyTable(cFormName,nTable,cIniSection,....) IF !_IsWindowActive( cFormName ) PRIVATE oBrw // создать окно ожидания aBegin := WaitWinCreate( 'Создаю таблицу ...' ) // считывание фонтов таблицы из ини-файла IniGetTbrwFont(cIniSection+"/Таблица_Настройки", @aTableFont, @aTableHndlFont) // задать все используемые фонты cTbl := HB_NtoS(nTable) aTsbFont := {"Font_Tsb_Cell" +cTbl, "Font_Tsb_Head" +cTbl, ; "Font_Tsb_Foot" +cTbl, "Font_Tsb_SpcHd"+cTbl, ; "Font_Tsb_Edit" +cTbl } DEFINE WINDOW &cFormName At 0, 0 ; WIDTH nWinWidth HEIGHT nWinHeight ; TITLE cTitle ICON cIco ; WINDOWTYPE STANDARD TOPMOST ; NOMAXIMIZE NOSIZE ; BACKCOLOR aBackColor ; FONT cFont SIZE nFontSize ; ON INIT {|| DoEvents(), _wPost(1) } ; // !!! обязательно DoEvents() ON RELEASE { || DoMethod( "Form_Main", "Restore" ) } ..... (This.Object):Cargo := oKeyData() // создать объект (контейнер) для окна &cFormName oCrg := (This.Object):Cargo oCrg:cAlias := ALIAS() oCrg:aTsbFilter := {} oCrg:aTsbSort := {} oCrg:aTsbField := GetProfile( cIniSection, "Поля_БД", {} ) oCrg:aCardField := GetProfile( cIniSection, "Поля_карточки", {} ) oCrg:aCardName := GetProfile( cIniSection, "Название_полей_карточки", {} ) oCrg:aWinUpColor := GetProfile( cIniSection, "Цвет_фона_верх_формы", BLACK ) oCrg:aBackColor := GetProfile( cIniSection, "Цвет_фона_всей_формы", BLACK ) oCrg:lDeletedView := .F. // отключить флаг показа удал.записей oCrg:aUpMenu2Button := GetProfile( cIniSection, "Кнопки_верху_таблицы", {} ) // объекты верхних кнопок ..... oCrg:nTable := nTable // номер таблицы oCrg:cFont := cFont oCrg:nFontSize := nFontSize oCrg:nTsbFootCol := GetProfile( cIniSection, "Показ_строки_подвала_итого", 2 ) // кнопки меню вверху окна aUpTBar := myUpBarTable(cFormName,nTable,..) nWinHUp := aUpTBar[1] // высота кнопок + отступы кнопок nWinXUp := aUpTBar[2] + 10 // конец всех кнопок ..... nHUp := nWinHUp @ nHUp, 0 LABEL Label_Filter VALUE "Поиск: нет" WIDTH nW/2 HEIGHT 40 ... @ nHUp, nW/2 LABEL Label_Sort VALUE "Сортировка: нет" WIDTH nW/2 HEIGHT 40 ... ..... Select(Select(cBaseMain)) oCrg:cAlias := ALIAS() goto TOP nY := This.Label_Filter.Row + This.Label_Filter.Height + 1 DEFINE TBROWSE oBrw AT nY,nX WIDTH nW HEIGHT nH CELL ; FONT aTsbFont ; ON CHANGE {|ob| ChangeBrowse(ob) } ; ON GOTFOCUS {|ob| ChangeBrowse(ob) } ; BACKCOLOR aBackColor ; ON INIT {|ob| ; ob:nColOrder := 0 ,; // убрать значок сортировки по полю ob:lNoChangeOrd := .T.,; // убрать сортировку по полю ob:nWheelLines := 1 ,; // прокрутка колесом мыши с шагом ... ob:lNoGrayBar := .F.,; // показывать неактивный курсор в таблице ob:lNoLiteBar := .F.,; // при переключении фокуса на другое окно не убирать "легкий" Bar ob:lNoResetPos := .F.,; // предотвращает сброс позиции записи на gotfocus ob:lNoPopUp := .T.,; // избегает всплывающее меню при щелчке правой кнопкой мыши по заголовку столбца ob:nStatusItem := 0 ,; // в 1-й Item StatusBar не выводить автоматом из тсб ob:lPickerMode := .F.,; // формат даты нормальный ob:nCellMarginLR := 1 ; // отступ от линии ячейки при прижатии влево, вправо на кол-во пробелов } // !!! только эти установки в ON INIT !!! oBrw:lCheckBoxAllReturn := .T. // Enter modify value oCol:lCheckBox sBrw( nTable, oBrw) // запомнить oBrw по номеру nTable CreateBrowseTable(cFormName,nTable) // создать таблицу: поля, цвета и т.д. oBrw:nCell := 3 // передвинуть МАРКЕР на 3 колонку END TBROWSE {|ob| ob:SetNoHoles(), ob:SetFocus(), ob:Refresh() } CreateBrowseContextMenu(cFormName,nTable) // контекстное меню ТСБ // на окне oCrg:nWinHUp := nWinHUp // для правки заголовка верха меню oCrg:oBrw := oBrw // сам объект таблица // НОМЕР СОБЫТИЯ кнопок или показа: 0, 1, 3, 4, 5, 6, 7, 10, 40, 90, 100 и т.д. WITH OBJECT This.Object :Event( 0, {|ow,ky,ob| MsgBox(hb_ntos(ky)+": "+ob:cControlName+" Value "+; cValToChar(ob:GetValue(ob:nCell)), "INFO-"+ow:Name) } ) :Event( 1, {|ow| This.Topmost := .F., myInitFormTable(ow) } ) :Event( 3, {| | // Помощь / О таблице LOCAL hHandle hHandle := ThisWindow.Handle This.oBut_Help.Enabled := .F. Darken2Open(hHandle) MyHelpTable(cFormName,nTable) Darken2Close(hHandle) This.oBut_Help.Enabled := .T. Tsb4Focus(nTable) Return Nil } ) :Event( 6, {|ow,ky,aRSort| // Label_Sort LOCAL nWidth, nSize, cFont, cStr LOCAL cLbl := "Label_Sort", cForm := ow:Name ky := LEN(aRSort) > 0 cStr := "Сортировка: " + iif( ky, aRSort[1], "нет" ) ow:Cargo:aTsbSort := aRSort IF _IsControlDefined(cLbl, cForm) nWidth := GetProperty(cForm, cLbl, "Width") nSize := GetProperty(cForm, cLbl, "FontSize" ) cFont := GetProperty(cForm, cLbl, "FontName" ) SetProperty(cForm, cLbl, "Value" , cStr) ELSE myLogTbrw("*** ERROR *** LABEL "+cLbl+" not found ! FormName =", cForm, nTable ) ENDIF RETURN NIL } ) :Event( 7, {|ow,ky,cStr| // Label_Filter LOCAL nWidth, nSize, cFont LOCAL cLbl := "Label_Filter", cForm := ow:Name ky := "Поиск: " cStr := ky + cStr IF _IsControlDefined(cLbl, cForm) nWidth := GetProperty(cForm, cLbl, "Width") nSize := GetProperty(cForm, cLbl, "FontSize" ) cFont := GetProperty(cForm, cLbl, "FontName" ) SetProperty(cForm, cLbl, "Value" , cStr) ELSE myLogTbrw("*** ERROR *** LABEL "+cLbl+" not found ! FormName =", cForm, nTable ) ENDIF RETURN NIL } ) :Event(10, {|ow,ky,cBtn| // вызов Карточка / oBut_Card LOCAL oBrw := ow:Cargo:oBrw SetProperty(ow:Name, cBtn, "Enabled", .F.) ky := 110 // переназначаем на новое событие _wSend(ky, oBrw:cParentWnd, oBrw) SetProperty(ow:Name, cBtn, "Enabled", .T.) Tsb4Focus(nTable) Return Nil } ) :Event(90, {|ow| This.oBut_Exit.Enabled := .F. ,; // Выход TsbCloseIndex(ow:Name,nTable) ,; ReleaseTableFont(nTable,"удалить фонты") ,; _wSend(99) } ) :Event(99, {|ow| ow:Release() } ) :Event(110, {|ow,ky,oBrw| // ---------- Показ Карточки ------------ LOCAL cParent := "", nValButton := 0 // не использую LOCAL cForm := ow:Name LOCAL hWnd := ow:Handle Darken2Open(ow:Handle) // затенение ? ProcNL() ? This.Name, ThisWindow.Name, Application.Handle, hWnd ? ky, ow:Name, oBrw:cAlias SetWaitCursor( Application.Handle ) SetCursorSystem( IDC_WAIT ) SetWaitCursor( hWnd ) // Курсор мышки - ожидание myCard(oBrw, nTable, ... ) // сама карточка Darken2Close(ow:Handle) // убрать затенение Tsb4Focus(nTable) Return Nil } ) END WITH ON KEY .... END WINDOW DoMethod( cFormName, "Center" ) ACTIVATE WINDOW &cFormName ON INIT {|| SetProperty(cFormName, "Topmost", .T.) } ELSE // !IsWindowActive() SwitchToWin( cFormName ) // переключить на тек.форму Tsb4Focus(nTable) ENDIF // !IsWindowActive() RETURN NIL //////////////////////////////////////////////////////////////////// STATIC FUNCTION ChangeBrowse(oBrw) LOCAL o, cVal, cLen, nLen, aItogo, nColFoot, cFormName, nTable .......... SET WINDOW THIS TO oBrw // использовать данные из контейнера cFormName := This.Name o := This.Cargo nTable := o:nTable nColFoot := o:nTsbFootCol aItogo := o:aItogo ....... cVal := HB_NToS( (oBrw:cAlias)->(OrdKeyNo()) ) nLen := (oBrw:cAlias)->(OrdKeyCount()) oBrw:aColumns[1]:cFooting := { || ALLTRIM(Transform( nLen, "9 999 999" )) } oBrw:aColumns[nColFoot]:cFooting := { || " Записи: " + cVal + "/" + cLen } oBrw:DrawFooters() // выполнить прорисовку подвала SET WINDOW THIS TO RETURN Nil /////////////////////////////////////////////////////////////////////////////// // вывод кнопок верхнего меню STATIC FUNCTION myUpBarTable(cFormName,nTable,....) ............ aObj2 := Data_UpMenu(nTable) aRBtn := aObj2[1] aCBtn := aObj2[2] aWBtn := aObj2[3] aHBtn := aObj2[4] aBtnObj := aObj2[5] aBtnCap := aObj2[6] aGrd1Clr := aObj2[7] aGrd2Clr := aObj2[8] aBtnIco := aObj2[9] a2FntClr := aObj2[10] a4BtnFont := aObj2[11] aBtnPst := aObj2[12] ..... // вывод кнопок на форму FOR nI := 1 TO Len(aBtnCap) cCapt := ATREPL( ";", aBtnCap[nI], CRLF ) nPost := aBtnPst[nI] // цифры - событие на кнопке aGrad := { aGrd1Clr[nI], aGrd2Clr[nI] } my2BUTTON(aRBtn[nI], aCBtn[nI], aWBtn[nI], aHBtn[nI], aBtnObj[nI], cCapt,; aGrad, , aBtnIco[nI], a2FntClr[nI], a4BtnFont[nI], nPost ) NEXT /////////////////////////////////////////////////////////////////////////////// // считать в массив названия,цвет,иконки,ширину кнопки и т.д. // можно сделать и чтение из ини-файла STATIC FUNCTION Data_UpMenu(nTable) ............... nW := GetDesktopWidth() cIcoXX := IIF( nW >= 1280, "64", "48" ) // размер иконки IF nTable == 1 aBtnCap := { "", "Карта","Карточка","Добавить;запись", ....} aBtnIco := { {"iMaps"+cIcoXX+"x1" ,"iMaps"+cIcoXX+"x2" } ,; {"iEditCard"+cIcoXX+"x1","iEditCard"+cIcoXX+"x2"} ,; {"iInsert"+cIcoXX+"x1","iInsert"+cIcoXX+"x2"} ,; ..... {"iExit"+cIcoXX+"x1" ,"iExit"+cIcoXX+"x2" } } aBtnClr := { aMainIcoBCls ,; // 1 Помощь COLOR_BLUE_VK ,; // 2 Карта COLOR_DARK_GREY ,; // 3 Карточка COLOR_DARK_GREY ,; // 4 Добавить запись ....... COLOR_RED_METRO } // 13 Выход aBtnObj := { "oBut_Help" , "oBut_Maps" , "oBut_Card" , "oBut_Ins", .... } aBtnPst := { 3, 4, 10, 11, 22, 20, 21, 50, 70, 60, 80, 85, 90 } // _wPost(Х) ELSEIF nTable == 2 // таблица: Список абонентов ..............
| Полная функция вывода кнопки: Скрытый текст
///////////////////////////////////////////////////////////////////////////////////////////// FUNCTION my2BUTTON(y, x, w, h, cObj, cCapt, aBtnGrad, aBtnClr, aIcon, aFntClr, aFnt, nwPost ) LOCAL aGrOver, aGrFill, nSizeIcon, lSizeIcon, y1, x1, lTextVertical, cForm DEFAULT cCapt := "" , aFntClr := { BLACK, YELLOW } DEFAULT aFnt := { "Tahona", 12 , .T. , .F. } , aIcon := {"Icon1x1","Icon1x1",.F.,48} DEFAULT aBtnGrad := {} , aBtnClr := { BLUE, YELLOW } cForm := _HMG_ThisFormName IF LEN(aFnt) == 4 lTextVertical := aFnt[4] // VERTICAL ELSE lTextVertical := .F. ENDIF IF LEN(aIcon) < 3 ; lSizeIcon := .F. ELSE ; lSizeIcon := aIcon[3] ENDIF IF LEN(aIcon) < 4 ; nSizeIcon := 32 ELSE ; nSizeIcon := aIcon[4] ENDIF IF LEN(aBtnGrad) > 0 aGrOver := { { 0.5, aBtnGrad[2], aBtnGrad[1] }, { 0.5, aBtnGrad[1], aBtnGrad[2] } } aGrFill := { { 0.5, aBtnGrad[1], aBtnGrad[2] }, { 0.5, aBtnGrad[2], aBtnGrad[1] } } IF lSizeIcon IF lTextVertical // VERTICAL @ y, x BUTTONEX &cObj PARENT &cForm WIDTH w HEIGHT h CAPTION cCapt ICON aIcon[1] ; NOXPSTYLE HANDCURSOR NOTABSTOP ; BACKCOLOR aGrOver GRADIENTFILL aGrFill ; FONT aFnt[1] SIZE aFnt[2] BOLD VERTICAL ; ON MOUSEHOVER ( This.GradientFill := aGrFill , This.Fontcolor := aFntClr[2] ,; This.Icon := LoadIconByName(aIcon[2], nSizeIcon, nSizeIcon) ) ; ON MOUSELEAVE ( This.GradientOver := aGrOver , This.Fontcolor := aFntClr[1] ,; This.Icon := LoadIconByName(aIcon[1], nSizeIcon, nSizeIcon) ) ; ON INIT {|| This.Cargo := nwPost } ; ACTION _wPost(This.Cargo, , This.Name) ELSE @ y, x BUTTONEX &cObj PARENT &cForm WIDTH w HEIGHT h CAPTION cCapt ICON aIcon[1] ; NOXPSTYLE HANDCURSOR NOTABSTOP ; BACKCOLOR aGrOver GRADIENTFILL aGrFill ; FONT aFnt[1] SIZE aFnt[2] BOLD ; ON MOUSEHOVER ( This.GradientFill := aGrFill , This.Fontcolor := aFntClr[2] ,; This.Icon := LoadIconByName(aIcon[2], nSizeIcon, nSizeIcon) ) ; ON MOUSELEAVE ( This.GradientOver := aGrOver , This.Fontcolor := aFntClr[1] ,; This.Icon := LoadIconByName(aIcon[1], nSizeIcon, nSizeIcon) ) ; ON INIT {|| This.Cargo := nwPost } ; ACTION _wPost(This.Cargo, , This.Name) ENDIF // при первом построении изменить размер иконки This.&(cObj).Icon := LoadIconByName( aIcon[1], nSizeIcon, nSizeIcon ) ELSE IF lTextVertical // VERTICAL @ y, x BUTTONEX &cObj PARENT &cForm WIDTH w HEIGHT h CAPTION cCapt ICON aIcon[1] ; NOXPSTYLE HANDCURSOR NOTABSTOP ; BACKCOLOR aGrOver GRADIENTFILL aGrFill ; FONT aFnt[1] SIZE aFnt[2] BOLD VERTICAL ; ON MOUSEHOVER ( This.GradientFill := aGrFill , This.Icon := aIcon[2] ,; This.Fontcolor := aFntClr[2] ) ; ON MOUSELEAVE ( This.GradientOver := aGrOver , This.Icon := aIcon[1] ,; This.Fontcolor := aFntClr[1] ) ; ON INIT {|| This.Cargo := nwPost } ; ACTION _wPost(This.Cargo, , This.Name) ELSE @ y, x BUTTONEX &cObj PARENT &cForm WIDTH w HEIGHT h CAPTION cCapt ICON aIcon[1] ; NOXPSTYLE HANDCURSOR NOTABSTOP ; BACKCOLOR aGrOver GRADIENTFILL aGrFill ; FONT aFnt[1] SIZE aFnt[2] BOLD ; ON MOUSEHOVER ( This.GradientFill := aGrFill , This.Icon := aIcon[2] ,; This.Fontcolor := aFntClr[2] ) ; ON MOUSELEAVE ( This.GradientOver := aGrOver , This.Icon := aIcon[1] ,; This.Fontcolor := aFntClr[1] ) ; ON INIT {|| This.Cargo := nwPost } ; ACTION _wPost(This.Cargo, , This.Name) ENDIF ENDIF ELSE IF lSizeIcon IF lTextVertical // VERTICAL @ y, x BUTTONEX &cObj PARENT &cForm WIDTH w HEIGHT h CAPTION cCapt ICON aIcon[1] ; NOXPSTYLE HANDCURSOR NOTABSTOP BACKCOLOR aBtnClr[1] ; FONT aFnt[1] SIZE aFnt[2] BOLD VERTICAL ; ON MOUSEHOVER ( This.Backcolor := aBtnClr[2] , This.Fontcolor := aFntClr[2] ,; This.Icon := LoadIconByName(aIcon[2],nSizeIcon,nSizeIcon) ); ON MOUSELEAVE ( This.Backcolor := aBtnClr[1] , This.Fontcolor := aFntClr[1] ,; This.Icon := LoadIconByName(aIcon[1],nSizeIcon,nSizeIcon) ); ON INIT {|| This.Cargo := nwPost } ; ACTION _wPost(This.Cargo, , This.Name) ELSE @ y, x BUTTONEX &cObj PARENT &cForm WIDTH w HEIGHT h CAPTION cCapt ICON aIcon[1] ; NOXPSTYLE HANDCURSOR NOTABSTOP BACKCOLOR aBtnClr[1] ; FONT aFnt[1] SIZE aFnt[2] BOLD ; ON MOUSEHOVER ( This.Backcolor := aBtnClr[2] , This.Fontcolor := aFntClr[2] ,; This.Icon := LoadIconByName(aIcon[2],nSizeIcon,nSizeIcon) ); ON MOUSELEAVE ( This.Backcolor := aBtnClr[1] , This.Fontcolor := aFntClr[1] ,; This.Icon := LoadIconByName(aIcon[1],nSizeIcon,nSizeIcon) ); ON INIT {|| This.Cargo := nwPost } ; ACTION _wPost(This.Cargo, , This.Name) ENDIF // при первом построении изменить размер иконки This.&(cObj).Icon := LoadIconByName( aIcon[1], nSizeIcon, nSizeIcon ) ELSE IF lTextVertical // VERTICAL @ y, x BUTTONEX &cObj PARENT &cForm WIDTH w HEIGHT h CAPTION cCapt ICON aIcon[1] ; NOXPSTYLE HANDCURSOR NOTABSTOP BACKCOLOR aBtnClr[1] ; FONT aFnt[1] SIZE aFnt[2] BOLD VERTICAL ; ON MOUSEHOVER ( This.Backcolor := aBtnClr[2] , This.Icon := aIcon[2] ,; This.Fontcolor := aFntClr[2] ) ; ON MOUSELEAVE ( This.Backcolor := aBtnClr[1] , This.Icon := aIcon[1] ,; This.Fontcolor := aFntClr[1] ) ; ON INIT {|| This.Cargo := nwPost } ; ACTION _wPost(This.Cargo, , This.Name) ELSE @ y, x BUTTONEX &cObj PARENT &cForm WIDTH w HEIGHT h CAPTION cCapt ICON aIcon[1] ; NOXPSTYLE HANDCURSOR NOTABSTOP BACKCOLOR aBtnClr[1] ; FONT aFnt[1] SIZE aFnt[2] BOLD ; ON MOUSEHOVER ( This.Backcolor := aBtnClr[2] , This.Icon := aIcon[2] ,; This.Fontcolor := aFntClr[2] ) ; ON MOUSELEAVE ( This.Backcolor := aBtnClr[1] , This.Icon := aIcon[1] ,; This.Fontcolor := aFntClr[1] ) ; ON INIT {|| This.Cargo := nwPost } ; ACTION _wPost(This.Cargo, , This.Name) ENDIF ENDIF ENDIF y1 := y + This.&(cObj).Height x1 := x + This.&(cObj).Width RETURN { y1, x1 }
|
| |
|
|
| постоянный участник
|
Пост N: 6944
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.04.21 16:38. Заголовок: Очередной вылет из п..
Очередной вылет из программы: Error DBFCDX/1022 Требуется блокировка --------------------------------- Stack Trace --------------------------------- Called from FIELDPUT(0) Called from MYSAVECARD(2737) in module: Source\Tbrw_fCard.prg Called from (b)MYCARDFIELDGETBOX(1983) in module: Source\Tbrw_fCard.prg Called from _DOCONTROLEVENTPROCEDURE(0) Called from EVENTS(0) Called from MYEVENTSHANDLER(1554) in module: Source\main.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from SHOW_CARD(373) in module: Source\Tbrw_fCard.prg Called from MYCARDTABLE(3362) in module: Source\Tbrw_table.prg Called from MYACTIONENTER(1604) in module: Source\Tbrw_table.prg Called from (b)FORM_MYTABLE(688) in module: Source\Tbrw_table.prg Called from DO_WINDOWEVENTPROCEDURE(0) Called from TWNDDATA:DOEVENT(0) Called from DO_ONWNDLAUNCH(0) Called from (b)INIT(0) Called from EVENTS(0) Вот код программы: // сетевой захват записи IF (cAlias)->(RLock()) FOR nI := 1 TO LEN(aStatEditFields) cObj := aStatEditFields[ nI, 1 ] cFld := aStatEditFields[ nI, 2 ] If ( nPos := FieldPos(cFld) ) > 0 FieldPut( nPos, _GetValue(cObj, cForm) ) // строка 2737 //MsgLog(nI,cObj,cFld, _GetValue(cObj, cForm) ) EndIf NEXT (cAlias)->KOPERAT := M->nOperat (cAlias)->DATEVVOD := DATE() Почему вылет, что не так делаю ?
| |
|
|
| |
Пост N: 7325
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.04.21 16:57. Заголовок: (cAlias)->(Field..
(cAlias)->(FieldPut(..........
| |
|
|
|
| постоянный участник
|
Пост N: 6945
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.04.21 17:16. Заголовок: Спасибо Dima ! :sm3..
Спасибо Dima ! Уже про это Сергей писал, да я код старый перекинул, торопился и вот результат... Ошибка плавающая, вылазит только когда несколько таблиц открываю, т.е. после переключения между таблицами.
| |
|
|
| |
Пост N: 7326
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.04.21 21:40. Заголовок: Andrey пишет: Ошибк..
Andrey пишет: цитата: | Ошибка плавающая, вылазит только когда несколько таблиц открываю |
| Не забывай всегда (где он допустим) указывать (cAlias)-> , ну ты понял , надеюсь......
| |
|
|
| постоянный участник
|
Пост N: 3720
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.04.21 00:55. Заголовок: Andrey пишет ..
Andrey пишет цитата: | If ( nPos := FieldPos(cFld) ) > 0 FieldPut( nPos, _GetValue(cObj, cForm) ) // строка 2737 //MsgLog(nI,cObj,cFld, _GetValue(cObj, cForm) ) EndIf |
| Уже предлагал тебе использовать объект-контейнер для работы с записями dbf (думаю, ошибок будет меньше) Повторю твой код, но с объектом LOCAL oRec := oKeyData() ... oRec:&(cFld) := _GetValue(cObj, cForm) oRec:KOPERAT := M->nOperat oRec:DATEVVOD := DATE() ... IF (cAlias)->( RLock() ) (cAlias)->( oRecPut(oRec) ) (cAlias)->( dbUnLock() ) ENDIF Выкладывал ф-ии, повторю что бы не искать Скрытый текст
*----------------------------------------------------------------------------* FUNCTION oRecGet( aField, oRec ) *----------------------------------------------------------------------------* LOCAL cFld, nPos Default oRec := oKeyData() IF ISCHAR(aField) aField := alltrim(aField) IF left(aField, 1) == "{" .and. right(aField, 1) == "}" aField := &aField ELSE aField := hb_ATokens(aField, ",") ENDIF ENDIF IF ISARRAY(aField) FOR EACH cFld IN aField IF Empty( cFld ) ; LOOP ELSEIF ISARRAY(cFld) ; cFld := cFld[1] // массив как структура ENDIF cFld := alltrim(cFld) IF ( nPos := FieldPos(cFld) ) > 0 oRec:Set( trim(FieldName(nPos)), FieldGet(nPos) ) ENDIF NEXT ELSE AEval( Array( FCount() ), {|v,n| v:=n, oRec:Set( trim(FieldName(n)), FieldGet(n) ) } ) ENDIF RETURN oRec *----------------------------------------------------------------------------* FUNCTION oRecPut( oRec, aField ) *----------------------------------------------------------------------------* LOCAL aFld, cFld, nPos, xVal, nCnt := 0 IF ISCHAR( aField ) aField := alltrim(aField) IF left(aField, 1) == "{" .and. right(aField, 1) == "}" aField := &aField ELSE aField := hb_ATokens(aField, ",") ENDIF ENDIF IF ISARRAY( aField ) FOR EACH cFld IN aField IF ISARRAY(cFld) ; cFld := aFld[1] // массив как структура ENDIF IF Empty( cFld ) ; LOOP ENDIF cFld := upper(alltrim( cFld )) xVal := oRec:Get( cFld ) IF xVal == NIL ; LOOP ENDIF IF ( nPos := FieldPos(cFld) ) > 0 IF FieldType( nPos ) $ "+^="; LOOP // защита записи ENDIF FieldPut( nPos, xVal ) nCnt++ ENDIF NEXT ELSE FOR EACH aFld IN oRec:GetAll(.F.) cFld := aFld[1] IF Empty(cFld) .or. aFld[2] == NIL ; LOOP ENDIF IF ( nPos := FieldPos(cFld) ) > 0 IF FieldType( nPos ) $ "+^="; LOOP // защита записи ENDIF FieldPut( nPos, aFld[2] ) nCnt++ ENDIF NEXT ENDIF RETURN nCnt > 0
|
| |
|
|
| постоянный участник
|
Пост N: 6946
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.04.21 13:49. Заголовок: Спасибо БОЛЬШОЕ ! :..
Спасибо БОЛЬШОЕ ! Этот код ещё в 2016 делал, перетаскивал из терминалки.
| |
|
|
| постоянный участник
|
Пост N: 6955
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.05.21 09:36. Заголовок: Продолжаю бороться с..
Продолжаю бороться с ошибками в своей программе. У меня прога не вылетает, а у юзера иногда вылетает. Вот код такой: DEFINE WINDOW Form_SeekAdr ; .... @ nRow, 550 BUTTONEX Button_Street WIDTH 44 HEIGHT nFontSize*2 ; CAPTION "?" FONTCOLOR BLACK BOLD NOXPSTYLE HANDCURSOR NOTABSTOP ; ACTION {|| aRet2 := SelectStreet(nCity) ,; // показ другого окна MODAL со списком улиц IF( LEN(aRet2) == 0, cStreet := "", cStreet := aRet2[2] ) ,; Form_SeekAdr.GetBox_CDom.Value := "" ,; Form_SeekAdr.GetBox_CStro.Value := "" ,; Form_SeekAdr.GetBox_CKorp.Value := "" ,; Form_SeekAdr.GetBox_CPdzd.Value := "" ,; Form_SeekAdr.GetBox_CKvar.Value := "" ,; cDom := cStro := cKorp := cPdzd := cKvar := "" ,; Form_SeekAdr.Label_Street.Value := " "+cStreet ,; SayLabelAdres(2,cCity,cStreet) ,; MyFocus() } // ошибка !!! строка 314 Ошибка у юзера: Time from start: 0 days 5 hours 2 mins 54 secs Error MGERROR/0 Control: GetBox_CDom Of Form_SeekAdr Not defined. Program terminated. --------------------------------- Stack Trace --------------------------------- Called from MSGMINIGUIERROR(0) Called from VERIFYCONTROLDEFINED(0) Called from SETPROPERTY(0) Called from (b)FORM_F7ADRES(314) in module: Source\table_F7Adres.prg Called from _DOCONTROLEVENTPROCEDURE(0) Called from EVENTS(0) Called from MYEVENTSHANDLER(1554) in module: Source\main.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from FORM_F7ADRES(459) in module: Source\table_F7Adres.prg Почему так происходит ? Как избавиться от этой ошибки ?
| |
|
|
| постоянный участник
|
Пост N: 6974
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.07.21 14:47. Заголовок: Вот такая у меня оши..
Вот такая у меня ошибка: Error BASE/1102 Неверный аргумент: UPPER Args: [1] = U --------------------------------- Stack Trace --------------------------------- Called from UPPER(0) Called from (b)TCNLDATA(795) in module: h_objects.prg Called from TCNLDATA:DEL(0) Called from (b)TCNLDATA(834) in module: h_objects.prg Called from TCNLDATA:DESTROY(0) Called from TWNDDATA:__msgDestructor(736) in module: h_objects.prg Called from SHELLEXECUTE(0) Called from PRINT_A81(1437) in module: Source\table_f5sklad4.prg Called from (b)FORM_A81(1029) in module: Source\table_f5sklad4.prg Строка 1437 - ShellExecute( , "Open", cFileLog,,, 1 )
| |
|
|
| |
Пост N: 7404
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.07.21 15:09. Заголовок: Andrey пишет: Error..
Andrey пишет: цитата: | Error BASE/1102 Неверный аргумент: UPPER Args: [1] = U |
| Ну так и проверь что у тебя попадает в качестве параметра в функцию UPPER
| |
|
|
| постоянный участник
|
Пост N: 6975
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.07.21 16:26. Заголовок: Dima пишет: Ну так ..
Dima пишет: цитата: | Ну так и проверь что у тебя попадает в качестве параметра в функцию UPPER |
| Это не у меня попадает. Я вызываю ShellExecute( , "Open", cFileLog,,, 1 ), блокнот поднимается с файлом, а потом наступает КРАХ программы. Почему ? Я ещё вижу в блокноте - две строчки ENTER-ом сдвигает. Хотя ничего не посылаю блокноту. Вот этот код почему срабатывает ? Called from UPPER(0) Called from (b)TCNLDATA(795) in module: h_objects.prg Called from TCNLDATA:DEL(0) Called from (b)TCNLDATA(834) in module: h_objects.prg Called from TCNLDATA:DESTROY(0) Called from TWNDDATA:__msgDestructor(736) in module: h_objects.prg
| |
|
|
| постоянный участник
|
Пост N: 1616
Зарегистрирован: 27.01.07
|
|
Отправлено: 04.07.21 18:14. Заголовок: Andrey пишет: UPPER..
Andrey пишет: Это означает, что первый аргумент функции Upper имеет тип Undefined. Вот и проверяй, что за херня в cFileLog в этот момент содержится.
| |
|
|
| постоянный участник
|
Пост N: 6976
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.07.21 18:57. Заголовок: PSP пишет: Вот и пр..
PSP пишет: цитата: | Вот и проверяй, что за херня в cFileLog в этот момент содержится. |
| Файл нормальный, ошибки в него печатаю, потом поднимаю: IF FILE(cFileLog) cMsg := "Исправьте ошибки и повторите печать заново;" cMsg += "Всего ошибок = " + HB_NtoS( nErr ) + ";;" cMsg += "Список ошибок появиться после этого окна !" MG_Stop( cMsg, "Ошибки печати" ) // функция на базе HMG_Alert() DO EVENTS cMsg := CRLF + "Исправьте ошибки и повторите печать заново !" + CRLF cMsg += "Всего ошибок = " + HB_NtoS( nErr ) STRFILE( cMsg + CRLF, cFileLog, .T. ) DO EVENTS ShellExecute( , 'open', cFileLog, , , SW_SHOWNORMAL) // строка 1437 DO EVENTS ENDIF Блокнот открывает его и показывает ! Почему после открытия блокнота прога валиться ? Почему срабатывает вот этот код после ShellExecute() ? Called from UPPER(0) Called from (b)TCNLDATA(795) in module: h_objects.prg Called from TCNLDATA:DEL(0) Called from (b)TCNLDATA(834) in module: h_objects.prg Called from TCNLDATA:DESTROY(0) Called from TWNDDATA:__msgDestructor(736) in module: h_objects.prg Вот исходник h_objects.prg: #ifndef __XHARBOUR__ METHOD PROCEDURE DestroyObject() CLASS TWndData ::Destroy() // строка 736 RETURN #endif
| |
|
|
|
| |
Пост N: 7405
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.07.21 19:26. Заголовок: Andrey пишет: Почем..
Andrey пишет: цитата: | Почему срабатывает вот этот код после ShellExecute() ? |
| ShellExecute ведь не приостанавливает работу программы , поэтому и срабатывает код далее. Или ShellExecute чем то отличается от WAPI_ShellExecute ?
| |
|
|
| постоянный участник
|
Пост N: 1617
Зарегистрирован: 27.01.07
|
|
Отправлено: 04.07.21 19:39. Заголовок: Так что в переменной..
Так что в переменной cFileLog?
| |
|
|
| Администратор
|
Пост N: 4033
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.07.21 21:28. Заголовок: Возможно, при вызове..
Возможно, при вызове ShellExecute вызывается LostFocus для какого-то объекта, внутри LostFocus вызывается Destroy для какого-то объекта, и в этом Destroy уже идет вызов Upper с параметром nil Дополню: при выполнении ShellExecute вызывается (почему - вопрос) Destroy для объекта класса TCnlData, у которого свойство ::cName равно nil.
| |
|
|
| постоянный участник
|
Пост N: 6977
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.07.21 10:36. Заголовок: PSP пишет: Так что ..
PSP пишет: цитата: | Так что в переменной cFileLog? |
| Имя файла. Файл создаётся нормально. В файле не особо много (20-30) строк. В конце вот эта строка: cMsg := CRLF + "Исправьте ошибки и повторите печать заново !" + CRLF cMsg += "Всего ошибок = " + HB_NtoS( nErr ) STRFILE( cMsg + CRLF, cFileLog, .T. ) Она тоже есть.
| |
|
|
| постоянный участник
|
Пост N: 6978
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.07.21 10:50. Заголовок: Поставил вместо MG_S..
Поставил вместо MG_Stop() обычный: MsgStop( cMsg , "Ошибки печати" ) Убрал своё окно ошибок. Всё равно вылет после ShellExecute() Вот такое окно: Как исправить данную ситуацию ?
| |
|
|
| |
Пост N: 7406
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.07.21 11:12. Заголовок: А вот тут точно Xnam..
А вот тут точно Xname должно быть ? METHOD Get( xName ) INLINE iif( HB_ISCHAR( xName ), ::oWin:oName:Get( Upper( xName ) ), ; ::oWin:oHand:Get( xName ) ) Может Cname.......
| |
|
|
| постоянный участник
|
Пост N: 3781
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.07.21 11:35. Заголовок: Andrey пишет Как исп..
Andrey пишет цитата: | Как исправить данную ситуацию ? |
| Смотреть код, что дальше работает после ShellExecute(). Паша верно указал направление, после ShellExecute() попадаем на Destroy окна (TWndData), идет Destroy контролам (TCnlData) и в списке регистрации на окно контролов по имени и handle получаем nil (Get(xName))
| |
|
|
| Администратор
|
Пост N: 4034
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.07.21 11:51. Заголовок: Только не после Shel..
Только не после ShellExecute(), а в процессе его выполнения вызывается (по неизвестной причине) Destroy какого-то контрола из Destroy: METHOD Destroy() INLINE ( ::Del(), ; ::oCargo := iif( HB_ISOBJECT( ::oCargo ), ::oCargo:Destroy(), Nil ), ; ::oEvent := iif( HB_ISOBJECT( ::oEvent ), ::oEvent:Destroy(), Nil ), ; ::oOnEventBlock := iif( HB_ISOBJECT( ::oOnEventBlock ), ::oOnEventBlock:Destroy(), Nil ), ; ::oUserKeys := iif( HB_ISOBJECT( ::oUserKeys ), ::oUserKeys:Destroy(), Nil ), ; ::oName := iif( HB_ISOBJECT( ::oName ), ::oName:Destroy(), Nil ), ; ::oHand := iif( HB_ISOBJECT( ::oHand ), ::oHand:Destroy(), Nil ), ; ::nParent := ::nIndex := ::cName := ::cType := ::cVar := ::cChr := NIL, ; hmg_DelWindowObject( ::nHandle ), ::nHandle := Nil ) вызывается метод Del, и затем в неи (это строка 795 в последней версии 21.05 ) METHOD Del() INLINE ( iif( HB_ISOBJECT( ::oWin:oName ), ::oWin:oName:Del( Upper( ::cName ) ), ), ; iif( HB_ISOBJECT( ::oWin:oHand ), ::oWin:oHand:Del( ::nHandle ), ) ) на Upper( ::cName ) программа сваливается
| |
|
|
| постоянный участник
|
Пост N: 6979
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.07.21 11:58. Заголовок: SergKis пишет: посл..
SergKis пишет: цитата: | после ShellExecute() попадаем на Destroy окна (TWndData), идет Destroy контролам (TCnlData) и в списке регистрации на окно контролов по имени и handle получаем nil (Get(xName)) |
| Блин, не там искал... Всё мыслю старыми категориями. На кнопке вызова печати имею такое событие: :Event( 2, {| | Form_1Prn.Btn_02.Enabled := .F. ,; Darken2Open(hForm) ,; // Затенение на форме Print_A81(.....) ,; // сама печать lStaticOkPrintA81 := .T. ,; // кнопка печати нажата Form_1Prn.Btn_02.Enabled := .T. ,; Darken2Close(hForm) ,; // Затенение на форме RefreshWin( hForm ) ,; // перерисовать объекты на форме DoEvents(), This1Focus() } ) И где тут идёт Destroy ?
| |
|
|
| постоянный участник
|
Пост N: 6980
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.07.21 12:13. Заголовок: Pasha пишет: вызыва..
Pasha пишет: цитата: | вызывается метод Del, и затем в неи (это строка 795 в последней версии 21.05 ) |
| Вот я про это и писал, почему так происходит ? Как исправить эту ситуацию ?
| |
|
|
| Администратор
|
Пост N: 4035
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.07.21 12:16. Заголовок: В том то и дело, что..
В том то и дело, что ошибка возникает не после ShellExecute(), а в процессе его выполнения, иначе ShellExecute() не было бы в логе ошибок Ну а Destroy не надо вызывать напрямую. Он вызовется из деструктора объекта, а деструктор вызовется, если очистить переменную, содержащую объект, либо при завершении функции, в которой объект был создан, если этот объект не был присвоен другой переменной
| |
|
|
| Администратор
|
Пост N: 4036
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.07.21 12:18. Заголовок: Andrey пишет: Как и..
Andrey пишет: цитата: | Как исправить эту ситуацию ? |
| Можно хоть двадцать раз повторять эту мантру, и через сообщения кидать лог ошибок Надо разбираться в коде, а по одному логу ничего не сделать. Все, что можно вытащить из лога, я вытащил
| |
|
|
| постоянный участник
|
Пост N: 6983
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.07.21 01:55. Заголовок: Блин и в других мест..
Блин и в других местах стало так же вылетать при вызове ShellExecute() Раньше не вылетало.... Вот ошибка пример: Error BASE/1102 Неверный аргумент: UPPER Args: [1] = U Called from UPPER(0) Called from (b)TCNLDATA(795) in module: h_objects.prg Called from TCNLDATA:DEL(0) Called from (b)TCNLDATA(834) in module: h_objects.prg Called from TCNLDATA:DESTROY(0) Called from TWNDDATA:__msgDestructor(736) in module: h_objects.prg Called from SHELLEXECUTE(0) Called from PASTERTFTOFIELD(373) in module: Source\util_Word.prg Called from WORD_WRITE(87) in module: Source\util_Word.prg
| |
|
|
| |
Пост N: 7409
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.07.21 09:07. Заголовок: Andrey пишет: Блин ..
Andrey пишет: цитата: | Блин и в других местах стало так же вылетать при вызове ShellExecute( |
| Видимо в новой версии MG косячок
| |
|
|
| постоянный участник
|
Пост N: 3782
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.07.21 09:52. Заголовок: Andrey Попробуй min..
Andrey Попробуй minigui.lib, которую положил на ftp. В ней правка такая CLASS TWndData ... METHOD Del() INLINE ( iif( HB_ISOBJECT( ::oWin:oName ), ; iif( HB_ISCHAR(::cName), ::oWin:oName:Del( Upper( ::cName ) ), ), ), ; iif( HB_ISOBJECT( ::oWin:oHand ), ; iif( HB_ISNUMERIC( ::nHandle ), ::oWin:oHand:Del( ::nHandle ), ), ) ) PS. это проверка наличия контрола, т.к. похоже возникает ситуация destroy для контрола, которого нет или уже нет (повторный destroy)
| |
|
|
| постоянный участник
|
Пост N: 6985
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.07.21 11:57. Заголовок: SergKis пишет: Попр..
SergKis пишет: Спасибо БОЛЬШОЕ !!! Буду пробовать.
| |
|
|
| постоянный участник
|
Пост N: 6989
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.07.21 21:07. Заголовок: SergKis пишет: В не..
SergKis пишет: Потестировал ! Вроде не вылетает !!! Надо бы добавить эту правку Григорию для новой версии МиниГуи !
| |
|
|
| moderator
|
Пост N: 1896
Зарегистрирован: 11.02.10
|
|
Отправлено: 13.07.21 09:36. Заголовок: Andrey пишет: добав..
Andrey пишет: Уже добавил Благодарю за проверку
| |
|
|
| Администратор
|
Пост N: 4037
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.07.21 08:13. Заголовок: Если такая ошибка в ..
Если такая ошибка в прежней версии возникает стабильно, то можно поймать первопричину, и попытаться ее устранить В тестовой версии библиотеки добавить что-то вроде: METHOD Del() INLINE ( iif( HB_ISOBJECT( ::oWin:oName ), ; iif( HB_ISCHAR(::cName), ::oWin:oName:Del( Upper( ::cName ) ), writelog(::ClassName) ), ), ; iif( HB_ISOBJECT( ::oWin:oHand ), ; iif( HB_ISNUMERIC( ::nHandle ), ::oWin:oHand:Del( ::nHandle ), ), ) ) чтобы хоть понять, какой наследник TCnlData генерирует ошибку. Для дальнейшей локализации можно в лог выдавать и другие параметры объекта wrilelog - сделать функцию выводе текста в файл, или использовать аналог
| |
|
|
| постоянный участник
|
Пост N: 3787
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.07.21 11:55. Заголовок: Pasha пишет чтобы хо..
Pasha пишет цитата: | чтобы хоть понять, какой наследник TCnlData генерирует ошибку |
| Это мало что даст, т.к. родителем будет TWndData, а наследник, в основном, TCnlData, там вариантов мало. Для понимания ситуации надо полный текст программы Андрея и трассировать его ситуацию по списку контролов и окон.
| |
|
|
| постоянный участник
|
Пост N: 7033
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.08.21 19:58. Заголовок: Опять прога вылетает..
Опять прога вылетает на простом месте у юзеров. У меня не вылетает. Почему так ? Вот такая ошибка: DbInfo: Alias - ZAIVKA, Ord - ZA_KVIPZA, Recno - 2001/2036 Time from start: 0 days 4 hours 47 mins 22 secs Error MGERROR/0 Control: Label_Tit1 Of Form_YRep1 Not defined. Program terminated. --------------------------------- Stack Trace --------------------------------- Called from MSGMINIGUIERROR(0) Called from VERIFYCONTROLDEFINED(0) Called from SETPROPERTY(0) Called from RPRT18_ZAIVKI(300) in module: Source\form_report18.prg Called from (b)HB_MACROBLOCK(0) Called from REPORTCALC(680) in module: Source\form_report00.prg Called from (b)HB_MACROBLOCK(0) Called from RUNBUTTONRESUME(544) in module: Source\form_report00.prg Called from (b)REPORTFORMCALC(259) in module: Source\form_report00.prg Called from _DOCONTROLEVENTPROCEDURE(0) Called from EVENTS(0) Called from MYEVENTSHANDLER(1647) in module: Source\main.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from REPORTFORMCALC(399) in module: Source\form_report00.prg Вот код: SELECT ZAIVKA DbSetOrder(1) nKolvo := ORDKEYCOUNT() FOR nG := 1 TO LEN(aXdim) ..... cVal := "Расчет по " + cTitle SetProperty( aLabel[1], aLabel[2], "Value" , cVal ) // выводим надпись FOR nI := 1 TO nKolvo SELECT ZAIVKA ORDKEYGOTO( nI ) IF nI % nPokaz == 0 // выводим через XXX записей cMsg := SPACE( 10 ) + HB_NtoS( nI ) + "/" + HB_NtoS( nKolvo ) SetProperty( aLabel[1], aLabel[2], "Value" , cVal + cMsg ) // выводим надпись // строка 300 // рисуем бегунок Label_Progress_Bar( aBeg[1], aBeg[2], aBeg[3], aBeg[4], aBeg[5], aBeg[6],aBeg[7] , nI * nProc, 100 ) ENDIF .... ProcessMessages() NEXT .... NEXT Вывожу форму, а в другом модуле делаю расчёт. Бегунок дергаю из модуля расчёта. Штук 20 таких отчётов и на одном сегодня появился вылет. Потом правда не вылетало... Как юзера этого добиваются ? Одни загадки.... Писать везде проверку на существование такого объекта на форме ? Блин, утомительно... Как можно решить проблему вылета ?
| |
|
|
| |
Пост N: 7442
Зарегистрирован: 17.05.05
|
|
Отправлено: 30.08.21 20:51. Заголовок: Andrey пишет: Писат..
Andrey пишет: цитата: | Писать везде проверку на существование такого объекта на форме ? |
| Видимо да
| |
|
|
| постоянный участник
|
Пост N: 3853
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.08.21 21:04. Заголовок: Andrey пишет Штук 20..
Andrey пишет цитата: | Штук 20 таких отчётов и на одном сегодня появился вылет. Потом правда не вылетало... |
| По мне, это говорит о том, что идет работа с памятью, мусоросборщик или windows damp\restore\swap и ты попадаешь, когда адрес еще в подвешенном состоянии для программы. Дима прав, делать надо свою ф-ю mySet\GetProperty с циклом и begin sequence, если recover делать wApiSleep(100) и повторять, операцию доступа к контролу, несколько раз такого цикла и дальше идешь без вывода, можешь лог вести на такие ситуации. Еще мусоросборщик надо самому запускать хотя бы перед созданием новых окон. Программы у тебя, кажется, не маленькие и в ресурсах до фига всего, если не ошибаюсь - вот память и колбасит PS/ И на мой взгляд поменьше всяких "бегунков-прыгунков-ползунков" - это все потребляет ресурсы
| |
|
|
| постоянный участник
|
Пост N: 7034
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.08.21 22:08. Заголовок: SergKis пишет: Еще ..
SergKis пишет: цитата: | Еще мусоросборщик надо самому запускать хотя бы перед созданием новых окон. Программы у тебя, кажется, не маленькие и в ресурсах до фига всего, если не ошибаюсь - вот память и колбасит |
| Как это сделать ? Ни разу не делал.... Судя по скрину экрана (а я при ошибке всегда теперь делаю скрин) был запущенн только модуль отчетов, где вылетела и модуль чтения базы постгресса по таймеру. Может там что-то пришло по таймеру ? Хотя при входе в модуль отчётов я таймер отключаю. Called from MSGMINIGUIERROR(0) Called from VERIFYCONTROLDEFINED(0) Called from SETPROPERTY(0) Called from RPRT18_ZAIVKI(300) in module: Source\form_report18.prg Called from (b)HB_MACROBLOCK(0) Called from REPORTCALC(680) in module: Source\form_report00.prg Called from (b)HB_MACROBLOCK(0) Called from RUNBUTTONRESUME(544) in module: Source\form_report00.prg Called from (b)REPORTFORMCALC(259) in module: Source\form_report00.prg Called from _DOCONTROLEVENTPROCEDURE(0) Called from EVENTS(0) Called from MYEVENTSHANDLER(1647) in module: Source\main.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0)
| |
|
|
| постоянный участник
|
Пост N: 3854
Зарегистрирован: 17.02.12
|
|
Отправлено: 31.08.21 00:37. Заголовок: Andrey пишет Как это..
Andrey пишет цитата: | Как это сделать ? Ни разу не делал.... |
| HB_GCALL() Поищи "сборщик мусора" на форуме , были темы и ты в них участвовал цитата: | был запущенн только модуль отчетов, где вылетела и модуль чтения базы постгресса по таймеру. |
| На время работы постгреса, твоя программа, могла быть swapoвана на диск виндой и потом восстанавливатся, для продолжения работы, х.з. в реале что было у клиента. Пример с letoDbf, клиент соединен с сервером работает, потом пошел пить кофе, PC "заснул", клиент пришел, PC "проснулся" и внешне все ok! с прогой hmg, но любое обращение к серверу валит программу, т.к. разрушились буфера\инф. коннекта с сервером. Точно такое же снятие происходит у клиента, если Клиент ушел домой, оставив программу в памяти с открытыми таблицами. С 7-8 утра происходит пополнение базы сервера, локальной программой на сервере (режим shared = 1 letodb.ini), но в монопольном режиме (так версия, пока, устроена). Эта операция проходит 1 раз в день и обязательно должна пройти. В letoDbf есть ф-я Leto_Kil(...), в таком случае она применяется программой пополнения ко всем клиентам с коннектом к серверу. Она срабатывает отлично, разъединяя, закрывая таблицы. Клиенты придя на работу на экране видят прекрасное окно (это я к тому снимку, который ты делаешь с экрана в error.log - скорее вводит в заблуждение), но любая попытка работать валит клиента, т.к. разрушено соединение. Это я к тому, что ты можешь догадываться, предполагать, понимать что могло произойти на клиенте, но знать точно ... Потому твоя программа должна быть готова ко всему, в разумных пределах.
| |
|
|
| постоянный участник
|
Пост N: 7036
Зарегистрирован: 12.09.06
|
|
Отправлено: 31.08.21 08:18. Заголовок: Почитал. Да это я п..
Почитал. Да это я пропустил в своё время, посчитав что не нужно. Прога тогда была у меня меньше на порядок. Поставил HB_GCALL() , прога даже не замирает. При входе в отчёты заставляю юзера закрывать ВСЕ другие окна, остаётся только одно окно с отчётами. Буду наблюдать дальше за своими юзерами. Спасибо БОЛЬШОЕ !
| |
|
|
| постоянный участник
|
Пост N: 7038
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.09.21 21:50. Заголовок: Делюсь своим опытом ..
Делюсь своим опытом понятия и работы с МиниГуи. Корифеям можно не читать, ну или хотя бы добавить. Многое мне Сергей помог и объяснил, но думаю что у других НЕТ такого учителя ! У меня БОЛЬШАЯ проблема была с пониманием почему маленькие проги на МиниГуи отлично работают, а моя большая программа нет. У меня один модуль обслуживает одновремеено 5 похожих таблиц. Объявлена одна переменная PRIVATE oBrw В ней и крутяться 5 таблиц. У себя на компе прога не вылетает, а у юзеров были постоянные вылеты. Юзер запускает мою прогу, 1С, мозилу, эксель и т.д. То есть память компа кушается отлично, в отличие от моих тепличных условий. Переделал, как мне Сергей рекомендовал уйти от привязки объектов, например: Скрытый текст @ 20, 0 LABEL CargoIniSave WIDTH 10 HEIGHT 20 VALUE "" INVISIBLE SetProperty(cFormName, "CargoIniSave", "Cargo", aIniSave ) @ 20, 0 LABEL CargoFilter WIDTH 10 HEIGHT 20 VALUE "" INVISIBLE SetProperty(cFormName, "CargoFilter", "Cargo", {} ) @ 20, 0 LABEL CargoSort WIDTH 10 HEIGHT 20 VALUE "" INVISIBLE SetProperty(cFormName, "CargoSort", "Cargo", {} ) ............
| На контейнер, который железно привязанный к окну, примерно так: Скрытый текст
(This.Object):Cargo := oKeyData() // создать объект (контейнер) для окна &cFormName oCrg := (This.Object):Cargo oCrg:aRunFunc := {cGlobSection,cFormName,nTable} oCrg:cAlias := ALIAS() oCrg:aMemIndexOpen := aCargoMemIndexOpen oCrg:aIniSave := aIniSave oCrg:aTsbFilter := {} oCrg:aTsbSort := {} oCrg:aSaveFilter := {} oCrg:aColor2Uslov := {} oCrg:aColor2Info := {}
| Подробно я это уже описывал - Пост N: 6941 Кроме того везде, где есть работа с кнопками (для больших списков), вместо такого кода: @ .... BUTTONEX Button_City ... ACTION {|cw,cn| cw := ThisWindow.Name, cn := This.Name ,; SetProperty(cw, cn, "Enabled", .F.) ,; aRet1 := SelectCity() ,; // справочник городов IF( LEN(aRet1) == 0, nCity := 0 , nCity := aRet1[1] ) ,; IF( LEN(aRet1) == 0, cCity := "", cCity := aRet1[2] ) ,; nStreet := 0 , cStreet := "" ,; nDom := nStro := nKorp := nPdzd := nKvar := 0 ,; cDom := cStro := cKorp := cPdzd := cKvar := "" ,; This.Label_Street.Value := "" ,; This.GetBox_NDom.Value := 0 ,; This.GetBox_CDom.Value := "" ,; This.GetBox_NStro.Value := 0 ,; This.GetBox_CStro.Value := "" ,; This.GetBox_NKorp.Value := 0 ,; This.GetBox_CKorp.Value := "" ,; This.GetBox_NPdzd.Value := 0 ,; This.GetBox_CPdzd.Value := "" ,; This.GetBox_NKvar.Value := 0 ,; This.GetBox_CKvar.Value := "" ,; Form_SeekAdr.Label_City.Value := " " + cCity ,; SayLabelAdres(1,cCity) ,; SetProperty(cw, cn, "Enabled", .T.) ,; MyFocus() } Нужно ставить событие на кнопку, вот так: @ .... BUTTONEX Button_Street ... ACTION {|| _wSend(20), _wPost(22) } А ниже описание/назначение событий, до END WINDOW примерно так: WITH OBJECT This.Object :Event( 0, {| | InkeyGui(200) } ) // для кнопки справочника улиц :Event(20, {| | This.Button_Street.Enabled := .F. , DoEvents() } ) :Event(22, {|ow| LOCAL aRet3 LOCAL aGet //, cGet, cN myLogErr("=== кнопка справочника Улиц = " + ProcNL()) myLogErr(1, valtype(ow:Name), ow:Name) myLogErr(_IsWindowDefined(ow:Name), This.Name) aRet3 := SelectStreet(nCity) // вызов нового окна улиц IF LEN(aRet3) == 0 nStreet := 0 cStreet := "" ELSE nStreet := aRet3[1] cStreet := aRet3[2] ENDIF nDom := nStro := nKorp := nPdzd := nKvar := 0 cDom := cStro := cKorp := cPdzd := cKvar := "" myLogErr(2, valtype(ow:Name), ow:Name) IF !Empty(ow:Name) .and. ISCHAR(ow:Name) aGet := HMG_GetFormControls(ow:Name, "GETBOX") ? " === кнопка справочника Улиц = " + ProcNL() ? " GETBOX =", aGet ; ?a aGet SET WINDOW THIS TO ow:Name /* можно такой вариант делать FOR EACH cGet IN aGet cN := subs(cGet, 7, 2) IF cN == "_C" This.&(cGet).Value := "" ELSEIF cN == "_N" This.&(cGet).Value := 0 ENDIF NEXT */ // мне не нравится запись Form_SeekAdr.GetBox_NDom.Value // т.к. препроцесору нужно знание\объявление об окне // DECLARE Form_SeekAdr // тогда лучше исп. ф-ии DoMethod(), Set\GetProperty() Form_SeekAdr.GetBox_NDom.Value := 0 This.GetBox_CDom.Value := "" This.GetBox_NStro.Value := 0 This.GetBox_CStro.Value := "" This.GetBox_NKorp.Value := 0 This.GetBox_CKorp.Value := "" This.GetBox_NPdzd.Value := 0 This.GetBox_CPdzd.Value := "" This.GetBox_NKvar.Value := 0 This.GetBox_CKvar.Value := "" This.Label_Street.Value := " "+cStreet This.Button_Street.Enabled := .T. // разблок.кнопку SET WINDOW THIS TO SayLabelAdres(2,cCity,cStreet) MyFocus() DoEvents() ENDIF ? " === ", ow:Name, _IsWindowDefined(ow:Name), This.Name, "exit" RETURN NIL } ) :Event(99, {|ow| ow:Release() } ) END WITH END WINDOW Прога стала стабильно работать, все довольны и я в том числе !!! Бывает и так, что у юзера 2 часа прога проработала и свалилась, вроде на пустом месте. Сделал запись всего экрана в папку ошибок при "вылете" из программы. Смотрю на экране только моя программа с ОДНИМ окном и мозила. Вот пример такой ошибки: Error BASE/1003 Переменная не существует: OBRW --------------------------------- Stack Trace --------------------------------- Called from (b)FORM_MYTABLE(683) in module: Source\Tbrw_table.prg Called from DO_WINDOWEVENTPROCEDURE(0) Called from TWNDDATA:DOEVENT(0) Called from DO_ONWNDLAUNCH(0) Called from (b)INIT(0) Called from EVENTS(0) Called from MYEVENTSHANDLER(1650) in module: Source\main.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from MAIN(194) in module: Source\main.prg По коду выглядит так: :Event(70, {|ow | // F7 Поиск LOCAL hHandle, cSect_F6F7, aGlSect, aFilter LOCAL cFormName := ow:Name hHandle := ow:Handle // или так ThisWindow.Handle This.oBut_Filtr.Enabled := .F. Darken2Open(hHandle) aGlSect := ow:Cargo:aGlobalSection cSect_F6F7 := MyGetMainSection("Секция_F6F7", aGlSect ) aFilter := FormTbrFiltr(nTable,cSect_F6F7,aIniSave,aFilter) MsgLog("--- VK_F7 кнопка: F7 Поиск" + ProcNL() ) MsgLog(" фильтр=" + HB_ValToExp(aFilter) ) _wSend(7, cFormName, aFilter[1]) myLogErr("--- VK_F7 кнопка: F7 Поиск --- " + ProcNL()) myLogErr(1, valtype(ow:Name), ow:Name) Darken2Close(hHandle) IF LEN(aFilter[4]) > 0 TsbNewSeek(cFormName,nTable,aFilter[4]) ELSE TsbNewIndex(cFormName,nTable,aFilter[2],aFilter[1],aFilter[3]) ENDIF myLogErr(2, "hHandle=", hHandle) myLogErr(_IsWindowDefined(ow:Name), ow:Name) IF GetControlIndex("oBut_Filtr", cFormName ) > 0 SetProperty(cFormName, "oBut_Filtr", "Enabled", .T.) ENDIF строка 683 !!! ToUpButtonHideShow( cFormName, nTable, oBrw ) Tsb4Focus(nTable) Return Nil } ) Вот и вылет на пустом месте у меня !!! А я всё не понимал, почему падает прога, вроде всё в коде правильно написано. Оказывается всё не так просто. Вот ответ Сергея, я думаю многим будет это интересно тоже почитать: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Мозила много памяти жрет, твоя прога может дергаться на перекомпоновку памяти Как можно меньше используй внешние переменные в блоках кода, особенно, когда они сложные (много вызовов разных), как тут. Много раз говорил, что система и сборщик мусора первыми перелопачивает в памяти PUBLIC и PRIVATE переменные, что бы собрать непрерывный кусок памяти. Т.е. При создании блока кода в oBrw был один адрес, если в процессе работы блока кода, произошла прекомпоновка памяти то ссылка будет на новый адрес, а в блоке кода останется старый и будет сваливаться прога (что у тебя и происходит). Если прога небольшая, то памяти непрерывным куском достаточно для работы (перекомпоновка редко происходит), если прога большая (или исп. еще прога, мозила, например), то это происходит часто и не зависимо от тебя. Использование вместо PUBLIC, PRIVATE переменных команд App.Cargo := oKeyData() ThisWindow.Cargo := oKeyData() или для контрола This.Cargo := oKeyData() это не прихоть, а борьба за правильные адреса. При перекомпоновке памяти Григорий, внедряя класс THmgData и переводя на него внутренние переменные, тоже идет по этому пути. Еще надо было бы перевести на него и внутренние PUBLIC переменные окон и контролов ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Вот так на пустом месте в проге юзера у меня и "падают" .... Здесь есть несколько вариантов решения, остановился пока на простом: :Event(70, {|ow,ky,ob| // F7 Поиск ..... ToUpButtonHideShow( cFormName, nTable, ob ) То есть я избавился от oBrw Надеюсь что это пригодиться другим в понимание, как писать проги на МиниГуи. Сергей, СПАСИБО тебе ОГРОМНОЕ !
| |
|
|
| постоянный участник
|
Пост N: 7058
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.09.21 01:54. Заголовок: Опять непонятка по в..
Опять непонятка по вылету из проги. Вот ошибка: Time from start: 0 days 6 hours 42 mins 2 secs Error MGERROR/0 Control: Text_1 Of Form_Dim Not defined. Program terminated. --------------------------------- Stack Trace --------------------------------- Called from MSGMINIGUIERROR(0) Called from VERIFYCONTROLDEFINED(0) Called from GETPROPERTY(0) Called from REFRESHBROWSE(1090) in module: Source\Sel_Dim_Hmg.prg Called from MYKEYACTIONDIM(1025) in module: Source\Sel_Dim_Hmg.prg Called from (b)DIMCREATEBROWSE(954) in module: Source\Sel_Dim_Hmg.prg Called from TSBROWSE:SUPERKEYDOWN(0) Called from TSBROWSE:KEYDOWN(0) Called from TSBROWSE:HANDLEEVENT(0) Called from EVENTS(0) Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from DOMETHOD(0) Called from FORM_SEL_DIM(708) in module: Source\Sel_Dim_Hmg.prg Called from SEL_DIM(568) in module: Source\Sel_Dim_Hmg.prg По коду у меня так: STATIC FUNCTION RefreshBrowse() .... cSeek := Alltrim( Form_Dim.Text_1.Value ) // строка 1090 .... oBrw_5:Reset() oBrw_5:Setfocus() DO EVENTS RETURN Nil А вызов из CASE nKey > 31 .AND. nKey < 254 Search_value := сSearch_value + KeyToChar(nKey) Form_Dim.Text_1.Value := сSearch_value RefreshBrowse() // строка 1025 Как так может быть до строки 1025 объект есть - Form_Dim.Text_1.Value := сSearch_value а когда вызвал функцию, то объекта Alltrim( Form_Dim.Text_1.Value ) уже нет ? У юзера прога слетела через 6 часов, до этого уверен, что в это место юзер лазил сотню раз. Там поиск по адресу - выбор из справочника улиц. Как такое может быть и как исправить ?
| |
|
|
| постоянный участник
|
Пост N: 3880
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.09.21 03:47. Заголовок: Andrey пишет Как так..
Andrey пишет цитата: | Как так может быть до строки 1025 объект есть - Form_Dim.Text_1.Value := сSearch_value а когда вызвал функцию, то объекта Alltrim( Form_Dim.Text_1.Value ) уже нет ? |
| Уже объяснял про PUBLIC, PRIVATE, повторю // создание контрола mVar := '_' + ParentForm + '_' + ControlName ... k := _GetControlFree() Public &mVar. := k // !!! тут создает ... ... *-----------------------------------------------------------------------------* STATIC PROCEDURE VerifyControlDefined ( cParentName , cControlName ) *-----------------------------------------------------------------------------* // !!! тут проверяет IF ! Empty ( cControlName ) .AND. ! _IsControlDefined ( cControlName , cParentName ) // !!! ^^^^^^^^^^^^^^^^^ MsgMiniGuiError ( "Control: " + cControlName + " Of " + cParentName + " Not defined." ) ENDIF RETURN ... *-----------------------------------------------------------------------------* FUNCTION _IsControlDefined ( ControlName, FormName ) *-----------------------------------------------------------------------------* LOCAL mVar LOCAL i mVar := '_' + NoQuote ( FormName ) + '_' + NoQuote ( ControlName ) i := __mvGetDef ( mVar , 0 ) // !!! тут не находит, хотя было IF i == 0 RETURN .F. ENDIF RETURN ( .NOT. _HMG_aControlDeleted [ i ] ) Т.е. потерялся адрес Public переменной. цитата: | Как такое может быть и как исправить ? |
| Судя по названиям DIM... у тебя массивы, по Br_5:Reset() они пересоздаются, т.е. память выделяется и возможно, у тебя сразу 2а массива могут занимать место в памяти. Может перед созданием др. массива, пробежаться по старому и сделать NIL или самому массиву NIL. Потом запускать сборщик мусора (может быть почаще это делать, определив места). Может переключиться на dbf работу. Обвесь получение данных с контрола begin sequnce с ожиданием и повторным чтением при не удаче Можно сделать для 5 таблиц отдельный запуск (exe 1, а main входов 5), т.е. независимо работают с таблицами в разных разделах
| |
|
|
| постоянный участник
|
Пост N: 7059
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.09.21 08:16. Заголовок: SergKis пишет: Уже ..
SergKis пишет: цитата: | Уже объяснял про PUBLIC, PRIVATE, повторю |
| Там переменная сSearch_value - STATIC PUBLIC - oBrw_5, ну и сам Form_Dim .Text_1.Value Понял теперь. Я что-то считал что если объект положил на форму, то всё ОТЛИЧНО ! Т.е. существует всегда. Всегда забываю что это просто PUBLIC переменная. Наверное тогда эту переменную сSearch_value нужно отвязать от Form_Dim.Text_1.Value Так как она STATIC, то просто тупо к ней обращаться без перекладывания на форму. Спасибо ! Т.е. юзер открыл справочник улиц, пошёл покурил или чай попил (или в мозиле почту проверил, в игрушку поиграл), потом пришёл и решил выбрать наконец то улицу... Вот и вылет ... Да уж ...
| |
|
|
| постоянный участник
|
Пост N: 7064
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.09.21 08:14. Заголовок: В чем разница исполь..
В чем разница использования переменных. Допустим я создам вместо всех PUBLIC переменных в программе такой контейнер: WITH OBJECT ( App.Cargo := oKeyData() ) :cFileIni := ChangeFileExt( App.ExeName, '.ini' ) // настройки в программе :cFileLng := ChangeFileExt( App.ExeName, '.lng' ) // смена языка в программе :nLang := 1 // текущий язык в программе // .... и так далее END WITH // обращение в программе: LOCAL cFile := (App.Cargo):cFileIni LOCAL nLang := (App.Cargo):nLang Или сделаю контейнер через PUBLIC переменную: PUBLIC oPubApp // назвал покороче, удобнее писать oPubApp := oKeyData() oPubApp:cCurDir := GetStartUpFolder() + "\" oPubApp:cDbfDir := oPubApp:cCurDir + "DBASE" + "\" oPubApp:cLogFile := oPubApp:cCurDir + "_Msg.log" oPubApp:aBColor := SILVER oPubApp:cFileIni := ChangeFileExt( App.ExeName, '.ini' ) oPubApp:cFileLng := ChangeFileExt( App.ExeName, '.lng' ) oPubApp:nLang := 1 Что лучше использовать или что будет надёжней в программе ? С учётом того, что адреса PUBLIC переменных теряются... А если будет программа небольшая, можно ли остановиться на oPubApp := oKeyData() ?
| |
|
|
| постоянный участник
|
Пост N: 3888
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.09.21 08:32. Заголовок: Andrey пишет С учёто..
Andrey пишет цитата: | С учётом того, что адреса PUBLIC переменных теряются... |
| Думаю, ты не понял про потерю. Могут теряться, если делать PUBLIC oBrw ... ON ACTION {|| ..., oBrw:SetFocus() } цитата: | Или сделаю контейнер через PUBLIC переменную: |
| По мне лучше делать LOCAL oPubl ... App.Cargo := oHmgData() App.Cargo:oPubl := oHmgData() oPubl := App:Cargo:oPubl oPubl:cCurDir := GetStartUpFolder() + "\" oPubl:cDbfDir := oPubl:cCurDir + "DBASE" + "\" oPubl:cLogFile := oPubl:cCurDir + "_Msg.log" oPubl:aBColor := SILVER oPubl:cFileIni := ChangeFileExt( App.ExeName, '.ini' ) oPubl:cFileLng := ChangeFileExt( App.ExeName, '.lng' ) oPubl:nLang := 1 в блоке кода будет ... := {|ow| Local oPubl := App.Cargo:oPubl ... Return Nil }
| |
|
|
| |
Пост N: 1771
Зарегистрирован: 20.02.11
|
|
Отправлено: 18.09.21 09:19. Заголовок: SergKis пишет: в бл..
SergKis пишет: Сергей, а как такой вариант? PUBLIC oBrw в блоке ... { | ow | local oBr := oBrw ... return nil }
| |
|
|
| постоянный участник
|
Пост N: 3889
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.09.21 09:25. Заголовок: Игорь Имеет шанс сва..
Игорь Имеет шанс свалится. Не свалится, скорее такой вариант {|ow| myFunc(ow) } FUNCT myFunc(oWnd) LOCAL oBr := oBrw ... но возникает, условно, лишняя ф-я, т.к. в блоке, после манипуляций с Enabled контролов, как правило вызов ф-ии общего назначения. И после нее снова какие то манипуляций с Enabled контролов PS Свалится может и такой вариант FUNCT myFunc(oWnd) LOCAL oBr := oBrw ... тут вызываем, что то, что жрет память, не делаем сами сборку мусора (т.е. может сама сработать) ... и делаем oBr:SetFocus() Если делали сборку мусора сами, то лучше сделать повторно oBr := oBrw
| |
|
|
| |
Пост N: 1772
Зарегистрирован: 20.02.11
|
|
Отправлено: 18.09.21 09:47. Заголовок: SergKis пишет: Свал..
SergKis пишет: цитата: | Свалится может и такой вариант FUNCT myFunc(oWnd) LOCAL oBr := oBrw |
| Сколько же переделывать
| |
|
|
| постоянный участник
|
Пост N: 3890
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.09.21 09:57. Заголовок: Haz пишет Сколько же..
Haz пишет Не спеши сразу переделывать. Сделай для начала сборку мусора перед функцией, т.е. {|ow| DoEvents(), hb_gcAll(), DoEvents(), myFunc(ow) } возможно памяти будет хватать
| |
|
|
| постоянный участник
|
Пост N: 7065
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.09.21 16:42. Заголовок: SergKis пишет: По ..
SergKis пишет: цитата: | По мне лучше делать LOCAL oPubl ... App.Cargo := oHmgData() App.Cargo:oPubl := oHmgData() oPubl := App:Cargo:oPubl oPubl:cCurDir := GetStartUpFolder() + "\" oPubl:cDbfDir := oPubl:cCurDir + "DBASE" + "\" oPubl:cLogFile := oPubl:cCurDir + "_Msg.log" |
| Не совсем понял. В главном модуле определяю App.Cargo := oHmgData() Далее присваиваю нужные мне переменные App.Cargo:cFileIni := ChangeFileExt( App.ExeName, '.ini' ) App.Cargo:cFileLng := ChangeFileExt( App.ExeName, '.lng' ) App.Cargo:nLang := 1 // .... и так далее А уже в нужных функциях обращаюсь к этим переменным так: LOCAL oApp // LOCAL oPubl - не пойдет, буду путаться с уже объявленными cPubPathDbf, cPubPathTemp и т.д. LOCAL cFileIni, cFileLng, nLang ..... oApp := App.Cargo cFileIni := oApp:cFileIni // или App.Cargo:cFileIni cFileLng := oApp:cFileLng // или App.Cargo:cFileLng nLang := oApp:nLang // или App.Cargo:nLang или так LOCAL cFileIni, cFileLng, nLang WITH OBJECT App.Cargo cFileIni := :cFileIni cFileLng := :cFileLng nLang := :nLang // .... и так далее END WITH Вот так правильно будет ? И в чем разница между oKeyData() и oHmgData() ?
| |
|
|
| постоянный участник
|
Пост N: 3892
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.09.21 17:26. Заголовок: Andrey пишет И в чем..
Andrey пишет цитата: | И в чем разница между oKeyData() и oHmgData() ? |
| В oHmgData() ничего лишнего для работы с контейнером, как с переменными PUBLIC, в oKeyDat() есть методы, редко используемые :Do(...) :Json(...) :Sum(...) ... В oHmgData() строковые переменные сразу переводит в upper, в oKeyData() нет. цитата: | А уже в нужных функциях обращаюсь к этим переменным так: LOCAL oApp // LOCAL oPubl - не пойдет, буду путаться с уже объявленными cPubPathDbf, cPubPathTemp и т.д. LOCAL cFileIni, cFileLng, nLang ..... 1. oApp := App.Cargo cFileIni := oApp:cFileIni // или App.Cargo:cFileIni cFileLng := oApp:cFileLng // или App.Cargo:cFileLng nLang := oApp:nLang // или App.Cargo:nLang или так LOCAL cFileIni, cFileLng, nLang 2. WITH OBJECT App.Cargo cFileIni := :cFileIni cFileLng := :cFileLng nLang := :nLang // .... и так далее END WITH |
| В 1. и 2. правильно - это как одна секция из ini, т.е. один уровень, а если тебе надо организовать данные по группам (секциям), тогда делаем Local o ... App.Cargo := oHmgData() oApp := App.Cargo oApp:oMain := oHmgData() // группа\секция Main oApp:oText := oHmgData() // группа\секция Text можно писать oApp:oMain:Host := "127.0.0.1" oApp:oMain:Port := 2814 oApp:oMain:Lang := "RU" ... но можно писать короче, беря адрес объекта в переменную o := oApp:oMain // взяли для работы группу Main или o := App.Cargo:oMain o:Host := "127.0.0.1" o:Port := 2814 o:Lang := "EN" ... так же можем поступать и группой Text o := oApp:oText // взяли для работы группу Text или o := App.Cargo:oText o:NewCopy := "New as ..." o:New := "New" o:Del := "Delete" o:Edit := "Edit" ...
| |
|
|
| постоянный участник
|
Пост N: 1715
Зарегистрирован: 09.10.06
|
|
Отправлено: 18.09.21 18:04. Заголовок: SergKis пишет: В oH..
SergKis пишет: цитата: | В oHmgData() ничего лишнего для работы с контейнером, как с переменными PUBLIC, в oKeyDat() есть методы, редко используемые |
| oHmgData() это псевдофункция класса THmgData, возвращающая объект класса. oKeyDat() - функция, возвращающая экземпляр объекта TKeyData или TWmEData, в зависимости от принятых аргументов. Класс THmgData доступен всегда, доступность других классов зависит от состояния константы _OBJECT_ в момент компиляции библиотеки.
| |
|
|
| постоянный участник
|
Пост N: 3893
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.09.21 18:16. Заголовок: Петр пишет oHmgData(..
Петр пишет цитата: | oHmgData() это псевдофункция класса THmgData, возвращающая объект класса. |
| Андрею это мало, что говорит. Всегда у него SET OOP ON и ему нужна "рыба"
| |
|
|
| постоянный участник
|
Пост N: 3894
Зарегистрирован: 17.02.12
|
|
Отправлено: 19.09.21 07:57. Заголовок: Haz пишет Сколько же..
Haz пишет Может такая переделка быть (поменьше править кода) и берем из _HMG_aControlIds[ k ] {|ow| myFunc(ow) } FUNCT myFunc(oWnd) LOCAL oBr := This.oBrw.Object // oBrw ... SET WINDOW THIS TO oWnd:Name oBr := This.oBrw.Object SET WINDOW THIS TO
| |
|
|
| |
Пост N: 1773
Зарегистрирован: 20.02.11
|
|
Отправлено: 19.09.21 08:46. Заголовок: SergKis пишет: Може..
SergKis пишет: цитата: | Может такая переделка быть |
| У меня оч редко после исполнения блока терялся алиас и выдавал alias not found и пропадала переменная public . Возможно это и есть сборщик. Проблема решилась частыми вызовами doEvents()
| |
|
|
| постоянный участник
|
Пост N: 7068
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.09.21 09:00. Заголовок: Вроде не в тему, а м..
Вроде не в тему, а может и в эту тему - аварийное завершение программы ! Я в программу у себя поставил текстовый файл ловушку ошибки. Т.е. при старте программы создаётся файл ErrDATA+TIME.log если нет ошибки, то при выходе удаляю этот файл. Смотрю у юзеров куча таких файлов, но внутри нет ошибок. Наверное ВЫХОД из программы делают аварийно, т.е. тупо закрывают сессию терминального сервера. Блин, а можно как то узнать у себя в программе, что юзер тупо закрыл сессию или перегрузил комп ? Т.е. программа завершается аварийно. Что-то на форуме вроде писали об этом, но я не помню.
| |
|
|
| постоянный участник
|
Пост N: 3898
Зарегистрирован: 17.02.12
|
|
Отправлено: 19.09.21 13:33. Заголовок: Andrey пишет Блин, а..
Andrey пишет цитата: | Блин, а можно как то узнать у себя в программе, что юзер тупо закрыл сессию или перегрузил комп ? |
| обрабатывай сообщения (как ты делал WM_COPYDATA) WM_ENDSESSION WM_QUERYENDSESSION
| |
|
|
| постоянный участник
|
Пост N: 7084
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.10.21 23:13. Заголовок: SergKis пишет: обра..
SergKis пишет: цитата: | обрабатывай сообщения (как ты делал WM_COPYDATA) WM_ENDSESSION WM_QUERYENDSESSION |
| Спасибо ! Займусь этим чуть позже....
| |
|
|
| постоянный участник
|
Пост N: 7126
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.11.21 16:12. Заголовок: SergKis пишет: обра..
SergKis пишет: цитата: | обрабатывай сообщения (как ты делал WM_COPYDATA) WM_ENDSESSION WM_QUERYENDSESSION |
| А ещё какие нужно сообщения обрабатывать в своей программе ? Снятие из Диспетчера задачи - это какое сообщение будет ? Кто что использует ? Поделитесь опытом.
| |
|
|
| постоянный участник
|
Пост N: 7127
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.11.21 17:24. Заголовок: Сделал тест что прои..
Сделал тест что происходит с программой. Запуск, снятие, закрытие сессии и т.д. Пишет в лог всегда, потом можно смотреть что было с программой и с юзером "бодаться" ! Вроде работает. Что ещё не учёл, посмотрите ? Скрытый текст
/* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2021 Sergej Kiselev <bilance@bilance.lv> * Copyright 2021 Verchenko Andrey <verchenkoag@gmail.com> Dmitrov, Moscow region * * Закрытие программы. Запись в лог-файл * Closing the program. Writing to a log file */ ANNOUNCE RDDSYS #define _HMG_OUTLOG #define SHOW_TITLE "Closing the program. Writing to a log file" #include "hmg.ch" //#include "i_winuser.ch" #define WM_COPYDATA 74 #define WM_DESTROY 2 // 0x0002 #define WM_CLOSE 16 // 0x0010 #define WM_QUERYENDSESSION 17 // 0x0011 #define WM_QUIT 18 // 0x0012 #define WM_SYSCOLORCHANGE 21 // 0x0015 #define WM_ENDSESSION 22 // 0x0016 #define WM_SYSTEMERROR 23 // 0x0017 PROCEDURE MAIN() LOCAL nY, nX, nW, nH, cMsg, cFileLog SET CODEPAGE TO RUSSIAN SET LANGUAGE TO RUSSIAN SET MSGALERT BACKCOLOR TO { 178, 227, 137 } // for HMG_Alert() DEFINE FONT DlgFont FONTNAME "DejaVu Sans Mono" SIZE 14 // for HMG_Alert() SET FONT TO "DejaVu Sans Mono", 12 SET OOP ON // Проверка на запуск второй копии программы cMsg := "Попытка запуска второй копии программы !;" cMsg += App.ExeName + ";Отказано в запуске.;" cMsg += _HMG_MESSAGE[4] + ";;" cMsg := AtRepl( ";", cMsg, CRLF ) _HMG_MESSAGE[4] := cMsg SET MULTIPLE OFF WARNING cFileLog := ChangeFileExt( ExeName(), '.log' ) //fErase( cFileLog ) SET LOGFILE TO &cFileLog ? HB_TSTOSTR( HB_DATETIME() ) , "Launching the program", ProcNL() nY := nX := 0; nW := System.ClientWidth ; nH := 100 // назначить обработчик событий программы в функции App_OnEvents() // assign a program event handler to the App_OnEvents() function SET EVENTS FUNC TO App_OnEvents DEFINE WINDOW Form_Test ; AT nY, nX WIDTH nW HEIGHT nH ; TITLE MiniGuiVersion() ; ICON "1MAIN_ICO" ; MAIN NOMAXIMIZE NOSIZE ; BACKCOLOR { 178, 227, 137 } ; ON INIT {|| This.Label_1.Setfocus } ; ON RELEASE {|| myExitPrg() } ; ON INTERACTIVECLOSE {|| myExitPrg("[x]") } nW := This.ClientWidth nH := This.ClientHeight @ 0, 0 LABEL Label_1 VALUE SHOW_TITLE WIDTH nW HEIGHT nH SIZE 32 TRANSPARENT CENTERALIGN VCENTERALIGN @ 5, 20 BUTTONEX Btn_Exit WIDTH 90 HEIGHT nH-10 ; CAPTION "Exit" NOXPSTYLE HANDCURSOR NOTABSTOP ; FONT "Comic Sans MS" SIZE 16 BOLD BACKCOLOR CLR_HRED ; ACTION {|| This.Enabled := .F., ThisWindow.Release } END WINDOW ACTIVATE WINDOW Form_Test ON INIT {|| This.Minimize, wApi_Sleep(50), ; This.Restore , DoEvents() } RETURN ////////////////////////////////////////////////////////////////// STATIC FUNCTION myExitPrg(cVal) LOCAL nI, cFileLog := _SetGetLogFile() DEFAULT cVal := "" //IF ! ThisWindow.Closable For nI := 20 to 1 Step -1 This.Label_1.Value := "Closing a program through " + HB_NtoS(nI) DO EVENTS wApi_Sleep(200) Next //ENDIF ? HB_TSTOSTR( HB_DATETIME() ) , "Closing the program", ProcNL() ; ? "." DbCloseAll() //wApi_Sleep(1200) //ShellExecute(0,"Open",cFileLog,,,SW_SHOWNORMAL) RETURN .T. /////////////////////////////////////////////////////////////////// FUNCTION ProcNL(nVal) DEFAULT nVal := 0 RETURN "Call from: " + ProcName( nVal + 1 ) + "(" + hb_ntos( ProcLine( nVal + 1 ) ) + ") --> " + ProcFile( nVal + 1 ) /////////////////////////////////////////////////////////////////// // Обработчик событий программы // этот обработчик вызывается всегда вместо Events(...) FUNCTION App_OnEvents( hHwnd, nMsg, wParam, lParam ) LOCAL cData, nDataID IF nMsg == WM_COPYDATA cData := "" nDataID := 555 //cData := GetMessageData( lParam, @nDataID ) DO EVENTS // это ключ\ID для проверки правильности полученных данных //IF nDataID == APP_ID // общее событие для вызова из других программ с формы Form_Test //_wPost(111, "Form_Test ", cData) ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_COPYDATA", ProcNL() ; ? "." RETURN 1 // выполненно nMsg == WM_COPYDATA, обрабатывать nMsg больше не надо ELSEIF nMsg == WM_ENDSESSION // 22 ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_ENDSESSION", ProcNL() ; ? "." RETURN 1 // выполненно, обрабатывать nMsg больше не надо ELSEIF nMsg == WM_QUERYENDSESSION // 17 ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_QUERYENDSESSION", ProcNL() ; ? "." RETURN 1 // выполненно, обрабатывать nMsg больше не надо ELSEIF nMsg == WM_CLOSE // 16 ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_CLOSE", ProcNL() ; ? "." RETURN 1 // выполненно, обрабатывать nMsg больше не надо ELSEIF nMsg == WM_QUIT // 18 ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_QUIT", ProcNL() ; ? "." RETURN 1 // выполненно, обрабатывать nMsg больше не надо ELSEIF nMsg == WM_SYSTEMERROR // 23 ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_SYSTEMERROR", ProcNL() ; ? "." RETURN 1 // выполненно, обрабатывать nMsg больше не надо ELSEIF nMsg == WM_DESTROY // 2 ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_DESTROY", ProcNL() ; ? "." RETURN 1 // выполненно, обрабатывать nMsg больше не надо ENDIF RETURN Events( hHwnd, nMsg, wParam, lParam)
| А когда прога упадёт по ошибке системной что будет срабатывать ? ELSEIF nMsg == WM_SYSTEMERROR - это будет писаться в лог ?
| |
|
|
| moderator
|
Пост N: 1946
Зарегистрирован: 11.02.10
|
|
Отправлено: 16.11.21 23:16. Заголовок: Andrey пишет: Что е..
Andrey пишет: Возможно, обработчик событий должен выглядеть так: FUNCTION App_OnEvents( hHwnd, nMsg, wParam, lParam ) LOCAL cData, nDataID IF nMsg == WM_COPYDATA cData := "" nDataID := 555 //cData := GetMessageData( lParam, @nDataID ) DO EVENTS // это ключ\ID для проверки правильности полученных данных //IF nDataID == APP_ID // общее событие для вызова из других программ с формы Form_Test //_wPost(111, "Form_Test ", cData) ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_COPYDATA", ProcNL() ; ? "." RETURN 1 ELSEIF nMsg == WM_ENDSESSION ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_ENDSESSION", ProcNL() ; ? "." RETURN 1 ELSEIF nMsg == WM_QUERYENDSESSION ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_QUERYENDSESSION", ProcNL() ; ? "." ELSEIF nMsg == WM_CLOSE ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_CLOSE", ProcNL() ; ? "." ELSEIF nMsg == WM_QUIT ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_QUIT", ProcNL() ; ? "." RETURN 0 ELSEIF nMsg == WM_SYSTEMERROR ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_SYSTEMERROR", ProcNL() ; ? "." RETURN 1 ELSEIF nMsg == WM_DESTROY ? HB_TSTOSTR( HB_DATETIME() ) , "Event arrived - WM_DESTROY", ProcNL() ; ? "." ENDIF RETURN Events( hHwnd, nMsg, wParam, lParam) и функция выхода из программы изменена для обработки события ON INTERACTIVECLOSE следующим образом: STATIC FUNCTION myExitPrg(cVal) LOCAL nI, cFileLog := _SetGetLogFile() DEFAULT cVal := "" IF Form_Test.Btn_Exit.Enabled Form_Test.Btn_Exit.Enabled := .F. ENDIF IF Empty( cVal ) For nI := 20 to 1 Step -1 This.Label_1.Value := "Closing a program through " + HB_NtoS(nI) DO EVENTS wApi_Sleep(200) Next ? HB_TSTOSTR( HB_DATETIME() ) , "Closing the program", ProcNL() ; ? "." DbCloseAll() ENDIF //wApi_Sleep(1200) //ShellExecute(0,"Open",cFileLog,,,SW_SHOWNORMAL) RETURN .T.
| |
|
|
| постоянный участник
|
Пост N: 7128
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.11.21 23:33. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Возможно, обработчик событий должен выглядеть так: |
| Да в том то и дело, что я не знаю как правильно. Только вчера сделал и тестировал. Нужные выходы юзеров - прога протоколирует в лог. То что и нужно мне было. А нигде больше такой лог и не видел ни у кого.... Размещайте у себя в библиотеке, может кому понадобиться сейчас или потом.
| |
|
|
| постоянный участник
|
Пост N: 376
Зарегистрирован: 29.05.10
|
|
Отправлено: 17.11.21 12:31. Заголовок: Andrey пишет: А ниг..
Andrey пишет: цитата: | А нигде больше такой лог и не видел ни у кого.... |
| Application =========== Path and name: E:\FWH\samples\testxbr3.exe (32 bits) Size: 4,393,984 bytes Compiler version: xHarbour 1.2.3 Intl. (SimpLex) (Build 20201212) FiveWin version: FWH 20.12 C compiler version: Borland/Embarcadero C++ 7.3 (32-bit) Windows version: 6.2, Build 9200 Time from start: 0 hours 0 mins 3 secs Error occurred at: 17-11-2021, 11:59:46 Error description: Error DBCMD/2001 Workarea not in use: DBSKIP Stack Calls =========== Called from: => DBSKIP( 0 ) Called from: testxbr3.prg => ADOBRWALLCOLSWIN( 402 ) Called from: testxbr3.prg => (b)MAINMENU( 109 ) Called from: .\source\classes\MENU.PRG => TMENU:COMMAND( 1560 ) Called from: .\source\classes\WINDOW.PRG => TWINDOW:COMMAND( 1141 ) Called from: .\source\classes\MDIFRAME.PRG => TMDIFRAME:COMMAND( 272 ) Called from: => TMDIFRAME:HANDLEEVENT( 0 ) Called from: .\source\classes\WINDOW.PRG => _FWH( 3559 ) Called from: => WINRUN( 0 ) Called from: .\source\classes\WINDOW.PRG => TMDIFRAME:ACTIVATE( 1097 ) Called from: testxbr3.prg => MAIN( 55 ) System ====== CPU type: Intel(R) Core(TM) i7-10870H CPU @ 2.20GHz 2208 Mhz Hardware memory: 16173 megs Free System resources: 90 % GDI resources: 90 % User resources: 90 % Windows total applications running: 3 1 , 2 GDI+ Window (testxbr3.exe), C:\WINDOWS\WinSxS\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.22000.318_none_1634a27527742bf 3 HardwareMonitorWindow, E:\FWH\samples\testxbr3.exe Variables in use ================ Procedure Type Value ========================== DBSKIP Param 1: N 11 Local 1: U Local 2: B {|| ... } ADOBRWALLCOLSWIN Local 1: O Class: TMDICHILD Local 2: O Class: TXBROWSE Local 3: U Local 4: O Class: TOLEAUTO Local 5: O Class: TOLEAUTO Local 6: O Class: TBRUSH (b)MAINMENU Param 1: O Class: TMENUITEM TMENU:COMMAND Param 1: N 20006 Local 1: O Class: TMENU Local 2: O Class: TMENUITEM TWINDOW:COMMAND Param 1: N 20006 Param 2: N 0 Local 1: O Class: TMDIFRAME Local 2: N 0 Local 3: N 20006 Local 4: N 0 Local 5: U TMDIFRAME:COMMAND Param 1: N 20006 Param 2: N 0 Local 1: O Class: TMDIFRAME Local 2: L .F. TMDIFRAME:HANDLEEVENT Param 1: N 273 Param 2: N 20006 Param 3: N 0 _FWH Param 1: N 0 Param 2: N 273 Param 3: N 20006 Param 4: N 0 Param 5: N 1 Local 1: O Class: TMDIFRAME WINRUN Param 1: N 1049798 TMDIFRAME:ACTIVATE Param 1: C "NORMAL" Param 2: U Param 3: U Param 4: U Param 5: U Param 6: U Param 7: U Param 8: U Param 9: U Param 10: U Param 11: U Param 12: U Param 13: U Param 14: U Param 15: U Param 16: U Param 17: U Param 18: U Param 19: U Param 20: L .F. Local 1: O Class: TMDIFRAME Local 2: U Local 3: U MAIN Local 1: O Class: TMDIFRAME Local 2: O Class: TFONT Local 3: O Class: TBRUSH Linked RDDs =========== DBF DBFFPT DBFBLOB DBFCDX DBFNTX DataBases in use ================ 1: SM RddName: DBFCDX ============================== RecNo RecCount BOF EOF 1 500 .F. .F. Indexes in use TagName ID ID UPPER(FIRST) FIRST UPPER(LAST) LAST UPPER(STREET) STREET UPPER(CITY) CITY UPPER(STATE) STATE UPPER(ZIP) ZIP HIREDATE HIREDATE MARRIED MARRIED AGE AGE SALARY SALARY UPPER(NOTES) NOTES Relations in use Classes in use: =============== 1 ERROR 2 HASHENTRY 3 HBCLASS 4 HBOBJECT 5 TWINDOW 6 TCONTROL 7 TGET 8 TBRUSH 9 TFONT 10 TMDIFRAME 11 TMENU 12 TREG32 13 TMENUITEM 14 TMDICLIENT 15 TMSGBAR 16 TRECT 17 TOLEAUTO 18 TMDICHILD 19 TXBROWSE 20 TXBRWCOLUMN 21 TSCROLLBAR 22 TBTNBMP 23 TCLIPBOARD 24 TSTRUCT Memory Analysis =============== 604 Static variables Dynamic memory consume: Actual Value: 0 bytes Highest Value: 0 bytes
| |
|
|
| постоянный участник
|
Пост N: 7129
Зарегистрирован: 12.09.06
|
|
Отправлено: 17.11.21 12:55. Заголовок: Большой в смысле, чт..
Большой в смысле, что ни у кого не видел причину выхода из программы ! Вот так, как сейчас сделано: 2021-11-15 22:40:20.454 Launching the program Call from: MAIN(52) --> demo.prg 2021-11-15 22:40:34.640 Closing the program Call from: MYEXITPRG(101) --> demo.prg . 2021-11-16 17:15:48.704 Launching the program Call from: MAIN(52) --> demo.prg 2021-11-16 17:16:13.468 Event arrived - WM_QUERYENDSESSION Call from: APP_ONEVENTS(142) --> demo.prg . 2021-11-16 17:16:13.730 Event arrived - WM_ENDSESSION Call from: APP_ONEVENTS(138) --> demo.prg . 2021-11-16 17:32:33.815 Launching the program Call from: MAIN(48) --> demo.prg 2021-11-16 17:32:41.487 Closing the program Call from: MYEXITPRG(96) --> demo.prg . 2021-11-17 12:49:00.523 Launching the program Call from: MAIN(48) --> demo.prg 2021-11-17 12:49:11.420 Event arrived - WM_CLOSE Call from: APP_ONEVENTS(141) --> demo.prg WM_CLOSE - это программа снята через Диспетчер задач WM_ENDSESSION - программа закрыта через перезагрузку компа. Т.е. все эти события, кроме "Closing the program" - не нормальное завершение программы.
| |
|
|
| постоянный участник
|
Пост N: 7252
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.06.22 16:59. Заголовок: Опять вылет в большо..
Опять вылет в большой проге у меня. В Win10 работает нормально, а под WinServer 2012 - вылет. @ BUTTONEX Button_S1 ... ; ...... ACTION {|cw,cn| cw := ThisWindow.Name, cn := This.Name ,; SetProperty(cw,cn, "Enabled", .F.) ,; ButtonSpavki(cn,aDim,1,cw) ,; iif( _IsWindowActive(cw), Setproperty(cw,cn, "Enabled", .T.), Nil ) ,; Form_Seek.Label_Buff.Setfocus } // Строка 918 Ошибка вот такая: Time from start: 0 days 0 hours 1 mins 36 secs Error MGERROR/0 Control: Label_Buff Of Form_Seek Not defined. Program terminated. --------------------------------- Stack Trace --------------------------------- Called from MSGMINIGUIERROR(0) Called from VERIFYCONTROLDEFINED(0) Called from DOMETHOD(0) Called from (b)FORMA_FILTER(918) in module: Source\Tbrw_fFind.prg Called from _DOCONTROLEVENTPROCEDURE(0) Called from EVENTS(0) Called from MYEVENTSHANDLER(1729) in module: Source\main.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from FORMA_FILTER(1167) in module: Source\Tbrw_fFind.prg Called from MYFINDEDIT(729) in module: Source\Tbrw_fFind.prg Called from (b)CREATEBROWSEFIND(560) in module: Source\Tbrw_fFind.prg Called from TSBROWSE:KEYDOWN(0) Called from TSBROWSE:HANDLEEVENT(0) Called from EVENTS(0) Окно Form_Seek теряется совсем после вызова другого MODAL окна ...
| |
|
|
| |
Пост N: 7670
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.06.22 23:11. Заголовок: Label_Buff Of Form_S..
Label_Buff Of Form_Seek Not defined Делай проверку
| |
|
|
| постоянный участник
|
Пост N: 4138
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.06.22 11:25. Заголовок: Andrey пишет Окно Fo..
Andrey пишет цитата: | Окно Form_Seek теряется совсем после вызова другого MODAL окна ... |
| Надо исп. в модальных окнах _HMG_InplaceParentHandle := hWnd // hWnd - окна родителя ... // после action модального окна _HMG_InplaceParentHandle := 0 иначе у modal окна родитель будет main window (default и вероятно фокус убегает на него) Dima пишет Этого мало в большой программе, надо исп. события, т.к. например код DEFINE WINDOW Form_Seek ; ... ON INIT {|| myOnInitFSeek(nLineCol,cType,aDim), Form_Seek.Label_Buff.Setfocus } ... не дает завершится процедуре ACTION WINDOW Form_Seek нормальным образом (блок ON INIT это часть ACTION WINDOW ... после него еще есть код для завершения и он работает). т.е. лучше ON INIT {|| _wPost(10) } ... (This.Object):Event(10, {|| myOnInitFSeek(nLineCol,cType,aDim), Form_Seek.Label_Buff.Setfocus } ) ... для кнопки аналогично ACTION {|| _wPost(11, This.Index) } ... (This.Object):Event(11, {|cw,cn| cw := ThisWindow.Name, cn := This.Name ,; SetProperty(cw,cn, "Enabled", .F.) ,; ButtonSpavki(cn,aDim,1,cw) ,; iif( _IsWindowActive(cw), Setproperty(cw,cn, "Enabled", .T.), Nil ) ,; Form_Seek.Label_Buff.Setfocus } ) ...
| |
|
|
| постоянный участник
|
Пост N: 7254
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.06.22 17:37. Заголовок: Поставил событие - _..
Поставил событие - _wPost(11, This.Index) В Win10 нормально, а в WinServer 2012 - опять вылет.
| |
|
|
| постоянный участник
|
Пост N: 7256
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.06.22 22:37. Заголовок: Вот так нужно делать..
Вот так нужно делать в больших системах. (This.Object):Event(11, {|| Local cw := ThisWindow.Name Local cn := This.Name ButtonSpavki(cn,aDim,1,cw) ? " === ButtonSpavki(..)=", ProcNL() ? " === !", cw, _IsWindowActive(cw), _IsWindowDefined(cw), cn, _IsControlDefined(cn, cw) SET WINDOW THIS TO cw ? " ThisWindow =", cw, ThisWindow.Name ? " This =", cn, This.Name This.&(cn).Enabled := .T. //IF _IsWindowActive(cw) .and. _IsControlDefined(cn, cw) // ? " Enabled := .T." // Setproperty(cw,cn, "Enabled", .T.) //ENDIF ? " End=", ProcNL() ; ? " ..." This.Label_Buff.SetFocus() // DoMethod(cw, cn, "SetFocus") SET WINDOW THIS TO Return Nil } ) END WINDOW Спасибо БОЛЬШОЕ Сергей !!!
| |
|
|
| постоянный участник
|
Пост N: 7257
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.07.22 18:36. Заголовок: Опять проблема в про..
Опять проблема в проге МиниГуи и Windows Server 2008 R2 6.1 SP1 - опять вылет, на том же самом сервере. Причем интересно, одна и таже прога эксплуатируется на нескольких WinServer 2008 и 2012. На 2012 проблемы нет, а на 2008 проблема есть. Причем используется процессоры Xeon. На одном сервере эта проблема и есть (хотя сервер фирменный PROLIANT), на другом такой же проц, только попроще - проблема тоже есть, подвисание, а потом вылет. Прога на МиниГуи, большая (26Мб ехе-ник) открывает 3 окона MODAL, в последнем окне справочник улиц. Если выбирать улицу стрелками, то прога не вешается, а если начинаем поиск по буквам, то первый выбор не вешается, а второй вешается прога. Окно нормально закрывается, НО возврат на второе окно MODAL не происходит, идёт вылет - пишет нет объекта на форме. Окно на экране - а прога пишет нет такого окна ! Блин фигня какая то.... Что делать - непонятно... Вот такие окна в проге: Месяц назад исправил ошибку, работало нормально - не вылетало, а сейчас опять вылетает... Можно и дальше убрать вылет окна, но это не решение ! ТЕРЯЕТСЯ ОКНО 2 после выбора из справочника в 3-окне. Как это предотвратить ?
| |
|
|
| постоянный участник
|
Пост N: 7279
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.01.23 14:00. Заголовок: Опять глюги в програ..
Опять глюги в программе у меня. Вылет из программы и 2-3 окна "Программа уже запущена" У меня нет нигде в коде такого сообщения. Наверное берётся системное сообщение из МиниГуи. Поискал и не нашёл.... Непонятно - КАКАЯ ПРОГРАММА уже запущена ? 1) Может стоит добавить строку в это окно, откуда уже запущена программа, в сам МиниГуи ? Типа такого - ProcNL() + CRLF + ProcNL(1) 2) Вот мой код: IF _IsWindowDefined("Form_Card") DoMethod("Form_Card", "SetFocus") ELSE aForm := HMG_GetForms() // все открытые окна cTekForm := ThisWindow.Name // строка 54 aFormHide := {} ? "---> Start card:", cTekForm, ProcNL() DO EVENTS ; hb_gcAll() ; DO EVENTS ; wApi_Sleep(50) // запустить "сборщик мусора" FOR nI := 1 TO Len(aForm) cForm := UPPER(aForm[nI]) ? nI, cForm, _HMG_aFormType[nI], _HMG_aFormHandles[nI], _HMG_aFormDeleted[nI] ?? "Visible=", IsWindowVisible( GetFormHandle( cForm ) ) ?? GetProperty( cForm, "Visible" ) IF cForm == UPPER(cTekForm) ; LOOP ENDIF lHide := .T. IF AT("FORM_WIN", cForm) == 0 AADD(aFormHide, cForm ) ELSE lHide := .F. ENDIF .... .... DEFINE WINDOW Form_Card ; ..... END WINDOW ACTIVATE WINDOW Form_Card DO EVENTS ; hb_gcAll() ; DO EVENTS ; wApi_Sleep(50) // запустить "сборщик мусора" FOR nI := 1 TO Len(aFormHide) cForm := aFormHide[nI] IF _IsWindowDefined(cForm) ; DoMethod(cForm, "Show") ENDIF NEXT SwitchToWin( cTekForm ) // переключить на тек.форму ENDIF // _IsWindowDefined("Form_Card") Почему вылетает здесь на 54 строке ?
| |
|
|
| постоянный участник
|
Пост N: 7309
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.02.23 17:22. Заголовок: Перешёл на новую вер..
Перешёл на новую версию - Harbour MiniGUI Extended Edition 23.02 (Update 1) До этого было - Harbour MiniGUI Extended Edition 22.12 (Update 2) Пересобрал свою большую прогу и установил только у ОДНОГО юзера... И поехало в первый же день... Прога вываливатся там где всегда работала. Фигня получается... Система WinServer 2008. Ошибки не постоянные, то вылетает то нет. Например ошибка такая: Вот код который работал: FUNCTION MG_RetryCancel( cMsg, aButton, cTitle, cIcoRes, nIcoSize, bInit, aBClr) LOCAL nK, lRet := .F. LOCAL aButColor := {COLOR_LIGHT_GREEN,COLOR_LIGHT_RED} DEFAULT cIcoRes := "Help64", nIcoSize := 64 , bInit := NIL DEFAULT aButton := {"&Продолжить","&Отмена"} , cTitle := "Внимание!" DEFAULT aBClr := {198,217,240} // светло-синий-80% SET MSGALERT FONTCOLOR TO BLACK SET MSGALERT BACKCOLOR TO aBClr _HMG_ModalDialogReturn := 2 //bInit := {|| _logfile(.t., This.Name, 'oDlg=',_IsWindowDefined('oDlg')), this.topmost := .t. ,; // this.Btn_01.Fontcolor := BLACK ,; // this.Btn_02.Fontcolor := BLACK } bInit := {|| SetProperty("oDlg", "Topmost", .t. ) ,; this.Btn_01.Fontcolor := BLACK ,; this.Btn_02.Fontcolor := BLACK } ? ProcNameLine() + "--[тест]-----------------------", ThisWindow.Name nK := HMG_Alert( cMsg, aButton, cTitle, NIL, cIcoRes, nIcoSize, aButColor , bInit ) // строка 264 IF nK == 1 lRet := .T. ENDIF _HMG_ModalDialogReturn := 1 RETURN lRet Откатился назад, ошибка ушла. Что делать ?
| |
|
|
| moderator
|
Пост N: 2107
Зарегистрирован: 11.02.10
|
|
Отправлено: 28.02.23 18:44. Заголовок: Andrey пишет: Прога..
Andrey пишет: цитата: | Прога вываливатся там где всегда работала. |
| Andrey Единственное, что приходит в голову, это - замена Харбора из поставки сборки 23.02 на Харбор из сборки 22.12 Надеюсь, это поможет решить проблему...
| |
|
|
| постоянный участник
|
Пост N: 7310
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.02.23 18:51. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Единственное, что приходит в голову, это - замена Харбора из поставки сборки 23.02 на Харбор из сборки 22.12 |
| Спасибо ! Попробую.
| |
|
|
| постоянный участник
|
Пост N: 7343
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.03.23 15:44. Заголовок: Блин, опять полная ..
Блин, опять полная У заказчика прога на МиниГуи стала очень медленно работать... Комп быстрый, у заказчика, система Win10. Таблицы строит быстро, а вот при открытие карточки (показ одной записи) - очень медленно 30-50 секунд. У меня открывается за 1-5 секунд. В чем может быть проблема ?
| |
|
|
| постоянный участник
|
Пост N: 7347
Зарегистрирован: 12.09.06
|
|
Отправлено: 31.03.23 15:07. Заголовок: Установил новую верс..
Установил новую версию - 23.02 (Update 4) Примеры собираются и работают, а моя большая система собирается и сразу вылетает !!! Предыдущая версия - 23.01 (Release) работает без проблем. Вылет такой: Error BASE/1004 Message not found: TWNDDATA:EVENT Args: [1] = O TWNDDATA --------------------------------- Stack Trace --------------------------------- Called from __ERRRT_SBASE(0) Called from TWNDDATA:ERROR(0) Called from (b)HBOBJECT(0) Called from TWNDDATA:MSGNOTFOUND(0) Called from TWNDDATA:EVENT(0) Called from MAIN(205) in module: Source\main.prg Код простой: DEFINE WINDOW Form_Main ; AT 0,0 WIDTH 640 HEIGHT 480 ; TITLE cTitle ICON cIcon ; MAIN NOSHOW ; NOMAXIMIZE NOSIZE NOCAPTION ; ON INIT { || DoEvents(), _wPost(0) } ; ON INTERACTIVECLOSE { || IIF( lStaticErrorClose, MyExit(), Nil ) } ? PROCNL(), "внутри DEFINE WINDOW Form_Main" ..... WITH OBJECT This.Object :Event( 0, {| | _logfile(.t.,"----[ Событие 0 ]--- " + ProcNL() ) ,; MsgInfo("Запуск события 0"), MyInitForm() } ) // строка 205 ..... END WINDOW Form_Main.Timer_1.Enabled := .F. // ОТКЛЮЧИТЬ таймер ? PROCNL(), "_DefineSplashWindow()" _DefineSplashWindow( "Form_Splash",,,,, "SPLASH", 10, {|| IIF( !lStaticErrorClose, Addition_MainForms(), Nil ) } ) ACTIVATE WINDOW Form_Splash, Form_Main Return Nil И ПЕРЕСТАЛА работать _DefineSplashWindow(...), так как прога сразу идёт на ON INIT { || DoEvents(), _wPost(0) } Как это исправить ? Вот логи запуска программы: в старой версии прога запускается и _DefineSplashWindow() отрабатывает. Вызов из: MAIN(178) --> Source\main.prg внутри DEFINE WINDOW Form_Main Вызов из: MAIN(230) --> Source\main.prg _DefineSplashWindow() Вызов из: _DEFINESPLASHWINDOW(266) --> Source\main.prg Вызов из: _SPLASHDELAY(334) --> Source\main.prg и т.д. А в новой версии (23.02-4) вот так: Вызов из: MAIN(161) --> Source\main.prg M->aRunCheck= ARRAY[23] Вызов из: MAIN(167) --> Source\main.prg .F. Вызов из: MAIN(178) --> Source\main.prg внутри DEFINE WINDOW Form_Main ====================> ОШИБКА при завершении программы ! MyExitError() <===== Error BASE/1004 Message not found: TWNDDATA:EVENT Args: [1] = O TWNDDATA Called from __ERRRT_SBASE(0) Called from TWNDDATA:ERROR(0) Called from (b)HBOBJECT(0) Called from TWNDDATA:MSGNOTFOUND(0) Called from TWNDDATA:EVENT(0) Called from MAIN(206) in module: Source\main.prg Не доходит до функции _DefineSplashWindow(), просто вылетает с ошибкой !
| |
|
|
| постоянный участник
|
Пост N: 7348
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.04.23 07:43. Заголовок: Беру в папку C:\..
Беру в папку C:\MiniGUI (с версией 23.02-4) записываю папку Harbour от версии 23.01 Проект собирается и работает. Блин и что за фигню сделали в этой версии Харбора ? 2 дня геморроя и проблема частично решена. А как быть в дальнейшем ?
| |
|
|
| moderator
|
Пост N: 2120
Зарегистрирован: 11.02.10
|
|
Отправлено: 01.04.23 13:57. Заголовок: Andrey пишет: что з..
Andrey пишет: цитата: | что за фигню сделали в этой версии Харбора ? |
| Из списка изменений Харбора следует, что были сделаны важные изменения и оптимизации в ядре виртуальной машины и была затронута функция AClone(). Также был расширен обработчик ошибок xhb_ErrorNew в библиотеке xHB и почищен модуль symbol range checking для классов Харбора. Что именно так повлияло на твою программу, остается только догадываться
| |
|
|
| постоянный участник
|
Пост N: 7349
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.04.23 15:28. Заголовок: Спасибо БОЛЬШОЕ ! Я ..
Спасибо БОЛЬШОЕ ! Я забыл уточнить, что использую BCC 5.5 ! Может из-за этого облом происходит. Не могу перейти на BCC 5.8 - иконки на менюшках не те отображаются. Уже и от ошибок всех избавился, всё равно иконки не те отображаются, которые должны быть.
| |
|
|
| постоянный участник
|
Пост N: 7368
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.04.23 13:03. Заголовок: Рано радовался. На н..
Рано радовался. На новой версии 23.04 (Release) прога при старте "вылетает"... Выдаёт такую ошибку: Error BASE/1004 Message not found: TWNDDATA:EVENT Args: [1] = O TWNDDATA Called from __ERRRT_SBASE(0) Called from TWNDDATA:ERROR(0) Called from (b)HBOBJECT(0) Called from TWNDDATA:MSGNOTFOUND(0) Called from TWNDDATA:EVENT(0) Called from MAIN(204) in module: Source\main.prg Вот код программы: SET EVENTS FUNCTION TO MyEventsHandler // проверка версии программы DEFINE WINDOW Form_Main ; MAIN NOSHOW ; .... // общее событие для вызова из других программ :Event(111, {|ow,xPar,cdata| ; cdata := hb_defaultValue(cdata, "") ,; _logfile(.t.,"----[ Событие 111 ]--- " + ProcNL() ) ,; _logfile(.t.," ow=",ow,"xPar=",xPar,"cdata=",cdata ) ,; _logfile(.t.," ow:Name",ow:Name,"ow:Handle",ow:Handle ) ,; OnWmCopyData(cData) } ) // строка 204 .... // Обработчик событий программы FUNCTION MyEventsHandler( hHwnd, nMsg, wParam, lParam ) LOCAL cData, nDataID IF nMsg == WM_COPYDATA cData := GetMessageData( lParam, @nDataID ) DO EVENTS // общее событие для вызова из других программ с формы Form_Main _wPost(111, "Form_Main", cData) RETURN 1 // выполненно nMsg == WM_COPYDATA, обрабатывать nMsg больше не надо ENDIF RETURN Events( hHwnd, nMsg, wParam, lParam) И чего в новой версии исправлено ?
| |
|
|
| постоянный участник
|
Пост N: 4271
Зарегистрирован: 17.02.12
|
|
Отправлено: 29.04.23 17:55. Заголовок: Andrey Попробуй так..
Andrey Попробуй так (возможно WM_COPYDATA пришло когда объекта окна не было) FUNCTION MyEventsHandler( hHwnd, nMsg, wParam, lParam ) LOCAL cData, nDataID, oWnd IF nMsg == WM_COPYDATA cData := GetMessageData( lParam, @nDataID ) DO EVENTS // общее событие для вызова из других программ с формы Form_Main oWnd := _WindowObj( "Form_Main" ) IF HB_ISOBJECT(oWnd) ; _wPost(111, oWnd, cData) ENDIF RETURN 1 // выполненно nMsg == WM_COPYDATA, обрабатывать nMsg больше не надо ENDIF RETURN Events( hHwnd, nMsg, wParam, lParam)
| |
|
|
| постоянный участник
|
Пост N: 7369
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.04.23 19:04. Заголовок: Не помогает... Тако..
Не помогает... Такой же вылет !!!
| |
|
|
| постоянный участник
|
Пост N: 7370
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.04.23 00:20. Заголовок: Если ставлю коммента..
Если ставлю комментарий на //SET EVENTS FUNCTION TO MyEventsHandler // проверка версии программы То опять "вылет" проги и другая ошибка: Error BASE/1001 Неизвестная функция: EVENTS Args: [1] = N 723514 [2] = N 129 [3] = N 0 [4] = N 1701896 --------------------------------- Stack Trace --------------------------------- Called from EVENTS(0) Called from INITWINDOW(0) Called from _DEFINEWINDOW(0) Called from MAIN(164) in module: Source\main.prg код вот такой: DEFINE WINDOW Form_Main ; AT 0,0 WIDTH 640 HEIGHT 480 ; TITLE cTitle ICON cIcon ; MAIN NOSHOW ; NOMAXIMIZE NOSIZE NOCAPTION ; ON INIT { || IniGetPosWindow(,,"MAIN"), MyInitForm() } ; ON INTERACTIVECLOSE { || IIF( lStaticErrorClose, MyExit(), Nil ) } // строка 164 И что ему не нравиться в этом коде ? P.S. Замена на Харбор - Version: 3.2.0dev (r2301231146) убирает эту проблему...
| |
|
|
| постоянный участник
|
Пост N: 7380
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.05.23 18:51. Заголовок: SergKis пишет: Надо..
SergKis пишет: цитата: | Надо исп. в модальных окнах _HMG_InplaceParentHandle := hWnd // hWnd - окна родителя ... // после action модального окна _HMG_InplaceParentHandle := 0 иначе у modal окна родитель будет main window (default и вероятно фокус убегает на него) |
| Как быть если вызывается подряд 3 модальных окна ? _HMG_InplaceParentHandle := 0 поставим, а другие модальные окна уже не смогут быть привязанными к родительскому окну, будут привязаны к main window Раньше этим вообще не заморачивался, а в новых версиях МиниГуи приходится самому отслеживать, модальное окно скрывается под WINDOWTYPE STANDARD окном. Можно как то привязывать все модальные окна которые вызываются из WINDOWTYPE STANDARD на это окно ?
| |
|
|
| постоянный участник
|
Пост N: 4274
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.05.23 19:03. Заголовок: Andrey пишет Раньше ..
Andrey пишет цитата: | Раньше этим вообще не заморачивался, а в новых версиях МиниГуи приходится самому отслеживать |
| Не придумывай, все окна в Гуи имеют родителя, начиная от DeskTop и до контролов (это тоже окна с родителем окном, на котором созданы) и от версии МиниГуи это не зависит. цитата: | Как быть если вызывается подряд 3 модальных окна ? |
| Всем окнам присваивай handle окна родителя.
| |
|
|
| постоянный участник
|
Пост N: 7381
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.05.23 19:33. Заголовок: SergKis пишет: Всем..
SergKis пишет: цитата: | Всем окнам присваивай handle окна родителя. |
| Т.е. после создания окна делаю: DEFINE WINDOW &cFormName At 0, 0 ; WINDOWTYPE STANDARD ; .... _HMG_InplaceParentHandle := ThisWindow.Handle ... END WINDOW .... _HMG_InplaceParentHandle := 0 И больше не о чём не забочусь ?
| |
|
|
| постоянный участник
|
Пост N: 4275
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.05.23 19:54. Заголовок: Andrey пишет И больш..
Andrey пишет цитата: | И больше не о чём не забочусь ? |
| Если так сделаешь для трех modal окон и вызывать их будешь с окна STANDARD по одному, то да. А если modal окна вызываешь друг за другом последовательно, то нет. Надо перед каждым модальным окном делать FUNCTION Standard1() ... DEFINE WINDOW &cFormName ... STANDARD ... ... BUTTON ...ACTION Modal1() ... RETURN Nil FUNCTION Modal1() ... _HMG_InplaceParentHandle := ThisWindow.Handle ... DEFINE WINDOW &cFormName MODAL ... ... BUTTON ...ACTION Modal2() ... RETURN Nil FUNCTION Modal2() ... _HMG_InplaceParentHandle := ThisWindow.Handle ... DEFINE WINDOW &cFormName MODAL ... ... BUTTON ...ACTION Modal3() ... RETURN Nil FUNCTION Modal3() ... _HMG_InplaceParentHandle := ThisWindow.Handle ... DEFINE WINDOW &cFormName MODAL ... ... BUTTON ...ACTION ... ... RETURN Nil т.к. вызовы ф-ий происходят в событиях окна или контролов, то _HMG_InplaceParentHandle := ThisWindow.Handle всегда будет handle окна на котором нажали кнопку, например, для вызова след. окна
| |
|
|
| постоянный участник
|
Пост N: 7382
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.05.23 21:56. Заголовок: Понял. Спасибо ! :s..
Понял. Спасибо !
| |
|
|
| постоянный участник
|
Пост N: 7383
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.05.23 17:04. Заголовок: Бьюсь уже какой меся..
Бьюсь уже какой месяц с сервером терминалов на Windows Server 2008 R2 Вылетает прога в одном месте постоянно через 2-3 раза по выбору из справочника. Причём прогу смог протестировать на другом точно таком же сервере. Там прога работает без вылетов. Только сейчас дошло до меня, где не работает прога у пользователя урезанный доступ, а где работает полный доступ. Как это может влиять на работу программы МиниГуи ? Но с другой стороны вообще не понятка, одна и таже функция вызывает справочник города и улиц. Города выбираются всегда, а как улицу выбрал, прога вешается, окно закрылось и висит, без ошибки. Если потом нажать любую кнопку на другой форме, то тогда вылет проги. Но почему прога висит ? Форма не закрылась ? Что ещё проге нужно ?
| |
|
|
| постоянный участник
|
Пост N: 1641
Зарегистрирован: 27.01.07
|
|
Отправлено: 27.05.23 21:59. Заголовок: Andrey пишет: Тольк..
Andrey пишет: цитата: | Только сейчас дошло до меня, где не работает прога у пользователя урезанный доступ, а где работает полный доступ. |
| Ну так дай нужные права или админа попроси.
| |
|
|
| постоянный участник
|
Пост N: 7384
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.05.23 15:27. Заголовок: PSP пишет: Ну так д..
PSP пишет: цитата: | Ну так дай нужные права или админа попроси. |
| Админ дал права, все равно виснет. Окно закрывается и прога висит.... Почему окно закрылось и управление дальше в программу не даёт ? Делаю вывод в лог вот так: DEFINE WINDOW Form_SelDim .... ON RELEASE {|| _logfile(.t., SPACE(8)+"+-o-+ :Event(99)"+ProcNL(),"ON RELEASE =", 1, "Завершена работа формы=",cFormName ) ,; _logfile(.t., SPACE(8)+"+-o-+ Form:", HMG_GetForms(), HB_ValToExp(HMG_GetForms()) ), DoEvents() } Вывод в лог файл есть, а дальше прога "ВИСИТ"... +-o-+ :Event(99)Вызов из: (b)FORM_SELDIM2(80) --> Sel_Dim_Hmg2frm.prg ON RELEASE=1 Завершена работа формы=Form_SelDim +-o-+ Form: ARRAY[6] { ...., "Form_SeekAdr", "Form_SelDim"} А окно "Form_SelDim" и не закрылось !!! P.S. Ещё заметил такую странность, если выбор осуществлять мышкой то окно НЕ ВЕШАЕТСЯ, а если через ENTER, то окно ПОВЕСИТЬСЯ.
| |
|
|
| moderator
|
Пост N: 2134
Зарегистрирован: 11.02.10
|
|
Отправлено: 29.05.23 12:21. Заголовок: Andrey пишет: окно ..
Andrey пишет: цитата: | окно "Form_SelDim" и не закрылось |
| Значит, надо пробовать закрывать его в цикле, например DO WHILE IsWindowDefined(Form_SelDim) Form_SelDim.Release ENDDO Andrey пишет: цитата: | если через ENTER, то окно ПОВЕСИТЬСЯ |
| Можно попробовать временно переназначить действие ENTER на другую клавишу, например :UserKeys(VK_RETURN, {|ob| _wPost( 2, ob:cParentWnd), .F. }) заменить на :UserKeys(VK_F10, {|ob| _wPost( 2, ob:cParentWnd), .F. }) также можно попробовать использовать функцию _wSend() вместо _wPost(). Понятно, что это только предложения для пробы
| |
|
|
| постоянный участник
|
Пост N: 4279
Зарегистрирован: 17.02.12
|
|
Отправлено: 29.05.23 13:15. Заголовок: gfilatov2002 Андрей..
gfilatov2002 Андрей присылал мне кино с зависанием. Думаю виснет на прорисовке тсб, т.к. используется установка :FilterFTS() и на короткий просмотр (строк < :nRowCount()) прорисовка тсб и подсчет :nLen успевает сработать, если строк в тсб > :nRowCount(), то на тсб клинит, т.к. кнопка вызова справочника остается Disable. Набор символов поиска происходит в :HandleEvents() -> : KeyDown() -> :bUserKeys символы набираются в Static переменную и Label отображает. Еще у него исп. :bEvents с отображением на каждом нажатии STATIC FUNCTION MyEventBrowse(oBrw, nMsg) // "RUS/LAT" LOCAL cForm := oBrw:cParentWnd, cAlias := oBrw:cAlias IF nMsg != WM_PAINT .and. _IsControlDefined( "Label_KB", cForm ) SetProperty(cForm, "Label_KB", "Value", '('+KB_LANG()+')' ) ENDIF RETURN 0 Думаю здесь из за разницы скоростей набора символов и прорисовки тсб получается подвис. Ранее :FilterFTS() делался тут же в :bUserKeys, сейчас ушло на _wPost() и Андрей написал, что стало лучше цитата: | Сейчас 6 раз выбрал мышкой, всё отлично. 5 раз выбрал через ENTER и повис. Ну хоть больше стало выбирать... |
| Предложение перевести ввод данных для фильтра в GETBOX\TEXTBOX он пока отвергает. PS. Это происходит у него только на PC с WinServer 2008
| |
|
|
| постоянный участник
|
Пост N: 7385
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.05.23 13:35. Заголовок: SergKis пишет: Пред..
SergKis пишет: цитата: | Предложение перевести ввод данных для фильтра в GETBOX\TEXTBOX он пока отвергает. |
| Я убрал совсем TEXTBOX и поставил только LABEL, чтобы проверить. Т.е. только отображение что набрали на клавиатуре, убрал одну причину СОВСЕМ для проверки. Или я что-то не понимаю с этим GETBOX\TEXTBOX, мне он не нужен пока ? После того как переделал на LABEL всё равно ВИСНЕТ прога по клавише ENTER, на 5-6-7 раз, как повезёт
| |
|
|
| постоянный участник
|
Пост N: 7437
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.06.23 12:06. Заголовок: Фигня получается... ..
Фигня получается... Вылет был из-за потери окна ! 1,5 года была плавающая ошибка, то есть, то нет. Вылетало только на одном сервере-терминалов. Сейчас с переходом на новый BCC 7.30 ошибка получилась постоянной и всегда ! Наверное более жесткий контроль установлен. В принципе это хорошо. И понятней стала причина ошибки - потеря MODAL окна, т.е. вызываем несколько MODAL окон, и при возврате окно теряется, улетает под главную форму. Вот и вся ошибка была. Причём, чем больше весит ехе-ник, тем больше вероятность возникновения такой ошибки !!! Сергей дал функцию для предотвращения таких ситуаций, выкладываю сюда, может ещё кому понадобиться. Событие на кнопку. (This.Object):Event(11,{|obtn,ky,abtn| // объект,event,параметр получаем Local ow, cw, cn, lbtn, lwnd, aRet, nRet, cRet, aForm, hWnd Local nButton := abtn[1] // nButton Local cButton := aBtn[2] // This.Name lbtn := obtn:IsControl // переменная контрол\окно .T.\.F. lwnd := obtn:IsWindow // переменная окно\контрол .T.\.F. ow := obtn:Window // если lbtn == .T. окно берем так cw := ow:Name // аналог ThisWindow.Name cn := obtn:Name // аналог This.Name //SetProperty(cw, "Topmost", .T.) ; DO EVENTS // 18.06.23 //SetProperty(cw,cn, "Enabled", .F.) // блокировка кнопки //This.&(cn).Enabled := .F. // блокировка кнопки Darken2Open(ow:Handle) // затенение на окно aRet := ButtonSpavki(aDim,nButton,cw) // вызов другого MODAL окна Darken2Close(ow:Handle) // убрать затенение с окна DO EVENTS aForm := HMG_GetForms() // все открытые окна ? " === ButtonSpavki(...)=", ProcNL(), "aRet=", HB_ValToExp(aRet) ? " === aForm=", aForm ; ?v aForm ? " === !", cw, _IsWindowActive(cw), _IsWindowDefined(cw), cn, _IsControlDefined(cn, cw) IF _IsWindowDefined(cw) SET WINDOW THIS TO cw SetProperty( cw, cn, "Caption", cRet ) ? " === ThisWindow =", cw, ThisWindow.Name ? " === This =", cn, This.Name This.&(cn).Enabled := .T. This.Label_Buff.SetFocus() SET WINDOW THIS TO ELSE ? "==== *** ERROR *** WINDOW ["+cw+"] not found ! " ENDIF IF ! To_Focus(cw) AlertStop("Window not found ! " + cw, "ERROR") ENDIF //ow:SetFocus('Label_Buff') // на форме должен быть LABEL Label_Buff ? " === End = :Event(11)" ; ? " ..." Return Nil } ) Вот сама функция: FUNCTION To_Focus( cForm, cControl ) LOCAL hForm, lRet := _IsWindowDefined(cForm) DEFAULT cControl := "Label_Buf" IF lRet hForm := GetFormHandle(cForm) IF hForm != 0 IF IsIconic( hForm ) ; _Restore( hForm ) ENDIF SetProperty(cForm, "Topmost", .T.) DoMethod(cForm, "SetFocus") IF _IsControlDefined(cControl, cForm) DoMethod(cForm, cControl, "SetFocus") ENDIF SetProperty(cForm, "Topmost", .F.) ENDIF ENDIF RETURN lRet
| |
|
|
| постоянный участник
|
Пост N: 4315
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.06.23 12:25. Заголовок: Andrey пишет В принц..
Andrey пишет цитата: | В принципе это хорошо. И понятней стала причина ошибки - потеря MODAL окна, т.е. вызываем несколько MODAL окон, и при возврате окно теряется, улетает под главную форму. |
| Не уверен, что это хорошо, т.к. получается не работает механизм назначения modal окну родителя, т.е. FUNCTION _DefineModalWindow ( FormName, Caption, x, y, w, h, Parent, nosize, nosysmenu, nocaption, aMin, aMax, ; ... IF _HMG_InplaceParentHandle <> 0 Parent := _hmg_InplaceParentHandle ELSEIF ! _HMG_BeginWindowMDIActive Parent := _hmg_MainHandle ENDIF ... Для др. окон (например STANDARD, ...) тоже приходится городить hOld := _hmg_MainHandle _hmg_MainHandle := ThisWindow.Handle // or ow:Handle ... DEFINE WINDOW ... _hmg_MainHandle := hOld ... END WINDOW получается и этот механизм, задания Parent тоже под вопросом ? Parent := _hmg_MainHandle
| |
|
|
| постоянный участник
|
Пост N: 7451
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.06.23 19:14. Заголовок: Столкнулся теперь с ..
Столкнулся теперь с другой проблемой, прога виснет НАГЛУХО в некоторых режимах через несколько раз. Подозреваю потерю фокуса в MODAL окне. У юзера прога работает в режиме сервер-терминалов. Это когда ярлык на рабочем столе, а прога запускается на сервере. Так в этом режиме и прога наглухо вешается, по окнам проскочить невозможно, STANDART окна показывает, а MODAL спряталось под ним. Помогает только убивание проги на сервере, юзер вообще ничего сделать не может. Главное меню тоже висит... Можно сделать спец-менюшку в проге для показа открытых окон и активации спрятавшегося окна ?
| |
|
|
| постоянный участник
|
Пост N: 4337
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.06.23 21:37. Заголовок: Andrey Попробуй пос..
Andrey Попробуй поставь в ... SET TOOLTIP BALLOON ON SET WINDOW MODAL PARENT HANDLE ON // окна Modal получают родителя - активное окно PS Это на последней версии Для старой версии сделай так, возьми к своему проекту файл h_windows.prg, включи его в hbp сценарий, в нем сделай STATIC nCtEfeito := 0, cDescEfeito := "" STATIC _HMG_OwnerModalHandle := .F. FUNCTION Set_HMG_OwnerModalHandle( lSet ) IF Valtype( lSet ) == "L" _HMG_OwnerModalHandle := lSet ENDIF RETURN _HMG_OwnerModalHandle . *-----------------------------------------------------------------------------* FUNCTION _DefineWindow ( FormName, Caption, x, y, w, h, nominimize, nomaximize, ; ... FUNCTION _DefineModalWindow ( FormName, Caption, x, y, w, h, Parent, nosize, nosysmenu, nocaption, aMin, aMax, ; ... IF _HMG_OwnerModalHandle _HMG_InplaceParentHandle := iif( _HMG_BeginWindowMDIActive, GetActiveMdiHandle(), GetActiveWindow() ) ENDIF IF _HMG_InplaceParentHandle <> 0 Parent := _hmg_InplaceParentHandle ELSEIF ! _HMG_BeginWindowMDIActive Parent := _hmg_MainHandle ENDIF ... тогда поставь в программе SET TOOLTIP BALLOON ON Set_HMG_OwnerModalHandle( .T. )
| |
|
|
| постоянный участник
|
Пост N: 7452
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.06.23 22:58. Заголовок: SergKis пишет: Это ..
SergKis пишет: Что-то не собирается... Собираю MG_BCC = "c:\borland\bcc55" ilink32.exe @D:\TEMP\en2z4e.lnk hbmk2: Linker script: -Gn -Tpe -LC:\borland\BCC55\Lib;C:\borland\BCC55\Lib\PSDK;"C:\MiniGUI-23.04.4\harbour\lib";"C:\MiniGUI-23.04.4\harbour\bin"; "C:\MiniGUI-23.04.4\lib" -aa c0w32.obj OBJ\main.obj . ..... "C:\MiniGUI-23.04.4\resources\minigui.res" "C:\MiniGUI-23.04.4\resources\hbprinter.res" "C:\MiniGUI-23.04.4\resources\miniprint.res" Turbo Incremental Link 5.66 Copyright (c) 1997-2002 Borland Error: Unresolved external 'SwitchToThisWindow' referenced from C:\MINIGUI-23.04.4\LIB\MINIGUI.LIB|c_windowsAPI hbmk2[Abonent4win]: Error: Running linker. 2
| |
|
|
| постоянный участник
|
Пост N: 4338
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.06.23 23:21. Заголовок: Andrey Что ты собир..
Andrey Что ты собираешь ? h_windows.prg надо из своей старой версии брать, у тебя была, вроде 23.01 работающая
| |
|
|
| постоянный участник
|
Пост N: 7453
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.06.23 23:37. Заголовок: SergKis пишет: Что ..
SergKis пишет: C:\MiniGUI-23.04.4\ - новую версию, старую не хочется... Если собираю с BCC58, то собирается, но иконки в проге не те (я им не собираю никогда, из-за этого на 7.30 переходить начал) Если собираю с BCC55, то не собирается.
| |
|
|
| постоянный участник
|
Пост N: 4339
Зарегистрирован: 17.02.12
|
|
Отправлено: 29.06.23 07:56. Заголовок: Andrey пишет Если со..
Andrey пишет цитата: | Если собираю с BCC58, то собирается, но иконки в проге не те (я им не собираю никогда, из-за этого на 7.30 переходить начал) |
| gfilatov2002 пишет про 7.30 цитата: | Для получения русских букв в имени программы надо заменить два файла в папке \BCC102\bin\ на аналогичные файлы из поставки ВСС 5.5: - brcc32.exe - rw32core.dll |
| Попробуй проделать это для BCC58\bin
| |
|
|
| постоянный участник
|
Пост N: 7454
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.06.23 11:41. Заголовок: Заменил в BCC58\..
Заменил в BCC58\bin ilink32.exe implib.exe lnkdfm250.dll из 7.30 - вроде ресурсы стали собираться правильно ! И прога собралась нормально. Выложил юзеру - жду результатов.
| |
|
|
| постоянный участник
|
Пост N: 7455
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.07.23 15:17. Заголовок: SergKis пишет: SET ..
SergKis пишет: цитата: | SET WINDOW MODAL PARENT HANDLE ON // окна Modal получают родителя - активное окно |
| Протестировал юзер этот режим. Теперь прога вешается в других местах программы, где до этого не вешалась - потеря фокуса окна и нет на экране что можно закрыть. Т.е. на экране 3-4 окна по которым мышкой можно скакать, а закрыть НЕЛЬЗЯ !!! не реагирует на закрытие. Может это rdp-протокол не даёт закрыть активную задачу ? А как тогда закрыть эту "висячую" программу ? Есть какие варианты ? Веду лог. Вручную смотрю где висит программа и пытаюсь висячее окно приколотить через To_Focus() Может можно как то по другому ? P.S. Ещё на таймерах вешается прога. Но это я с помощью Сергея уже исправил. P.S.2 Проблема с вызовом двух подряд модальных окон так и не решилась, всё равно окно 2 вешается, благо клавиша ESC срабатывает, хоть юзер может выйти из этого окна и без вылета из программы.
| |
|
|
| постоянный участник
|
Пост N: 4341
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.07.23 16:11. Заголовок: Andrey пишет P.S.2 П..
Andrey пишет цитата: | P.S.2 Проблема с вызовом двух подряд модальных окон так и не решилась, всё равно окно 2 вешается, благо клавиша ESC срабатывает |
| Попробуй вместо 1-го modal сделать CHILD TOPMOST и не делать ON INIT {|| This.Topmost := .F., ... Изменится поведение ? цитата: | Теперь прога вешается в других местах программы, где до этого не вешалась - потеря фокуса окна и нет на экране что можно закрыть. |
| Пробуй манипулировать командами в тех местах, которые сломались SET WINDOW MODAL PARENT HANDLE OFF ... SET WINDOW MODAL PARENT HANDLE ON
| |
|
|
| постоянный участник
|
Пост N: 4342
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.07.23 18:21. Заголовок: SergKis пишет Попроб..
SergKis пишет цитата: | Попробуй вместо 1-го modal сделать CHILD TOPMOST |
| Ничего не даст, т.к. CHILD привязывается в _DefineWindow(...) к Main окну ParentHandle := iif( child == .T., _HMG_MainHandle, 0 ) что бы привязывать к STANDARD надо перед созданием CHILD делать hOld := _HMG_MainHandle _HMG_MainHandle := ThisWindow.Handle DEFINE WINDOW ... CHILD TOPMOST ... _HMG_MainHandle := hOld ... END WINDOW ... и смотреть поможет или нет PS Перед DEFINE WINDOW ... MODAL ... надо окну CHILD сделать Topmost := .F.
| |
|
|
| постоянный участник
|
Пост N: 7463
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.07.23 14:29. Заголовок: Пипец... Теперь пере..
Пипец... Теперь перестал работать код, который ранее работал ADD COLUMN TO oBrwV HEADER CRLF + "Наименование"+ CRLF + "оборудования/работ" ; SIZE nTxtWidth ; ALIGN DT_LEFT,DT_CENTER,DT_LEFT ; // cells, header, footer DATA {|| SAY_SEL((cAlias)->KOBORUD, "OBORUD", "OBORUD", 1 ) } ; NAME KOborud EDITABLE oBrwV:aColumns[4]:bPrevEdit := {|| EditTableCol4() /*, _PushKey( VK_ESCAPE )*/, MsgDebug("ky-ky"), FALSE } MsgDebug("ky-ky") на экране есть, а фокуса в таблице нет, т.е. дальше редактировать не могу ! Окно Модальное на экране не активное !!! Висит и всё ! Выход только по ESC ! И что делать ?
| |
|
|
| постоянный участник
|
Пост N: 7464
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.07.23 17:01. Заголовок: Модальное окно на эк..
Модальное окно на экране (1), вызываю второе модальное окно (2) с ТСБ, нажимаю клавишу F2 - помощи (AlertInfo) и окно (2) - ВИСИТ !!! Уже во втором месте программы такое с модальными окнами... Пока сделал так: hOld := _HMG_InplaceParentHandle _HMG_InplaceParentHandle := ThisWindow.Handle DEFINE WINDOW Form_Tvr ; MODAL NOSIZE ; ON INIT {|| OnInitFormTvr() } .... ON KEY ESCAPE ACTION ThisWindow.Release ON KEY F2 ACTION HelpThisWindow() ON KEY F3 ACTION AlertInfo(cHelp, "Помощь") если вызывать эти клавиши, то окно тоже ВЕШАЕТСЯ !!! END WINDOW .... IF ! ISNIL(hOld) ; _HMG_InplaceParentHandle := hOld ENDIF ? "=[End]= " + ProcNL(), "Forms: "+ HB_ValToExp(HMG_GetForms()) RETURN NIL STATIC FUNCTION OnInitFormTvr() oBrwV:Setfocus() IF oBrwV:nAt == 1 .AND. (oBrwV:cAlias)->KOLVO == 0 oBrwV:PostMsg( WM_KEYDOWN, VK_RETURN, 0 ) // послать ENTER для редактирования //_PushKey(VK_1) ENDIF RETURN NIL Григорий, почему так происходит ?
| |
|
|
| постоянный участник
|
Пост N: 4346
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.07.23 17:50. Заголовок: Andrey У тебя устан..
Andrey У тебя установлено SET WINDOW MODAL PARENT HANDLE ON Убери все строки hOld := _HMG_InplaceParentHandle _HMG_InplaceParentHandle := ThisWindow.Handle ... IF ! ISNIL(hOld) ; _HMG_InplaceParentHandle := hOld ENDIF Для модального окна, которое запускается с окна STANDARD сделай запоминание типа окна, т.е. LOCAL cTypeWnd := ow:Type или This.Type убери все лишние переключения фокуса оставь, например, при выходе из modal окна ACTIVATE WINDOW &cForm IF cTypeWnd == "S" To_Focus(cWnd, cBrw) ENDIF Что бы при возвратах система сама возвращала фокус на handle родителя цитата: | oBrwV:aColumns[4]:bPrevEdit := {|| EditTableCol4() /*, _PushKey( VK_ESCAPE )*/, MsgDebug("ky-ky"), FALSE } MsgDebug("ky-ky") на экране есть, а фокуса в таблице нет, т.е. дальше редактировать не могу ! Окно Модальное на экране не активное !!! Висит и всё ! Выход только по ESC ! |
| Если _HMG_InplaceParentHandle не задано или задано каким то значением _HMG_InplaceParentHandle := hOld не тек. активного окна и не стоит SET WINDOW MODAL PARENT HANDLE ON , то после MsgDebug("ky-ky") фокус может улететь куда то на др. окно или main, т.к. MsgDebug() - modal окно внутри. Лучше такие конструкции, как вызов AlertInfo, MsgDebug, ... (в основе HMG_Alert()) не использовать PS Ты часто ставишь фокус на Label "Label_Buf", если у тебя есть установки oBrw:UserKeys(...) или oBrw:bUserKeys - обработчики клавиш, то они работают, если фокус на тсб, т.е. фокус на "Label_Buf" блокирует работу уст. клавиш тсб. Это надо иметь ввиду.
| |
|
|
| постоянный участник
|
Пост N: 7465
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.07.23 20:29. Заголовок: Поставил как ты напи..
Поставил как ты написал. Всё равно без этого не работает. STATIC FUNCTION OnInitFormTvr() oBrwV:Setfocus() IF oBrwV:nAt == 1 .AND. (oBrwV:cAlias)->KOLVO == 0 oBrwV:PostMsg( WM_KEYDOWN, VK_RETURN, 0 ) // послать ENTER для редактирования //_PushKey(VK_1) ENDIF RETURN NIL Если из Enter выходим и нажимает эти клавиши - то висим. ON KEY F2 ACTION HelpThisWindow() ON KEY F3 ACTION AlertInfo(cHelp, "Помощь") Нажимаем ESC - выход из Modal(2) и потом всё работает - клавиши ВСЕ работают. Т.е. на ПЕРВОМ разе беда, а потом всё работает...
| |
|
|
| постоянный участник
|
Пост N: 4347
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.07.23 21:18. Заголовок: Варианты попробуй 1...
Варианты попробуй 1. - Minimize, Restore потом OnInitFormTvr 2.- Minimize потом выход из modal(2) и снова вход как было 0. и как 1.
| |
|
|
| постоянный участник
|
Пост N: 7466
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.07.23 21:27. Заголовок: SergKis пишет: 2.- ..
SergKis пишет: цитата: | 2.- Minimize потом выход из modal(2) и снова вход как было 0. и как 1. |
| Не понял, это как ?
| |
|
|
| |
Пост N: 1938
Зарегистрирован: 20.02.11
|
|
Отправлено: 05.07.23 21:39. Заголовок: Andrey пишет: Не по..
Andrey пишет: может в личку перейдете ? От обсуждения mg как то незаметно перешли в help desk Андрея.
| |
|
|
| постоянный участник
|
Пост N: 4348
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.07.23 21:45. Заголовок: Andrey пишет Не поня..
Andrey пишет :Event(VK_RETURN, {|ow| /*1*/ my_Modal(ow, 0), /*2*/ my_Modal(ow, 1)}) ... FUNC my_Modal(oWnd, nVxod) ... 0. ON INIT {|| iif(nVxod > 0, OnInitFormTvr(), ( This.Minimize, _wPost(99) ) ) } 1. ON INIT {|| This.Minimize, DoEvents(), _wPost( iif(nVxod > 0, 0, 99) } ... :Event( 0, {|| This.Restore, DoEvents(), OnInitFormTvr() }) :Event(99, {|ow| ow:Release() })
| |
|
|
| постоянный участник
|
Пост N: 4349
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.07.23 23:39. Заголовок: Haz пишет может в ли..
Haz пишет цитата: | может в личку перейдете ? От обсуждения mg как то незаметно перешли в help desk Андрея. |
| Перейдем, но ситуация взаимодействия фокуса окон main, несколько standard, к ним по нескольку modal никуда не денется, т.к. один раз вход со standard (бывает и всегда) на modal и выход из modal, окно standard прячется под main (к desktopу прижимается), а запуск с modal др. modal и возврат с него, приводит к убеганию фокуса куда то типа на main, а сверху модал 1 и вернуть фокус на это модал не получается (_HMG_InplaceParent задан). там еще есть ситуции, сверху standard modal окно 1 (с него по Enter можем входить в modal 2 и на нем по Enter можем вызывать окно AlertInfo(), тоже модал), часть окна standard видна из под модал 1. Любой клик на любом месте standard окна активирует несколько нажатий Enter на modal 1 окне и мы попадаем на окно 2 модал и с него на AlertInfo(). Эта ситуация видна в примере, который я выкладывал выше. Причем это происходит один раз при первом вызове со standard окна modal 1. Потом со standard -> modal 1 -> ... все работает ok!. Выходим из окна standard на main и снова нажимаем кнопку -> standard -> modal 1, кликаем на standard и вся сбойная ситуация повторяется 1 раз. На всех окнах standard и модал таблицы тсб на customer.dbf
| |
|
|
| |
Пост N: 1939
Зарегистрирован: 20.02.11
|
|
Отправлено: 06.07.23 00:01. Заголовок: SergKis пишет: Пере..
SergKis пишет: цитата: | Перейдем, но ситуация взаимодействия фокуса окон main, несколько standard, к ним по нескольку modal никуда не денется, |
| Сергей, без обид. Решение уже есть ? Молодцы ,что поймали косяк , но это частная ситуация. Если еще 2 человека напишут сюда о такой же проблеме у них, готов публично перед всеми извиниться. Возможно эта проблема связана со стилем программирования и использования функционала МГ, но это не глобальная проблема. За 20 лет моего опыта использования МГ , все фокусы с фокусами решались стандартными средствами МГ.
| |
|
|
| постоянный участник
|
Пост N: 7490
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.07.23 12:54. Заголовок: Есть у заказчика Win..
Есть у заказчика Windows 11, прога на МиниГуи за день 8 раз упала. Какие то непонятные ошибки: Time from start: 0 days 2 hours 35 mins 13 secs Error BASE/0 MiniGUI Err.: _GETCLIENTRECT Args: [1] = U --------------------------------- Stack Trace --------------------------------- Called from _GETCLIENTRECT(0) Called from ERRORWINDOWS(798) in module: Source\ErrorSys3.prg Called from SHOWERROR(253) in module: Source\ErrorSys3.prg В коде вот это стоит: nW := This.ClientWidth // строка 798 nH := This.ClientHeight Time from start: 0 days 1 hours 23 mins 47 secs Error BASE/0 MiniGUI Err.: _GETCLIENTRECT Args: [1] = U --------------------------------- Stack Trace --------------------------------- Called from _GETCLIENTRECT(0) Called from ASK3MENU(3427) in module: Source\form_Abonent.prg Called from ASK_TARIF(55) in module: Source\form_Abonent.prg В коде вот это стоит: nMaxWidth := This.ClientWidth // строка 3427 nMaxHeight := This.ClientHeight Time from start: 0 days 0 hours 34 mins 59 secs Error BASE/1093 Неверный аргумент: MAX Args: [1] = U [2] = N 34.00 --------------------------------- Stack Trace --------------------------------- Called from MAX(0) Called from _SETGETBOXCARET(0) Called from OGETEVENTS(0) Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from SHOW_CARD(444) in module: Source\Tbrw_fCard.prg ACTIVATE WINDOW Form_Card // строка 444 Time from start: 0 days 2 hours 27 mins 42 secs Error BASE/5001 MiniGUI Error: _SETFONT Args: [1] = N 0 [2] = C Tahoma [3] = N 20 [4] = L F [5] = L F [6] = L F [7] = L F --------------------------------- Stack Trace --------------------------------- Called from _SETFONT(0) Called from _DEFINEGETBOX(0) Called from MYCARDFIELDGETBOX(1787) in module: Source\Tbrw_fCard.prg Called from SHOWPAGECARD(1288) in module: Source\Tbrw_fCard.prg Причём видно же, что прога поработает и только спустя какое то время падает. ПОЧЕМУ ? На Win10 нет таких ошибок, там редко падает. Что можно сделать ?
| |
|
|
| постоянный участник
|
Пост N: 7508
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.08.23 14:58. Заголовок: У моего юзера Win10,..
У моего юзера Win10, нормальный комп. Моя прога постоянно падает или виснет в течении дня, раза 4-8 за день. Бьюсь с этой проблемой порядка 2-х лет. После долгих проб и помощи Сергея выяснилось... НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ в большой проге таймера на главной форме !!! После нескольких срабатываний таймера портят окружение и работающие функции начинают виснуть или вылетать !!! Вчера ради эксперимента отключил в своей проге таймера. Прога за день ни разу НЕ ПОВИСЛА и НЕ ВЫЛЕТЕЛА !!! Что-то с таймерами в МиниГуи не то....
| |
|
|
| |
Пост N: 1947
Зарегистрирован: 20.02.11
|
|
Отправлено: 10.08.23 18:15. Заголовок: Andrey пишет: НЕЛЬЗ..
Andrey пишет: цитата: | НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ в большой проге таймера на главной форме !!! |
| Ну не знаю, один проект пять лет живет с тремя таймерами на главной форме, причем один ежесекундно работает. Ничего не виснет. Правда все процедуры таймера в потоках идут. Окружение не пользую, все контролы стараюсь задавать явно. Скорее проблема в окружении и его использовании, а таймер просто обозначил проблему PS. С днём рождения тебя 👍
| |
|
|
| постоянный участник
|
Пост N: 7509
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.08.23 15:33. Заголовок: Haz пишет: Правда в..
Haz пишет: цитата: | Правда все процедуры таймера в потоках идут |
| Вот это и отличается ! Так и нужно делать, а не как я. Haz пишет: Спасибо БОЛЬШОЕ !
| |
|
|
| постоянный участник
|
Пост N: 7514
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.08.23 17:48. Заголовок: Как избавиться от ош..
Как избавиться от ошибок в МиниГуи ? Можно ли поставить доп. проверки ? Вот такая ошибка появляется часто, за 5 дней была 4 раза. Комп новый Core-i5, Win10 64bit Time from start: 0 days 0 hours 34 mins 59 secs Error BASE/1093 Неверный аргумент: MAX Args: [1] = U [2] = N 34.00 --------------------------------- Stack Trace --------------------------------- Called from MAX(0) Called from _SETGETBOXCARET(0) Called from OGETEVENTS(0) Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from SHOW_CARD(444) in module: Source\Tbrw_fCard.prg Сергей мне написал что это ошибка в коде: Это где то тут (в целом работа с GETBOX {каретка\вид курсора} идет в обработчике: "Called from OGETEVENTS(0)") *-----------------------------------------------------------------------------* STATIC PROCEDURE _SetGetBoxCaret( hWnd ) *-----------------------------------------------------------------------------* LOCAL hDC LOCAL aMetr LOCAL nEnd LOCAL cChar LOCAL nWidth LOCAL nHeight HideCaret( hWnd ) DestroyCaret() IF ! IsWindowHasStyle( hWnd, ES_READONLY ) nEnd := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) cChar := HMG_EditControlGetChar( hWnd, nEnd ) hDC := GetDC( hWnd ) aMetr := GetTextMetric( hDC ) ^^^^^ - тут: aMetr[ 1 ] == "U" or aMetr[ 2 ] == "U" возможно hDC не выделился, может ресурсов не хватило, но ХЗ что на самом деле ReleaseDC( hWnd, hDC ) nHeight := aMetr[ 1 ] nHeight := Max( nHeight, .85 * GetWindowHeight( hWnd ) ) ^^^^^^^ - U nWidth := aMetr[ 2 ] nWidth := Max( nWidth, .75 * HMG_GetCharWidth( hWnd, cChar ) ) ^^^^^^^ - U #define SM_CXBORDER 5 CreateCaret( hWnd, 0, iif( lInsert, GetSystemMetrics( SM_CXBORDER ), Int( nWidth ) ), nHeight ) ShowCaret( hWnd ) ENDIF RETURN Григорий, сделай что то, а то юзер прав, а я не знаю что делать....
| |
|
|
| |
Пост N: 7784
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.08.23 17:52. Заголовок: Andrey пишет: Григо..
Andrey пишет: цитата: | Григорий, сделай что то, а то юзер прав, а я не знаю что делать.... |
| Так он же писал После 18-ти лет активной разработки этот проект подошел для меня к концу по понятным причинам
| |
|
|
| постоянный участник
|
Пост N: 1653
Зарегистрирован: 27.01.07
|
|
Отправлено: 15.08.23 20:34. Заголовок: Andrey пишет: Григо..
Andrey пишет: "А что, так можно было?"))) Ты очень много лет занимался копипастом. Пора взяться за ум)) Без обид.
| |
|
|
| |
Пост N: 1951
Зарегистрирован: 20.02.11
|
|
Отправлено: 15.08.23 22:28. Заголовок: Andrey пишет: Григо..
Andrey пишет: цитата: | Григорий, сделай что то, а то |
| Григорий и так слишком долго и много делал для этого проекта. Дальше сам или ищи другого спонсора. Ничего невозможного нет, просто нужно начать делать своими руками и думать своей головой
| |
|
|
| moderator
|
Пост N: 2181
Зарегистрирован: 11.02.10
|
|
Отправлено: 17.08.23 20:34. Заголовок: SergKis пишет: Это..
SergKis пишет: цитата: | Это где то тут (в целом работа с GETBOX {каретка\вид курсора} идет в обработчике: "Called from OGETEVENTS(0)") *-----------------------------------------------------------------------------* STATIC PROCEDURE _SetGetBoxCaret( hWnd ) *-----------------------------------------------------------------------------* LOCAL hDC LOCAL aMetr LOCAL nEnd LOCAL cChar LOCAL nWidth LOCAL nHeight HideCaret( hWnd ) DestroyCaret() IF ! IsWindowHasStyle( hWnd, ES_READONLY ) nEnd := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) cChar := HMG_EditControlGetChar( hWnd, nEnd ) hDC := GetDC( hWnd ) aMetr := GetTextMetric( hDC ) ^^^^^ - тут: aMetr[ 1 ] == "U" or aMetr[ 2 ] == "U" возможно hDC не выделился, может ресурсов не хватило, но ХЗ что на самом деле ReleaseDC( hWnd, hDC ) nHeight := aMetr[ 1 ] nHeight := Max( nHeight, .85 * GetWindowHeight( hWnd ) ) ^^^^^^^ - U nWidth := aMetr[ 2 ] nWidth := Max( nWidth, .75 * HMG_GetCharWidth( hWnd, cChar ) ) ^^^^^^^ - U #define SM_CXBORDER 5 CreateCaret( hWnd, 0, iif( lInsert, GetSystemMetrics( SM_CXBORDER ), Int( nWidth ) ), nHeight ) ShowCaret( hWnd ) ENDIF RETURN |
| Предлагаю для проверки исправленную редакцию этой функции: *-----------------------------------------------------------------------------* STATIC PROCEDURE _SetGetBoxCaret( hWnd ) *-----------------------------------------------------------------------------* LOCAL hDC LOCAL aMetr LOCAL nEnd LOCAL cChar LOCAL nDefHeight LOCAL nDefWidth LOCAL nHeight LOCAL nWidth HideCaret( hWnd ) DestroyCaret() IF ! IsWindowHasStyle( hWnd, ES_READONLY ) nEnd := HiWord( SendMessage( hWnd, EM_GETSEL, 0, 0 ) ) cChar := HMG_EditControlGetChar( hWnd, nEnd ) nDefHeight := .85 * GetWindowHeight( hWnd ) nDefWidth := .75 * HMG_GetCharWidth( hWnd, cChar ) hDC := GetDC( hWnd ) aMetr := GetTextMetric( hDC ) ReleaseDC( hWnd, hDC ) IF aMetr[ 1 ] != NIL nHeight := aMetr[ 1 ] nHeight := Max( nHeight, nDefHeight ) ELSE nHeight := nDefHeight ENDIF IF aMetr[ 2 ] != NIL nWidth := aMetr[ 2 ] nWidth := Max( nWidth, nDefWidth ) ELSE nWidth := nDefWidth ENDIF #define SM_CXBORDER 5 CreateCaret( hWnd, 0, iif( lInsert, GetSystemMetrics( SM_CXBORDER ), Int( nWidth ) ), nHeight ) ShowCaret( hWnd ) ENDIF RETURN Ваши комментарии приветствуются
| |
|
|
| постоянный участник
|
Пост N: 7516
Зарегистрирован: 12.09.06
|
|
Отправлено: 17.08.23 21:20. Заголовок: Григорий ! Спасибо О..
Григорий ! Спасибо ОГРОМНОЕ ! А код библиотеки подправишь, чтобы было одинаково у всех ? P.S. такая ошибка пошла примерно после февральской версии, до этого такой ошибки не было, я смотрел лог ошибок у своих пользователей. Я до этого собирал январской версией МиниГуи.
| |
|
|
| постоянный участник
|
Пост N: 4368
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.08.23 21:21. Заголовок: gfilatov2002 пишет П..
gfilatov2002 пишет цитата: | Предлагаю для проверки исправленную редакцию этой функции |
| Так возможно использовать, если мы уверены, что hWnd правильный, а если нет, то мы будем в той же ситуации, т.е. hDC будет NULL. В OGETEVENTS() кроме i := AScan ( _HMG_aControlHandles, hWnd ) и IF i <= 0 ; RETURN( 0 ) по hWnd нет ничего. Может использовать IsWindowHandle(hWnd) ? При этом причину не правильного значения hWnd вряд ли поймем.
| |
|
|
| moderator
|
Пост N: 2182
Зарегистрирован: 11.02.10
|
|
Отправлено: 19.08.23 15:33. Заголовок: SergKis пишет: Може..
SergKis пишет: цитата: | Может использовать IsWindowHandle(hWnd) ? |
| Добавил такую проверку Благодарю за подсказку
| |
|
|
| постоянный участник
|
Пост N: 7521
Зарегистрирован: 12.09.06
|
|
Отправлено: 23.08.23 14:36. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: Григорий, а как получить исправления по этой ошибке ? У юзера сегодня за 4 часа, прога 4 раза падала... Вот с такой ошибкой: Time from start: 0 days 0 hours 46 mins 21 secs Error BASE/1093 Неверный аргумент: MAX Args: [1] = U [2] = N 34.00 --------------------------------- Stack Trace --------------------------------- Called from MAX(0) Called from _SETGETBOXCARET(0) Called from OGETEVENTS(0) Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from SHOW_CARD(446) in module: Source\Tbrw_fCard.prg Комп хороший, Win10, спящего режима нет, в инет не входят, работают только в моей проге. Прога собрана на MiniGUI Extended Edition 23.07.0 (32-bit) ANSI
| |
|
|
| moderator
|
Пост N: 2183
Зарегистрирован: 11.02.10
|
|
Отправлено: 23.08.23 17:35. Заголовок: Andrey пишет: Григо..
Andrey пишет: цитата: | Григорий, а как получить исправления по этой ошибке ? |
| На следующей неделе выложу обновление
| |
|
|
| постоянный участник
|
Пост N: 7597
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.10.23 12:10. Заголовок: Нашёл причину вылета..
Нашёл причину вылета программы с таким сообщением: Error BASE/1004 Message not found: TWNDDATA:EVENT Args: [1] = O TWNDDATA --------------------------------- Stack Trace --------------------------------- Called from __ERRRT_SBASE(0) Called from TWNDDATA:ERROR(0) Called from (b)HBOBJECT(0) Called from TWNDDATA:MSGNOTFOUND(0) Called from TWNDDATA:EVENT(0) Called from MAIN(181) in module: Source\main.prg Использую у себя в проекте С-код для ключа HASP, написанный давно ещё в 2013 году и который работал без проблем всё это время. Как убираю эти функции, проект нормально запускается ! Без этих функций никак... Пошёл по другому пути. В МиниГуи 29.09.2 записываю Harbour с версии МиниГуи 23.01 Built on: Jan 23 2023 Last ChangeLog entry: 2023-01-23 12:46 UTC+0100 Przemyslaw Czerpak ChangeLog ID: a6a86c100291b3ed33a2a0a680f0e5a17d627ce0 Мой проект так же успешно запускается !!! Значит беда в самом Harbour... Вопрос к знатокам Harbour, чем грозит использование старой версии Harbour в новом МиниГуи ? Т.е. в версии МиниГуи 29.09.2 буду использовать Harbour с версии МиниГуи 23.01 P.S. Но проблема подвисание окон, т.е. в окне НЕЛЬЗЯ нажать любую кнопку - осталась. Если делаешь выход из окна по ESC (хорошо хоть это есть), то при повторном вызове окна зависание пропадает. Это происходит не везде, в моей программе 4 таких окна.
| |
|
|
| постоянный участник
|
Пост N: 7646
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.12.23 13:18. Заголовок: Всех с наступающим Н..
Всех с наступающим Новым Годом ! Моя большая прога стабильно работает на версии МиниГуи 29.09.2 + Harbour с версии МиниГуи 23.01 Но иногда падает вот с такой ошибкой у некоторых юзеров. Date: 30.11.2023 Time: 16:17:13 User: SERVER/User2/Оксана DbInfo: Alias - ZAIVKA, Ord - TEMP2INDEX, Recno - 9878/9878 Time from start: 0 days 6 hours 43 mins 0 secs Error BASE/5001 MiniGUI Error: _SETFONT Args: [1] = N 0 [2] = C Tahoma [3] = N 20 [4] = L F [5] = L F [6] = L F [7] = L F --------------------------------- Stack Trace --------------------------------- Called from _SETFONT(0) Called from _DEFINEGETBOX(0) Called from ADDTABNEWPAGE1(396) in module: Source\form_Zaivka3.prg Called from FORM_ZAIVDEFECT(111) in module: Source\form_Zaivka3.prg Called from ZAIVDEFECT(37) in module: Source\form_Zaivka3.prg Called from (b)HB_MACROBLOCK(0) Called from SHOWPAGECARD(1205) in module: Source\Tbrw_fCard.prg Date: 26.12.2023 Time: 16:36:31 User: SERVER/User2/Оксана DbInfo: Alias - ZAIVKA, Ord - TEMP2INDEX, Recno - 10114/10114 Time from start: 0 days 7 hours 34 mins 6 secs Error BASE/5001 MiniGUI Error: _SETFONT Args: [1] = N 0 [2] = C Tahoma [3] = N 20 [4] = L F [5] = L F [6] = L F [7] = L F --------------------------------- Stack Trace --------------------------------- Called from _SETFONT(0) Called from _DEFINEGETBOX(0) Called from ADDTABNEWPAGE1(396) in module: Source\form_Zaivka3.prg Called from FORM_ZAIVDEFECT(111) in module: Source\form_Zaivka3.prg Called from ZAIVDEFECT(37) in module: Source\form_Zaivka3.prg Called from (b)HB_MACROBLOCK(0) Мой код вообще не причём: @ nRow1, nCol GETBOX Text_6x2 WIDTH nWTxt HEIGHT nFontSize*2 VALUE M->oPubDefect:c6x2 ; FONTCOLOR BLACK BACKCOLOR WHITE SIZE nFontSize PICTURE cFormat ; ON GOTFOCUS {|| ReViewGBox() } ; ON CHANGE {|| myEditGBox(), M->oPubDefect:c6x2 := GetProperty(ThisWindow.Name, This.Name, "Value") } // строка 396 AADD( aObj, { 'Text_6x2', "c6x2" } ) _AddTabControl ( cTabObj, 'Text_6x2', cForm , nPage , nRow, nCol ) Можно как то избавиться от такой ошибки ?
| |
|
|
| постоянный участник
|
Пост 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 Ну и как правильно сделать ?
| |
|
Ответов - 167
, стр:
1
2
3
4
5
6
7
8
9
All
[только новые]
|
|
|