Отправлено: 14.05.18 21:33. Заголовок: Вылет из программы...
Всем привет ! Как можно в МиниГуи программе сделать вызов своих функций при аварийном завершении программы (т.е. при вылете) ? Т.е. хочу сделать сразу после появления MsgBox() вызов 2-3 функций и потом сделать DbCloseAll(). Как это реализовать ?
Для чего это нужно, поясню: при входе в свою программу я пишу в базу кто и когда вошел в программу (логин пользователя). И при выходе из программы, стираю этого пользователя из базы. Если программа "вылетает", то юзер числится как работающий. Древнее наследие с клипера, хотел переделать, да так и осталось.
Отправлено: 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 висит индикатором.
Отправлено: 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
Отправлено: 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.
Отправлено: 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
Отправлено: 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 с формы ? Форма на экране, объект тоже должен быть - ОКНО ЖЕ НЕ ЗАКРЫТО !
Отправлено: 16.04.21 17:33. Заголовок: Всем привет ! Хочу п..
Всем привет ! Хочу поделиться своим опытом по работе ТСБ в МиниГуи. Делал программу, одновременная работа одного модуля с пятью похожими таблицами. Кол-во полей для редактирования от 50 до 200. Прога создавалась с 2015 года, вроде работала, но коряво, постоянно терялись объекты на окнах и вылет программы. За день раз 10 программа могла упасть у одного пользователя, а если открывал несколько таблиц, то труба, обязательно упадёт.
Пока не помог SergKis исправить данную ситуацию, перевести все на контейнер и события ! Огромное спасибо тебе SergKis ! Сейчас прога перестала вылетать на этом модуле. Правлю другие вылеты проги.
Кому интересно, привожу заготовку как надо делать. На кнопки всегда ставлю НОМЕР события и имя объекта (имя кнопки), а уже в событие ставлю функции обработки. Писать код в событиях одно удовольствие.
В ини-файле описываю все поля, цвета, кнопки таблицы, иконки, фонты и т.д. Скрытый текст
Вызов на кнопках c главного меню программы: FormMyTable("Form_Dogovor",1,"Section_Dogovor",....) FormMyTable("Form_Abonent",2,"Section_Abonent",....) ..... FormMyTable("Form_Oplata",5,"Section_Oplata",....)
FUNCTION FormMyTable(cFormName,nTable,cIniSection,....)
@ 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() }
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() // выполнить прорисовку подвала
Отправлено: 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
Спасибо Dima ! Уже про это Сергей писал, да я код старый перекинул, торопился и вот результат... Ошибка плавающая, вылазит только когда несколько таблиц открываю, т.е. после переключения между таблицами.
Уже предлагал тебе использовать объект-контейнер для работы с записями 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 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
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
Почему так происходит ? Как избавиться от этой ошибки ?
Отправлено: 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
Отправлено: 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
Все даты в формате GMT
3 час. Хитов сегодня: 104
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет