On-line: гостей 2. Всего: 2 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 5855
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.05.18 21:33. Заголовок: Вылет из программы...


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

Для чего это нужно, поясню: при входе в свою программу я пишу в базу кто и когда вошел в программу (логин пользователя).
И при выходе из программы, стираю этого пользователя из базы.
Если программа "вылетает", то юзер числится как работающий.
Древнее наследие с клипера, хотел переделать, да так и осталось.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 85 , стр: 1 2 3 4 5 All [только новые]


администратор




Пост N: 1246
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 14.05.18 21:57. Заголовок: Andrey пишет: Как м..


Andrey пишет:

 цитата:
Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете)


изменить стандартный обработчик ошибок. см. Errorsys.prg

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5856
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.05.18 23:55. Заголовок: Haz пишет: изменить..


Haz пишет:

 цитата:
изменить стандартный обработчик ошибок. см. Errorsys.prg



Т.е. нужно будет сделать следующее:
1) Изменить файл MiniGUI\SOURCE\ErrorSys.prg под себя - примерно так:
Скрытый текст

2) Добавить этот файл к себе в проект.

Достаточно этого будет ?

Дело в том, что не всегда на сервере закрываются базы !
Приходиться вручную закрывать открытые базы пользователя.
Не знаю кто оставляет их открытыми: терминалка на хХарборе или МиниГуи.
Но с таким периодически я сталкиваюсь.
Если в качестве сервера юзера пользуются Win ХР, то такое бывает чаще.
А избавиться от ХР никак не получается.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1248
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 15.05.18 00:12. Заголовок: Andrey пишет: Доста..


Andrey пишет:

 цитата:
Достаточно этого будет ?


Чтоб не писать свой обработчик ошибок. Можно и так.
Этого достаточно.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 795
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 15.05.18 08:44. Заголовок: "Опасные" у..


"Опасные" участки программы обрамить конструкцией
try
catch
MyExitFunction() // вызов моих функций
DbCloseAll() // закрыть все базы
end

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 6826
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.05.18 09:12. Заголовок: Andrey пишет: И при..


Andrey пишет:

 цитата:
И при выходе из программы, стираю этого пользователя из базы.


Rlock() записи юзера не подходит ? Если вылет , запись разблокируется (надеюсь что так).

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 раз кликов мышки на файл, потом на кнопку закрыть. Работа та ещё.
Или сервер перегрузить нужно, но всех юзеров замучишься по кабинетам обходить и выгонять из подключений к серверу.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5879
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.05.18 18:31. Заголовок: Сделал как посоветов..


Сделал как посоветовал Haz !
Отлично работает !
MyExitFunction() // вызов моих функций - отрабатывает нормально.

Дело в том что у меня главная программа на МиниГуи, через неё вызываю терминальные окна программы
и запоминаю хендлы открытых окон, а при аварийном вылете программы на МиниГуи, закрываю заодно и терминальные окна.
Классно проходит закрытие...
Заодно и пользователя из dbf-журнала пользователей программы (кто в программе) удаляю.

Спасибо за помощь !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 добавлен свой, чуть-чуть скорректирован, как Игорь посоветовал.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1827
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 31.05.18 07:09. Заголовок: Andrey Возможно дел..


Andrey
Возможно делаешь CloseAllWindow(), а где то в др. окне в on release\on interactiveclose делаешь вызов ее или Form_?.Release или DoMethod(..., 'Release'), похоже на такой компот ...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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)
?

Спасибо: 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"

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1828
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 31.05.18 18:58. Заголовок: Andrey пишет А что з..


Andrey пишет
 цитата:
А что за ошибки такие, перед ними:


это стек вызовов в момент ошибки
используй begin sequnce, что бы не падало и вывели тексты не в окно. а в log.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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), т.е. там не может создать окно.
Вроде делаю всё как обычно... Непонятки одни с этим окном.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 - куда лезет узнаешь

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 5897
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.06.18 12:03. Заголовок: SergKis пишет: пост..


SergKis пишет:

 цитата:
поставь трассировку по WaitWindowError - куда лезет узнаешь



Я уже пытался. Подскажи как ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1831
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.06.18 17:18. Заголовок: Andrey пишет Подска..


Andrey пишет
 цитата:
Подскажи как ?


Пример (на идеи из BASIC\WAIT_WINDOW_2) на событиях без потоков. http://my-files.ru/1ykqd9
Твой WaitWindowError можно сделать аналогично.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 }
...


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 1833
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 02.06.18 09:23. Заголовок: Может будет интересн..


Может будет интересно, пример продолжение http://my-files.ru/gkupot
Добавлен выбор, дублклик в календаре и перенос выбора на wait окна

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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
Куда можно поставить свою отладку ?
И как понять из-за чего свалилась программа ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 висит индикатором.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6925
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.03.21 22:03. Заголовок: Понял тебя. Убрал на..


Понял тебя. Убрал нафиг это самописное окно, поставил стандартное и сделал вывод в лог-файл.
Спасибо !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

И почему окно теряется ? Как исправить ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 году и так не менял. А нужно менять ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6933
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.04.21 17:25. Заголовок: SergKis пишет: Ты у..


SergKis пишет:

 цитата:
Ты уже приходил с таким вопросом и даже согласился использовать begin .. sequnce ...


Да поставил дополнительно PQping( M->cPubPgConnInfo ) // проверка доступности сервера
и пропала та ошибка, сейчас другая вылезла.
Спасибо !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 с формы ?
Форма на экране, объект тоже должен быть - ОКНО ЖЕ НЕ ЗАКРЫТО !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6941
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.04.21 17:33. Заголовок: Всем привет ! Хочу п..


Всем привет !
Хочу поделиться своим опытом по работе ТСБ в МиниГуи.
Делал программу, одновременная работа одного модуля с пятью похожими таблицами.
Кол-во полей для редактирования от 50 до 200.
Прога создавалась с 2015 года, вроде работала, но коряво,
постоянно терялись объекты на окнах и вылет программы.
За день раз 10 программа могла упасть у одного пользователя, а если открывал несколько таблиц, то труба,
обязательно упадёт.

Пока не помог SergKis исправить данную ситуацию, перевести все на контейнер и события !
Огромное спасибо тебе SergKis !
Сейчас прога перестала вылетать на этом модуле. Правлю другие вылеты проги.

Кому интересно, привожу заготовку как надо делать.
На кнопки всегда ставлю НОМЕР события и имя объекта (имя кнопки), а уже в событие ставлю функции обработки.
Писать код в событиях одно удовольствие.

В ини-файле описываю все поля, цвета, кнопки таблицы, иконки, фонты и т.д.
Скрытый текст

Примерный шаблон программы:
Скрытый текст


Полная функция вывода кнопки:
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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()

Почему вылет, что не так делаю ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7325
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.04.21 16:57. Заголовок: (cAlias)->(Field..


(cAlias)->(FieldPut(..........

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6945
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.04.21 17:16. Заголовок: Спасибо Dima ! :sm3..


Спасибо Dima !
Уже про это Сергей писал, да я код старый перекинул, торопился и вот результат...
Ошибка плавающая, вылазит только когда несколько таблиц открываю, т.е. после переключения между таблицами.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7326
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.04.21 21:40. Заголовок: Andrey пишет: Ошибк..


Andrey пишет:

 цитата:
Ошибка плавающая, вылазит только когда несколько таблиц открываю


Не забывай всегда (где он допустим) указывать (cAlias)-> , ну ты понял , надеюсь......

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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
Выкладывал ф-ии, повторю что бы не искать Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6946
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.04.21 13:49. Заголовок: Спасибо БОЛЬШОЕ ! :..


Спасибо БОЛЬШОЕ !
Этот код ещё в 2016 делал, перетаскивал из терминалки.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

Почему так происходит ?
Как избавиться от этой ошибки ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 )

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7404
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 04.07.21 15:09. Заголовок: Andrey пишет: Error..


Andrey пишет:

 цитата:
Error BASE/1102 Неверный аргумент: UPPER Args: [1] = U


Ну так и проверь что у тебя попадает в качестве параметра в функцию UPPER

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1616
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 04.07.21 18:14. Заголовок: Andrey пишет: UPPER..


Andrey пишет:

 цитата:
UPPER Args: [1] = U



Это означает, что первый аргумент функции Upper имеет тип Undefined. Вот и проверяй, что за херня в cFileLog в этот момент содержится.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7405
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 04.07.21 19:26. Заголовок: Andrey пишет: Почем..


Andrey пишет:

 цитата:
Почему срабатывает вот этот код после ShellExecute() ?


ShellExecute ведь не приостанавливает работу программы , поэтому и срабатывает код далее.
Или ShellExecute чем то отличается от WAPI_ShellExecute ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1617
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 04.07.21 19:39. Заголовок: Так что в переменной..


Так что в переменной cFileLog?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4033
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 04.07.21 21:28. Заголовок: Возможно, при вызове..


Возможно, при вызове ShellExecute вызывается LostFocus для какого-то объекта, внутри LostFocus вызывается Destroy для какого-то объекта, и в этом Destroy уже идет вызов Upper с параметром nil

Дополню: при выполнении ShellExecute вызывается (почему - вопрос) Destroy для объекта класса TCnlData, у которого свойство ::cName равно nil.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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. )

Она тоже есть.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6978
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 05.07.21 10:50. Заголовок: Поставил вместо MG_S..


Поставил вместо MG_Stop() обычный:
         MsgStop( cMsg , "Ошибки печати" )

Убрал своё окно ошибок.
Всё равно вылет после ShellExecute()
Вот такое окно:

Как исправить данную ситуацию ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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.......

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3781
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 05.07.21 11:35. Заголовок: Andrey пишет Как исп..


Andrey пишет
 цитата:
Как исправить данную ситуацию ?


Смотреть код, что дальше работает после ShellExecute().
Паша верно указал направление, после ShellExecute() попадаем на Destroy окна (TWndData), идет Destroy контролам (TCnlData) и в списке регистрации на окно контролов по имени и handle получаем nil (Get(xName))

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост 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 ) программа сваливается

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6980
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 05.07.21 12:13. Заголовок: Pasha пишет: вызыва..


Pasha пишет:

 цитата:
вызывается метод Del, и затем в неи (это строка 795 в последней версии 21.05 )


Вот я про это и писал, почему так происходит ?
Как исправить эту ситуацию ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4035
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 05.07.21 12:16. Заголовок: В том то и дело, что..


В том то и дело, что ошибка возникает не после ShellExecute(), а в процессе его выполнения, иначе ShellExecute() не было бы в логе ошибок
Ну а Destroy не надо вызывать напрямую. Он вызовется из деструктора объекта, а деструктор вызовется, если очистить переменную, содержащую объект, либо при завершении функции, в которой объект был создан, если этот объект не был присвоен другой переменной

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4036
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 05.07.21 12:18. Заголовок: Andrey пишет: Как и..


Andrey пишет:

 цитата:
Как исправить эту ситуацию ?



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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7409
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.07.21 09:07. Заголовок: Andrey пишет: Блин ..


Andrey пишет:

 цитата:
Блин и в других местах стало так же вылетать при вызове ShellExecute(


Видимо в новой версии MG косячок

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6985
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.07.21 11:57. Заголовок: SergKis пишет: Попр..


SergKis пишет:

 цитата:
Попробуй minigui.lib


Спасибо БОЛЬШОЕ !!!
Буду пробовать.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6989
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.07.21 21:07. Заголовок: SergKis пишет: В не..


SergKis пишет:

 цитата:
В ней правка такая


Потестировал ! Вроде не вылетает !!!

Надо бы добавить эту правку Григорию для новой версии МиниГуи !

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 1896
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.07.21 09:36. Заголовок: Andrey пишет: добав..


Andrey пишет:

 цитата:
добавить эту правку


Уже добавил
Благодарю за проверку

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост 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 - сделать функцию выводе текста в файл, или использовать аналог

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3787
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.07.21 11:55. Заголовок: Pasha пишет чтобы хо..


Pasha пишет
 цитата:
чтобы хоть понять, какой наследник TCnlData генерирует ошибку


Это мало что даст, т.к. родителем будет TWndData, а наследник, в основном, TCnlData, там вариантов мало.
Для понимания ситуации надо полный текст программы Андрея и трассировать его ситуацию по списку контролов и окон.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 таких отчётов и на одном сегодня появился вылет.
Потом правда не вылетало...
Как юзера этого добиваются ?
Одни загадки....
Писать везде проверку на существование такого объекта на форме ?
Блин, утомительно...
Как можно решить проблему вылета ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7442
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 30.08.21 20:51. Заголовок: Andrey пишет: Писат..


Andrey пишет:

 цитата:
Писать везде проверку на существование такого объекта на форме ?


Видимо да

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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/ И на мой взгляд поменьше всяких "бегунков-прыгунков-ползунков" - это все потребляет ресурсы

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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)


Спасибо: 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 - скорее вводит в заблуждение), но любая попытка работать валит клиента, т.к. разрушено соединение. Это я к тому, что ты можешь догадываться, предполагать, понимать что могло произойти на клиенте, но знать точно ... Потому твоя программа должна быть готова ко всему, в разумных пределах.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 7036
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 31.08.21 08:18. Заголовок: Почитал. Да это я п..


Почитал.
Да это я пропустил в своё время, посчитав что не нужно.
Прога тогда была у меня меньше на порядок.

Поставил HB_GCALL() , прога даже не замирает.
При входе в отчёты заставляю юзера закрывать ВСЕ другие окна, остаётся только одно окно с отчётами.
Буду наблюдать дальше за своими юзерами.
Спасибо БОЛЬШОЕ !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 7038
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 08.09.21 21:50. Заголовок: Делюсь своим опытом ..


Делюсь своим опытом понятия и работы с МиниГуи.
Корифеям можно не читать, ну или хотя бы добавить.
Многое мне Сергей помог и объяснил, но думаю что у других НЕТ такого учителя !

У меня БОЛЬШАЯ проблема была с пониманием почему маленькие проги на МиниГуи отлично работают, а моя большая программа нет.

У меня один модуль обслуживает одновремеено 5 похожих таблиц.
Объявлена одна переменная
 PRIVATE oBrw

В ней и крутяться 5 таблиц.

У себя на компе прога не вылетает, а у юзеров были постоянные вылеты.
Юзер запускает мою прогу, 1С, мозилу, эксель и т.д.
То есть память компа кушается отлично, в отличие от моих тепличных условий.

Переделал, как мне Сергей рекомендовал уйти от привязки объектов, например:
Скрытый текст

На контейнер, который железно привязанный к окну, примерно так:
Скрытый текст

Подробно я это уже описывал - Пост 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
Надеюсь что это пригодиться другим в понимание, как писать проги на МиниГуи.
Сергей, СПАСИБО тебе ОГРОМНОЕ !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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 часов, до этого уверен, что в это место юзер лазил сотню раз.
Там поиск по адресу - выбор из справочника улиц.
Как такое может быть и как исправить ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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), т.е. независимо работают с таблицами в разных разделах

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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, то просто тупо к ней обращаться без перекладывания на форму.
Спасибо !

Т.е. юзер открыл справочник улиц, пошёл покурил или чай попил (или в мозиле почту проверил, в игрушку поиграл),
потом пришёл и решил выбрать наконец то улицу... Вот и вылет ... Да уж ...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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() ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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
}


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1771
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 18.09.21 09:19. Заголовок: SergKis пишет: в бл..


SergKis пишет:

 цитата:
в блоке кода будет


Сергей, а как такой вариант?

PUBLIC oBrw

в блоке
... { | ow |
local oBr := oBrw
...
return nil
}

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1772
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 18.09.21 09:47. Заголовок: SergKis пишет: Свал..


SergKis пишет:

 цитата:
Свалится может и такой вариант
FUNCT myFunc(oWnd)
LOCAL oBr := oBrw



Сколько же переделывать

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3890
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.09.21 09:57. Заголовок: Haz пишет Сколько же..


Haz пишет
 цитата:
Сколько же переделывать


Не спеши сразу переделывать. Сделай для начала сборку мусора перед функцией, т.е.
{|ow| DoEvents(), hb_gcAll(), DoEvents(), myFunc(ow) }
возможно памяти будет хватать

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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() ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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"
...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1715
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 18.09.21 18:04. Заголовок: SergKis пишет: В oH..


SergKis пишет:

 цитата:
В oHmgData() ничего лишнего для работы с контейнером, как с переменными PUBLIC, в oKeyDat() есть методы, редко используемые



oHmgData() это псевдофункция класса THmgData, возвращающая объект класса.
oKeyDat() - функция, возвращающая экземпляр объекта TKeyData или TWmEData, в зависимости от принятых аргументов.

Класс THmgData доступен всегда, доступность других классов зависит от состояния константы _OBJECT_ в момент компиляции библиотеки.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3893
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.09.21 18:16. Заголовок: Петр пишет oHmgData(..


Петр пишет
 цитата:
oHmgData() это псевдофункция класса THmgData, возвращающая объект класса.


Андрею это мало, что говорит. Всегда у него SET OOP ON и ему нужна "рыба"

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост 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


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1773
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 19.09.21 08:46. Заголовок: SergKis пишет: Може..


SergKis пишет:

 цитата:
Может такая переделка быть


У меня оч редко после исполнения блока терялся алиас и выдавал alias not found и пропадала переменная public . Возможно это и есть сборщик. Проблема решилась частыми вызовами doEvents()

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 7068
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.09.21 09:00. Заголовок: Вроде не в тему, а м..


Вроде не в тему, а может и в эту тему - аварийное завершение программы !

Я в программу у себя поставил текстовый файл ловушку ошибки.
Т.е. при старте программы создаётся файл ErrDATA+TIME.log
если нет ошибки, то при выходе удаляю этот файл.

Смотрю у юзеров куча таких файлов, но внутри нет ошибок.
Наверное ВЫХОД из программы делают аварийно, т.е. тупо закрывают сессию терминального сервера.
Блин, а можно как то узнать у себя в программе, что юзер тупо закрыл сессию или перегрузил комп ?
Т.е. программа завершается аварийно.
Что-то на форуме вроде писали об этом, но я не помню.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3898
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.09.21 13:33. Заголовок: Andrey пишет Блин, а..


Andrey пишет
 цитата:
Блин, а можно как то узнать у себя в программе, что юзер тупо закрыл сессию или перегрузил комп ?


обрабатывай сообщения (как ты делал WM_COPYDATA)
WM_ENDSESSION
WM_QUERYENDSESSION

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 85 , стр: 1 2 3 4 5 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 234
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет