Форум » [x]Harbour » Закрытие Харб крестиком » Ответить

Закрытие Харб крестиком

and3081: Следует ли расчитывать, что при закрытии окна программы крестиком (харб 3.2.0) в любой момент не приведет к краху DBF ? Т.е.они все автоматом закроются ? А если в данный момент выполнен flock() и идут операции записи в БД, что произойдет ? Можно как-то блокировать из харба закрытие крестом на это время ? Или какое-нибудь предупреждение повесить ? харб 3,2,0 + BCC 55

Ответов - 41, стр: 1 2 3 All

Dima: http://clipper.borda.ru/?1-4-0-00000824-000-0-0-1377875287 Для начала можно просто заблочить крестик HB_gtInfo( HB_GTI_CLOSABLE, .F. )

and3081: спасибо, HB_gtInfo( HB_GTI_CLOSABLE, .F. ) работает Но возник другой вопрос, чтобы получить доступ и к другим функциям HB_gtInfo, я исследовал пример из TESTS wvtext. В программе должен быть PROCEDURE hb_GTSYS() REQUEST HB_GT_WVT_DEFAULT REQUEST HB_GT_WIN RETURN Но при этом возникает паразитное окно. Причем при запуске из FAR лишнего окна не возникает, по-видимому Far как-то по умному это обходит. А если пример wvtext запускать ярлыком- то 2 окна (Win 7 32 разр Харб 3.2.0 + BCC 55). Как с этим бороться ?

and3081: Частично проблема решается, если вместо REQUEST, как в примере wvtext, использовать опцию hbmk2 -gtwvt. Тогда при создании ярлыка непосредственно на exe работает нормально. НО мне надо exe запускать из bat-ника ! А при создании ярлыка на батник он получается "Тип объекта- Пакетный файл Windows". И тогда появлется лишнее "родительское" окно, а уже потом окно самой программы. Как решить проблему ???


Dima: and3081 пишет: использовать опцию hbmk2 -gtwvt попробуй hbmk2 -gtwvt -gui

petr707: and3081 пишет: НО мне надо exe запускать из bat-ника Если в батнике после вызова EXE не нужно ожидание завершения EXE, вызов EXE можно сделать через START тогда первое окно (батника) закроется, окно TEST.exe будет жить =====TEST.BAT=== rem TEST.EXE start TEST.EXE ... EXIT

and3081: попробовал совет petr на редакторе мультиедит, давно меня лишнее окно достает (в WinXP так не было) Не работает ни start "C:\Program Files\Multi-Edit Lite 2008\MeLite.exe -SR" exit ни start "C:\Program Files\Multi-Edit Lite 2008\MeLite.exe" -SR exit В смысле редактор даже не запускается. Ну это моей проблемы и не решило бы, просто попробовал. Опция -gui к видимым результатам не привела. А батник у меня используется для обновления, т.е. замены exe-шника. т.е. X.BAT: astr.exe @if errorlevel 44 obnov.bat Т.е.программа создает obnov.bat и выходит с возвратом errorlevel=44. А как еще заменить exe-шник, не выйдя из него? Т.е. и батник не завершить до выхода из проги. От батника не отказаться, замкнутый круг. Есть идеи ?

Dima: start "твой заголовок" "C:\Program Files\FlashFXP\FlashFXP.exe" или start /b "твой заголовок" "C:\Program Files\FlashFXP\FlashFXP.exe"

and3081: ну с мультиедитом разобрался, оказывается первые кавычки у start - это заголовок окна. Работает: start "1" "C:\Program Files\Multi-Edit Lite 2008\MeLite.exe" -SR exit а по основной проблеме- как из проги запустить батник, но чтобы прога при этом завершилась ? Чтобы ее можно было перезаписать ?

Dima: мне кажется что до запуска проги из батника нужно средствами языка батника проверить обновление и если оно есть менять EXE и после этого его запускать. то есть прогу всегда запускать через батник.

Dima: можно еще тему полистать http://clipper.borda.ru/?1-4-0-00000741-000-0-0-1335519340

and3081: Точно ! Будем кроить

Andrey: and3081 пишет: А как еще заменить exe-шник, не выйдя из него? Стандартными средствами НИКАК !

petr707: Andrey пишет: Стандартными средствами НИКАК ! Прошу попробовать Можно в отдельном окне, например по <Shift+Enter> из под Far В контексте пользователя - отлично меняется ИМЯ исполняемого файла, освобождая основное имя для размещения нового файла. Выполняемая задача НЕ ВИДИТ замены имени исполняемого файла hbmk2.exe test.prg -lhbct ========test.prg===== proc main ? exename() Inkey(100) hb_run("rename test.exe test_old.exe") ? exename() Inkey(100) hb_run("dir >a.txt") Inkey(100) ? filestr("a.txt") return

Dima: petr707 Интересный подход По ходу в Clipper можно было даже писать в запущенный EXE , с Harbour такой фокус не проходит Имею в виду fopen(exename(),2) (fseek(),fwrite(),fclose())

Sergy: А нужно-ли запускать обновление прямо во время работы задачи ? У меня происходит все при автозагрузке. Подключаются сетевые диски, проверяется версия, если есть различие - обновление. Юзеры работают днем, программа обновляется в основном, ночью. В редких случаях - можно вывести окно с требованием завершить работу и запустить update.bat ярлыком автозагрузки. Версии работающих программ видны - при необходимости самыми упертыми админ занимается лично.

Andrey: Sergy пишет: при необходимости самыми упертыми админ занимается лично. +1 и какие такие упертые ?

Andrey: Dima пишет: с Harbour такой фокус не проходит Имею в виду fopen(exename(),2) (fseek(),fwrite(),fclose()) Проходит. Берешь, делаешь в своей программе RENAME("test.exe","test_old.exe") а уж потом fopen("test.exe",2) (fseek(),fwrite(),fclose())

Dima: Andrey пишет: а уж потом fopen("test.exe",2) (fseek(),fwrite(),fclose()) скорее уж так ;) fopen("test_old.exe",2)

and3081: с этим решилось, даже переделывать обновление не пришлось, только добавил start и тот же батник и так отработал: start astr.exe @if errorlevel 44 obnov.bat Теперь другая проблема обнаружилась. Раньше (без gtwvt) вызов внешнего приложения, например, explorer, сразу открывало его в новом окне. swpruncmd() А теперь тоже открывается лишнее окно с заголовком C:\windows\system 32\cmd.exe. А поверх него окно с приложением (блокнот,explorer и т.п.). Отказываться от swpruncmd() ? UPDATE Если сделать swpruncmd("start приложение"), то лишнего окна нет. НО ! Тогда моя программа работает параллельно с открытым приложением. А надо, чтобы программа не работала, пока не завершишь приложение. Иначе клиент такого наворотит :)

Dima: and3081 пишет: swpruncmd() В Harbour её нет. Смотри тему http://clipper.borda.ru/?1-4-0-00000327-000-0-0-1365089161 я бы советовал (если нужно ждать окончания работы запущенного приложения) EXECANDWAIT если ждать не нужно hb_processrun , WAPI_ShellExecute

and3081: как же нет, когда все работает. #include blinker.ch и библу подключить contrib\hbblink\hbblink.hbc

Dima: and3081 пишет: как же нет, когда все работает Жесть , не знал Фактически там юзается Hb_run

Dima: and3081 пишет: А надо, чтобы программа не работала, пока не завершишь приложение EXECANDWAIT тебе нужен

petr707: and3081 пишет: start astr.exe @if errorlevel 44 obnov.bat Вряд ли теперь вторая строка батника (errorlevel) отработает, как ожидалось, поскольку не ждет завершения astr.exe

and3081: блин, почему у меня цитирование не работает :( to petr707 я же проверил, стаботало. Значит bat не закрылся. Щас еще раз проверю

and3081: Да, не работает, ну переделать не проблема

Sergy: and3081 пишет: UPDATE Если сделать swpruncmd("start приложение"), то лишнего окна нет. НО ! Тогда моя программа работает параллельно с открытым приложением. А надо, чтобы программа не работала, пока не завершишь приложение. Иначе клиент такого наворотит :) сделай RUN("start /w приложение") - будет ждать.

and3081: так тогда и окно лишнее открывается

Andrey: Функция с ожиданием: /////////////////////////////////////////////////////// FUNCTION WAITRUN( cRun ) Local hIn, hOut, nRet, hProc // "Launching process", cProc hProc := HB_OpenProcess( cRun , @hIn, @hOut, @hOut ) // "Reading output" // "Waiting for process termination" nRet := HB_ProcessValue( hProc ) FClose( hProc ) FClose( hIn ) FClose( hOut ) Return nRet

and3081: Экспериментирую EXECANDWAIT- для внешнего редактора работает. А для запуска "Explorer.exe файл.xml" - не ждет. И код возврата не 0, хотя сам explorer отрабатывает. Наверное, из-за того, что explorer передает файл другому приложению iexplore ? WAITRUN - тоже самое. Интересно, если возможен такой простой код, то зачем народ наворачивал на С EXECANDWAIT ? Кроме того в WAITRUN нет защиты от ошибки HB_OpenProcess( ). Если hProc вернул -1 (например не найден файл), то HB_ProcessValue( hProc ) упадет.

Andrey: and3081 пишет: Экспериментирую Вот еще так можно попробовать ! FUNCTION MAIN() LOCAL cFile SETCOLOR("15/1") CLEAR SCREEN cFile := CurDrive()+":"+DirName()+"\NOTEPAD.bat" ? "Запуск с ОЖИДАНИЕМ: EXECANDWAIT(", cFile,")" ? EXECANDWAIT(cFile) ? ? ? ? "Это сообщение не должно появится до завершения Notepad !" ? ? wait RETURN NIL ---------------notepad.BAT ------------------ @echo OFF echo . echo . echo =============== Вызов NOTEPAD.EXE ============================ echo . echo . notepad.exe echo . echo . echo =============== Вызов WinWord.EXE ============================ echo . echo . "C:\Program Files\Microsoft Office\OFFICE11\winword.exe" И еще попробуй функцию WAITRUNTERM() - поищи здесь на форуме....

and3081: Так это ничего не меняет. И без bat все запускается и ждет. Только explorer такой особенный. Придется смириться.

and3081: блииин, поставил клиентам вызов через start, ругается bad command... А что нужно ? Пути настроить ?

Dima: and3081 В Clipper я делал так swpruncmd(GetEnv("SYSTEMROOT")+"\system32\cmd.exe /c start " +TMMP+sysname+".htm") поковыряй ;)

and3081: нет, тут о другом. Для запуска программы, чтобы не было лишнего окна, мне посоветовали в батнике делать не astr.exe, а start astr.exe. У меня все работало, клиентам обновил батник- и часть клиентов пишут, что не запускается. Ужас

PSP: and3081 пишет: и часть клиентов пишут, что не запускается Ну подключись к ним TeamViewer-ом, посмотри.

and3081: причина оказалась в ярлыках. Пока ярлык на батник заново не создашь, он команду start не запускал.

Sergy: Использую для терминала GTWIN такую конструкцию: DeleteCloseButton(GetConsoleWindow()) где #pragma BEGINDUMP HB_FUNC( GETCONSOLEWINDOW ) { hb_retnl( (LONG)GetConsoleWindow( ) ) ; } HB_FUNC( DELETECLOSEBUTTON ) { DeleteMenu(GetSystemMenu( (HWND)hb_parnl( 1 ), FALSE), SC_CLOSE,MF_BYCOMMAND ) ; DrawMenuBar( (HWND)hb_parnl( 1 ) ); } #pragma ENDDUMP Под Win XP - вопросов не было. Убить приложение можно было только через диспетчер задач. С переходом на семерку - крестик окна серый, правой кнопкой мыши на заголовке окна - нет пункта "закрыть меню". НО!!! Не убирается пункт меню "закрыть окно" при нажатии в TaskBar правой кнопкой мыши... Где нужно подкрутить ?

azoo: Sergy, я использую команду: HB_gtInfo( 50, .F. ) Крестик не активен, пункт контекстного меню тоже не активен.

Sergy: azoo пишет: я использую команду: HB_gtInfo( 50, .F. ) Крестик не активен, пункт контекстного меню тоже не активен. #define HB_GTI_CLOSABLE 50 /* toggles ability to close window (supported by: GTWVT) */ Sergy пишет: Использую для терминала GTWIN такую конструкцию: DeleteCloseButton(GetConsoleWindow()) где Перешел уже на GTWVT. Разгребаю...

Dima: and3081 пишет: спасибо, HB_gtInfo( HB_GTI_CLOSABLE, .F. ) работает В последней версии с SVN Harbour , работало норм. В последних с Github не работает зараза. Пишу про WVT и WVG. Не понятно чего там могли сломать. Hbeditor тоже сломали по ходу. PS При чем HB_gtInfo(HB_GTI_RESIZABLE , .F.) работает



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