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

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

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

Ответов - 173, стр: 1 2 3 4 5 6 7 8 9 All

SergKis: Петр пишет oHmgData() это псевдофункция класса THmgData, возвращающая объект класса. Андрею это мало, что говорит. Всегда у него SET OOP ON и ему нужна "рыба"

SergKis: Haz пишет Сколько же переделывать Может такая переделка быть (поменьше править кода) и берем из _HMG_aControlIds[ k ][pre2] {|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 [/pre2]

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


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

SergKis: Andrey пишет Блин, а можно как то узнать у себя в программе, что юзер тупо закрыл сессию или перегрузил комп ? обрабатывай сообщения (как ты делал WM_COPYDATA) WM_ENDSESSION WM_QUERYENDSESSION

Andrey: SergKis пишет: обрабатывай сообщения (как ты делал WM_COPYDATA) WM_ENDSESSION WM_QUERYENDSESSION Спасибо ! Займусь этим чуть позже....

Andrey: SergKis пишет: обрабатывай сообщения (как ты делал WM_COPYDATA) WM_ENDSESSION WM_QUERYENDSESSION А ещё какие нужно сообщения обрабатывать в своей программе ? Снятие из Диспетчера задачи - это какое сообщение будет ? Кто что использует ? Поделитесь опытом.

Andrey: Сделал тест что происходит с программой. Запуск, снятие, закрытие сессии и т.д. Пишет в лог всегда, потом можно смотреть что было с программой и с юзером "бодаться" ! Вроде работает. Что ещё не учёл, посмотрите ? [pre2] /* * 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)[/pre2] А когда прога упадёт по ошибке системной что будет срабатывать ? ELSEIF nMsg == WM_SYSTEMERROR - это будет писаться в лог ?

gfilatov2002: Andrey пишет: Что ещё не учёл Возможно, обработчик событий должен выглядеть так: [pre2] 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) [/pre2] и функция выхода из программы изменена для обработки события ON INTERACTIVECLOSE следующим образом: [pre2] 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. [/pre2]

Andrey: gfilatov2002 пишет: Возможно, обработчик событий должен выглядеть так: Да в том то и дело, что я не знаю как правильно. Только вчера сделал и тестировал. Нужные выходы юзеров - прога протоколирует в лог. То что и нужно мне было. А нигде больше такой лог и не видел ни у кого.... Размещайте у себя в библиотеке, может кому понадобиться сейчас или потом.

ММК: 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

Andrey: Большой в смысле, что ни у кого не видел причину выхода из программы ! Вот так, как сейчас сделано: [pre2]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 [/pre2] WM_CLOSE - это программа снята через Диспетчер задач WM_ENDSESSION - программа закрыта через перезагрузку компа. Т.е. все эти события, кроме "Closing the program" - не нормальное завершение программы.

Andrey: Опять вылет в большой проге у меня. В Win10 работает нормально, а под WinServer 2012 - вылет. [pre2] @ 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 [/pre2] Ошибка вот такая: [pre2] 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)[/pre2] Окно Form_Seek теряется совсем после вызова другого MODAL окна ...

Dima: Label_Buff Of Form_Seek Not defined Делай проверку

SergKis: Andrey пишет Окно Form_Seek теряется совсем после вызова другого MODAL окна ... Надо исп. в модальных окнах _HMG_InplaceParentHandle := hWnd // hWnd - окна родителя ... // после action модального окна _HMG_InplaceParentHandle := 0 иначе у modal окна родитель будет main window (default и вероятно фокус убегает на него) Dima пишет Делай проверку Этого мало в большой программе, надо исп. события, т.к. например код [pre2] DEFINE WINDOW Form_Seek ; ... ON INIT {|| myOnInitFSeek(nLineCol,cType,aDim), Form_Seek.Label_Buff.Setfocus } ... [/pre2] не дает завершится процедуре ACTION WINDOW Form_Seek нормальным образом (блок ON INIT это часть ACTION WINDOW ... после него еще есть код для завершения и он работает). т.е. лучше [pre2] 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 } ) ... [/pre2]

Andrey: Поставил событие - _wPost(11, This.Index) В Win10 нормально, а в WinServer 2012 - опять вылет.

Andrey: Вот так нужно делать в больших системах. [pre2] (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[/pre2] Спасибо БОЛЬШОЕ Сергей !!!

Andrey: Опять проблема в проге МиниГуи и Windows Server 2008 R2 6.1 SP1 - опять вылет, на том же самом сервере. Причем интересно, одна и таже прога эксплуатируется на нескольких WinServer 2008 и 2012. На 2012 проблемы нет, а на 2008 проблема есть. Причем используется процессоры Xeon. На одном сервере эта проблема и есть (хотя сервер фирменный PROLIANT), на другом такой же проц, только попроще - проблема тоже есть, подвисание, а потом вылет. Прога на МиниГуи, большая (26Мб ехе-ник) открывает 3 окона MODAL, в последнем окне справочник улиц. Если выбирать улицу стрелками, то прога не вешается, а если начинаем поиск по буквам, то первый выбор не вешается, а второй вешается прога. Окно нормально закрывается, НО возврат на второе окно MODAL не происходит, идёт вылет - пишет нет объекта на форме. Окно на экране - а прога пишет нет такого окна ! Блин фигня какая то.... Что делать - непонятно... Вот такие окна в проге: Месяц назад исправил ошибку, работало нормально - не вылетало, а сейчас опять вылетает... Можно и дальше убрать вылет окна, но это не решение ! ТЕРЯЕТСЯ ОКНО 2 после выбора из справочника в 3-окне. Как это предотвратить ?

Andrey: Опять глюги в программе у меня. Вылет из программы и 2-3 окна "Программа уже запущена" У меня нет нигде в коде такого сообщения. Наверное берётся системное сообщение из МиниГуи. Поискал и не нашёл.... Непонятно - КАКАЯ ПРОГРАММА уже запущена ? 1) Может стоит добавить строку в это окно, откуда уже запущена программа, в сам МиниГуи ? Типа такого - ProcNL() + CRLF + ProcNL(1) 2) Вот мой код: [pre2]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") [/pre2] Почему вылетает здесь на 54 строке ?

Andrey: Перешёл на новую версию - Harbour MiniGUI Extended Edition 23.02 (Update 1) До этого было - Harbour MiniGUI Extended Edition 22.12 (Update 2) Пересобрал свою большую прогу и установил только у ОДНОГО юзера... И поехало в первый же день... Прога вываливатся там где всегда работала. Фигня получается... Система WinServer 2008. Ошибки не постоянные, то вылетает то нет. Например ошибка такая: Вот код который работал: [pre2]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[/pre2] Откатился назад, ошибка ушла. Что делать ?



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