Автор | Сообщение |
|
| |
Пост N: 4326
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.12.14 16:59. Заголовок: Пара простых вопросов ;)
1. Как узнать что путь к папке из которой запускается программа имеет символы кирилицы ? На ум приходит такой способ proc main() local a REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) a:=curdir() ? a if hb_oemtoansi(a)#a ? "Есть кирилица" endif wait RETURN NIL Есть еще метода ? 2. Как узнать что путь к папке из которой запускается программа имеет длинные имена ? На вскидку приходит вариант разбить на токены с разделителем "\" и затем чекать длины всех токенов. Есть еще метода ?
|
|
|
Ответов - 85
, стр:
1
2
3
4
5
All
[только новые]
|
|
|
| |
Пост N: 4331
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.12.14 22:46. Заголовок: up..
up
|
|
|
|
| |
Пост N: 391
Зарегистрирован: 20.02.11
|
|
Отправлено: 10.12.14 23:34. Заголовок: Dima пишет: up 1 ..
Dima пишет: 1 проверить на ASC коды весь путь , если есть ASC кроме латинских то... 2 не помню на вскидку фенкцию ((( но есть точно - та что получает короткое имя и если есть в пути длинные - тто длинна будет разной и в короткой версии будет знак тильда
|
|
|
|
| |
Пост N: 4332
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.12.14 00:03. Заголовок: понял , затестю завт..
понял , затестю завтра. спасибо !
|
|
|
|
| |
Пост N: 393
Зарегистрирован: 20.02.11
|
|
Отправлено: 11.12.14 10:49. Заголовок: Dima пишет: не пом..
Dima пишет: цитата: | не помню на вскидку фенкцию |
| cShot := GETSHORTFILENAME( cLongName ) ============================================= #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( GETSHORTFILENAME ) { char pszReturn[ MAX_PATH ] ; pszReturn[0]= '\0' ; GetShortPathName( hb_parcx( 1 ), pszReturn, MAX_PATH - 1 ) ; hb_retc( pszReturn ) ;
|
|
|
|
| |
Пост N: 394
Зарегистрирован: 20.02.11
|
|
Отправлено: 11.12.14 11:03. Заголовок: Dima пишет: провери..
цитата: | проверить на ASC коды весь пут |
| Примерно так #require "hbxpp" #include "hbxpp.ch" FUNC Main( ... ) local n := 0 local cParh := "" local lFound := .F. REQUEST HB_CODEPAGE_RU1251 hb_cdpSelect( "RU1251" ) ? cPath := hb_argV(1) ? FOR n := 1 TO LEN(cPath) IF ASC(cPath[n]) > 127 lFound := .T. ? cPath[n] EXIT END END RETURN NIL
|
|
|
|
| |
Пост N: 4333
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.12.14 11:11. Заголовок: Игорь спасибо ! А та..
Игорь спасибо ! А такая проверка думаешь будет не правильной ? a:=curdir() ? a if hb_oemtoansi(a)#a ? "Есть кирилица" endif
|
|
|
|
| |
Пост N: 4334
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.12.14 11:35. Заголовок: Haz пишет: cShot :=..
Haz пишет: цитата: | cShot := GETSHORTFILENAME( cLongName ) |
| что то она пустую строку выдает proc main() ? GETSHORTFILENAME(curdir()) // пусто ? GETSHORTFILENAME() // пусто ? GETSHORTFILENAME("bla bla bla bla bla bla bla bla bla bla ") // пусто wait RETURN NIL *cShot := GETSHORTFILENAME( cLongName ) *============================================= #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( GETSHORTFILENAME ) { char pszReturn[ MAX_PATH ] ; pszReturn[0]= '\0' ; GetShortPathName( hb_parcx( 1 ), pszReturn, MAX_PATH - 1 ) ; hb_retc( pszReturn ) ; } #pragma ENDDUMP
|
|
|
|
| |
Пост N: 395
Зарегистрирован: 20.02.11
|
|
Отправлено: 11.12.14 11:36. Заголовок: Dima пишет: А такая..
Dima пишет: цитата: | А такая проверка думаешь будет не правильной ? |
| не проверял , но должна работать , возможно дольше на пару микросекунд из-за преобразования
|
|
|
|
| |
Пост N: 396
Зарегистрирован: 20.02.11
|
|
Отправлено: 11.12.14 11:42. Заголовок: Dima пишет: что то ..
Dima пишет: цитата: | что то она пустую строку выдает |
| у меня работает проверял так ? GetShotFilename( Exename() ) CurDir() - возвращаяет не имя файла попробуй Directory()[1][1] вот это точно ничего не покажет т.к. файла нет GETSHORTFILENAME("bla bla bla bla bla bla bla bla bla bla ")
|
|
|
|
| |
Пост N: 4335
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.12.14 11:45. Заголовок: Haz пишет: ? GetSho..
Haz пишет: цитата: | ? GetShotFilename( Exename() ) |
| OK. Понял. Если запустить из папки в имени которой есть кирилица то вернет пустую строку
|
|
|
|
| |
Пост N: 397
Зарегистрирован: 20.02.11
|
|
Отправлено: 11.12.14 12:20. Заголовок: Dima пишет: Если за..
Dima пишет: цитата: | Если запустить из папки в имени которой есть кирилица то вернет пустую строку |
| GetShotFilename( Exename() ) проверил - с кирилицей тож работает нормально отсюда запустил C:\Командировки\Документация>Ais_Zpto.exe во что выдало C:\C7BA~1\F63B~1\Ais_Zpto.exe
|
|
|
|
|
| |
Пост N: 4336
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.12.14 14:18. Заголовок: Ага. Это я кодовую с..
Ага. Это я кодовую страницу не указал. Если указать RU1251 - то все нормально Если указать RU866 - то тоже пусто Получается что обе проверки можно свести к одному условию. Если GetShortFilename( Exename() ) не равно Exename() то с путем что то не то.
|
|
|
|
| |
Пост N: 4337
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.12.14 16:08. Заголовок: Остановился на такой..
Остановился на такой проверке Func TestPath(cpath) local ret:=.t. local n FOR n=1 TO LEN(cPath) IF ASC(substr(cPath,n,1)) > 127 .or. ASC(substr(cPath,n,1))==32 ret:= .f. EXIT END next return ret
|
|
|
|
| |
Пост N: 398
Зарегистрирован: 20.02.11
|
|
Отправлено: 11.12.14 16:33. Заголовок: Dima пишет: Останов..
Dima пишет: цитата: | Остановился на такой проверке |
| Этот вариант проверяет наличие расширенных ASC кодов ( русские буквы ) , а зачем там == 32 ? Если для проверки длинного имени, то оно мжет быть и без пробелов Dima пишет: можно заменить на ASCPOS( cPath. n), хотя мне больше нравится вариант работы со строкой как с массивом cPath[n] а в чем вообще суть проблемы , чем тебе помешали русские буквы и длинные пути ?
|
|
|
|
| |
Пост N: 4338
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.12.14 16:37. Заголовок: Haz пишет: а в чем ..
Haz пишет: цитата: | а в чем вообще суть проблемы , чем тебе помешали русские буквы и длинные пути ? |
| а косяки возникают при приеме / передаче файлов на фтп из проги.
|
|
|
|
| |
Пост N: 4339
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.12.14 16:38. Заголовок: Haz пишет: со строк..
Haz пишет: цитата: | со строкой как с массивом cPath[n] |
| этот вариант у меня ошибку бьет. local a:="12345" ? a[3] //Error BASE/1068 Argument error: array access wait
|
|
|
|
| |
Пост N: 399
Зарегистрирован: 20.02.11
|
|
Отправлено: 11.12.14 16:44. Заголовок: Dima пишет: тот вар..
Dima пишет: цитата: | тот вариант у меня ошибку бьет. |
| нужно это #require "hbxpp" #include "hbxpp.ch" и это hbxpp.lib
|
|
|
|
| |
Пост N: 4340
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.12.14 16:53. Заголовок: Haz пишет: нужно эт..
Haz пишет: цитата: | нужно это #require "hbxpp" #include "hbxpp.ch" |
| Упс. Заработало.
|
|
|
|
| |
Пост N: 4355
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.12.14 16:20. Заголовок: еще простой вопрос ;..
еще простой вопрос ;) Есть ли такая функция , что бы вернула подстроку из строки , находящуюся между 2 - мя подстроками ? Например есть строка MN_20.3456.ZIP Нужно что типа вот такой фунции xxx("MN_20.3456.ZIP","MN_",".ZIP") // должна вернуть 20.3456 Понятно что можно сделать с помощью Substr,At,Rat.
|
|
|
|
| |
Пост N: 400
Зарегистрирован: 20.02.11
|
|
Отправлено: 14.12.14 18:55. Заголовок: Dima пишет: Понятно..
Dima пишет: цитата: | Понятно что можно сделать с помощью Substr,At,Rat. |
| может так ? cString := MN_20.3456.ZIP cRegExp := "MN_|\.ZIP" ? hb_RegExSplit( cRegExp , cString)[2]
|
|
|
|
| |
Пост N: 4356
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.12.14 19:05. Заголовок: Haz Спасибо мастеру..
Haz Спасибо мастеру по регулярным выражениям ! ;) Да так подойдет. Описания что то не нашел я на hb_RegExSplit , интересная функция.
|
|
|
|
|
| |
Пост N: 4357
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.12.14 19:18. Заголовок: Haz пишет: |..
Haz пишет: Игорь извини что дергаю в выходной. Что означает эта пара символов ?
|
|
|
|
| |
Пост N: 401
Зарегистрирован: 20.02.11
|
|
Отправлено: 14.12.14 19:35. Заголовок: Dima пишет: Что озн..
Dima пишет: цитата: | Что означает эта пара символов |
| | - это знак или \ - это модификатор который говорит что . ( точка ) не любой один символ а именно точка на счет мастера ты погорячился я сам их редко применяю и все время со шпаргалками hb_RegExSplit у Александра на сайте есть http://www.kresin.ru/hrbfaq_3.html#Doc9
|
|
|
|
| |
Пост N: 4358
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.12.14 19:52. Заголовок: OK. Спасибо..
OK. Спасибо
|
|
|
|
| |
Пост N: 4704
Зарегистрирован: 17.05.05
|
|
Отправлено: 09.04.15 21:44. Заголовок: В функции работающей..
В функции работающей(добавленной) через HB_IDLEADD() можно завершить работу основной программы через QUIT он же __Quit() . Попробовал тоже самое сделать в функции запущенной в отдельном потоке. Не получилось и QUIT просто заканчивает работу данного потока. Что логично. Вопрос: возможно ли из отдельного потока завершить работу основной программы ?
|
|
|
|
| moderator
|
Пост N: 907
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 09:30. Заголовок: Dima пишет: Вопрос:..
Dima пишет: цитата: | Вопрос: возможно ли из отдельного потока завершить работу основной программы ? |
| По-видимому, нельзя. Надо при необходимости отправить сообщение основному потоку ( через общую переменную, например ), ну а он и завершит.
|
|
|
|
| |
Пост N: 4706
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 10:39. Заголовок: alkresin пишет: ( ч..
alkresin пишет: цитата: | ( через общую переменную, например ), ну а он и завершит |
| Как тогда отслеживать эту переменную в основном потоке ? Повесить функцию через Hb_idleadd() или как то иначе ...
|
|
|
|
| |
Пост N: 444
Зарегистрирован: 08.07.06
|
|
Отправлено: 10.04.15 10:47. Заголовок: Как вариант - отслеж..
Как вариант - отслеживать наличие "нужного" потока (который посылает команду на завершение приложения). Как только он "кончился" - завершать основную программу.
|
|
|
|
| moderator
|
Пост N: 909
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 11:54. Заголовок: Dima пишет: Повесит..
Dima пишет: цитата: | Повесить функцию через Hb_idleadd() |
| В консоли - наверное, так. В GUI - таймеры есть.
|
|
|
|
| |
Пост N: 4709
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 13:25. Заголовок: alkresin пишет: В G..
alkresin пишет: Как в Минигуи например C:\MiniGUI\SOURCE\c_timer.c ? А его можно использовать в консоли ?
|
|
|
|
| moderator
|
Пост N: 912
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 13:37. Заголовок: А его можно использо..
цитата: | А его можно использовать в консоли ? |
| Вопрос интересный. Не знаю, как именно это сделано в Minigui и можно ли использовать тот код напрямую, но что-то свое на его основе написать можно.
|
|
|
|
|
| moderator
|
Пост N: 913
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 14:17. Заголовок: Попробовал сейчас, п..
Попробовал сейчас, получилось: Скрытый текст function main() local s := " " ANNOUNCE HB_GTSYS request HB_GT_WVT REQUEST HB_GT_WVT_DEFAULT #include "hbgtinfo.ch" hb_gtinfo( HB_GTI_FONTWIDTH, Int( hb_gtinfo( HB_GTI_DESKTOPWIDTH ) / 80 ) ) hb_gtinfo( HB_GTI_FONTSIZE, Int( ( hb_gtinfo( HB_GTI_DESKTOPHEIGHT ) - 64 ) / 25 ) ) hb_gtinfo( HB_GTI_CLOSABLE, .F. ) clear screen xxx_settimer( 1000 ) @ 1,1 GET s READ xxx_killtimer() return nil Function xxx_timerproc() static nn := 0 nn ++ @ 1,20 say str(nn) Return Nil #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HWND handle; void wrlog( const char * sFile, const char * sTraceMsg, ... ) { FILE *hFile; if( sFile == NULL ) { hFile = hb_fopen( "ac.log", "a" ); } else { hFile = hb_fopen( sFile, "a" ); } if( hFile ) { va_list ap; va_start( ap, sTraceMsg ); vfprintf( hFile, sTraceMsg, ap ); va_end( ap ); fclose( hFile ); } } static void CALLBACK s_timerProc( HWND hWnd, UINT message, UINT idTimer, DWORD dwTime ) { static PHB_DYNS s_pSymTest = NULL; HB_SYMBOL_UNUSED( message ); if( s_pSymTest == NULL ) s_pSymTest = hb_dynsymGetCase( "XXX_TIMERPROC" ); wrlog( NULL,"proc-1" ); if( hb_dynsymIsFunction( s_pSymTest ) ) { wrlog( NULL,"proc-2" ); hb_vmPushDynSym( s_pSymTest ); hb_vmPushNil(); hb_vmPushLong( ( LONG ) idTimer ); hb_vmPushLong( ( LONG ) dwTime ); hb_vmDo( 2 ); } } HB_FUNC( XXX_SETTIMER ) { handle = GetActiveWindow(); SetTimer( handle, 1001, ( UINT ) hb_parni( 1 ), s_timerProc ); } HB_FUNC( XXX_KILLTIMER ) { KillTimer( handle, 1001 ); } #pragma ENDDUMP
| Но это не работает с gtwin, т.к. там нет окна. Нужен gtwvt или что-то вроде этого.
|
|
|
|
| |
Пост N: 4710
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 14:22. Заголовок: Сейчас попробую. GTW..
Сейчас попробую. Да работает примерчик. Спасибо. GTWIN не использую. А я пробовал так. Срабатывает , но почему то однократно. Почему ? REQUEST HB_GT_WVT REQUEST HB_GT_WVG Proc main local hwnd cls hwnd:=GetForegroundWindow() INITTIMER(hwnd,"TEST",100,My_test()) wait KILLTIMER(hwnd,"TEST") return ****************** Func My_test() @ 3,2 say seconds() return nil ****************** #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> HB_FUNC (GETFOREGROUNDWINDOW) { HWND hWnd = GetForegroundWindow(); hb_retnl ((LONG) hWnd); } HB_FUNC( INITTIMER ) { hb_retl( SetTimer( ( HWND ) hb_parnl( 1 ), ( UINT ) hb_parni( 2 ), ( UINT ) hb_parni( 3 ), ( TIMERPROC ) NULL ) ); } HB_FUNC( KILLTIMER ) { KillTimer( ( HWND ) hb_parnl( 1 ), // handle of main window ( UINT ) hb_parni( 2 ) ); // timer identifier } #pragma ENDDUMP
|
|
|
|
| moderator
|
Пост N: 914
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 15:19. Заголовок: Таймер в в вашем при..
Таймер в в вашем примере не срабатывает ни разу, т.к. в inittimer() не определена callback процедура, NULL стоит. А один раз срабатывает my_test() при вызове initimer() - ему передается значение, возвращаемое my_test()
|
|
|
|
| |
Пост N: 4711
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 15:30. Заголовок: Вот так правильно бу..
Вот так правильно будет ? HB_FUNC( INITTIMER ) { hb_retl( SetTimer( ( HWND ) hb_parnl( 1 ), ( UINT ) hb_parni( 2 ), ( UINT ) hb_parni( 3 ), ( TIMERPROC ) hb_parni( 4 ) ) ); } В Си я конечно валенок ;)
|
|
|
|
| moderator
|
Пост N: 915
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 15:46. Заголовок: Dima пишет: Вот так..
Dima пишет: цитата: | Вот так правильно будет ? |
| Нет, конечно. Inittimer должен быть такой, как в моем примере. А если вы хотите передать процедуру обработки прерывания от таймера, то надо это делать на Harbour уровне - как в Hwgui, да и в Minigui, наверное, так же. Вам надо привязать эту процедуру, например, к id ( 2-й параметр в вызове settimer() ) - поместить в массив, например, соответсвующие id и кодоблок процедуры - а затем из callback-функции найти этот кодоблок по id и выполнить.
|
|
|
|
| |
Пост N: 4712
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 15:48. Заголовок: Has подсказал. Свая..
Has подсказал. Сваял примерчик , работает. Proc main REQUEST HB_GT_WVT cls Wvt_SetTimer( 2, 200) wait Wvt_KillTimer(2) return ************* Func WVT_TIMER() @ 10,0 say time() return .t.
|
|
|
|
| |
Пост N: 4713
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 17:09. Заголовок: alkresin Александр ..
alkresin Александр у меня вопрос. Функции xxx_settimer() , xxx_killtimer() , xxx_timerproc() или Wvt_SetTimer() , Wvt_KillTimer() , WVT_TIMER() это из той же оперы что и HB_IDLEADD() или это "родственники" потоков или что то еще ? Почему спрашиваю. Допустим есть функция которая была добавлена в HB_IDLEADD() и срабатывает каждые 200 мск да еще что то выводит на экран ("для крутости") , так вот в основной программе я получу тормоза. Если тоже самое сделать через поток , тормозов нет.
|
|
|
|
| moderator
|
Пост N: 916
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 19:17. Заголовок: Dima пишет: это из ..
Dima пишет: цитата: | это из той же оперы что и HB_IDLEADD() или это "родственники" потоков или что то еще ? |
| Что-то еще. Насколько я понимаю, считает время и организует прерывание отдельный системный процесс, а обрабатывается это прерывание во время idle state. цитата: | Допустим есть функция которая была добавлена в HB_IDLEADD() и срабатывает каждые 200 мск да еще что то выводит на экран ("для крутости") , так вот в основной программе я получу тормоза. |
| Возможно, проблема в реализации этой функции, может, ее надо реже вызывать.
|
|
|
|
| |
Пост N: 4714
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 21:27. Заголовок: alkresin пишет: Воз..
alkresin пишет: цитата: | Возможно, проблема в реализации этой функции |
| Так и есть , мой косяк. Спасибо за подсказку
|
|
|
|
| |
Пост N: 4733
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.04.15 22:34. Заголовок: В программе стоит та..
В программе стоит такой вызов FT_OnTick({|| TEST()},500) // срабатывание TEST каждые 30 секунд Функция TEST опрашивает некую базу и в случае обнаружения в одном из полей значения .T. вываливает на экран какое то сообщение. Пока сообщение висит прога кушает примерно 25 % ресурсов проца. Можно эту проблему победить что бы не "жрало" столько ресурсов ? Пробовал перед выводом сообщения вешать FT_OnTick() а после закрытия сообщения FT_OnTick({|| TEST()},500) , не помогло. PS FT_OnTick это из HBNF и реализован c помощью Hb_idleadd , Hb_idleDel PS1 В Clipper такой же аналог не приводил к загрузке проца.
|
|
|
|
|
| постоянный участник
|
Пост N: 578
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.04.15 07:42. Заголовок: Dima если использов..
Dima если использовать не idle, а on timer и сообщение вешать в потоке ?
|
|
|
|
| |
Пост N: 4734
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.04.15 08:27. Заголовок: SergKis С потоком н..
SergKis С потоком нельзя. Работаю с ADS. Лет 5 назад проводил тесты , падает прога в разных потоках при работе с ADS , при чем непредсказуемо. В принципе есть исходник OnTick.c из Nanfor for Clipper https://searchcode.com/codesearch/view/4467408/ Может его можно как то под Harbour переписать ?
|
|
|
|
| постоянный участник
|
Пост N: 580
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.04.15 08:31. Заголовок: Dima пишет:С потоком..
Dima пишет: тогда используй отдельный запуск - монитор опроса (можно использовать приоритет задания) и сообщением в tray
|
|
|
|
| |
Пост N: 4735
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.04.15 09:00. Заголовок: SergKis Кажется пон..
SergKis Кажется понял почему такая загрузка. Дело в INKEY. Попробовал твою функцию INKEYGUI и кажется загрузки нет. Счас потестю.
|
|
|
|
| постоянный участник
|
Пост N: 581
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.04.15 09:35. Заголовок: Dima пишет: Дело в I..
Dima пишет: ну да, inkey "морозит" обработку сообщений, InkeyGui - обрабатывае очередь и выделяет нажатия клавишь, но в wvt использовать, даже не подумал
|
|
|
|
| |
Пост N: 4736
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.04.15 10:05. Заголовок: SergKis В общем да ..
SergKis В общем да нормально , не тормозит ни чего но вылезла новая проблема. В функции TEST что выше писал которая сидит в IDLE вызывается MEMOEDIT на просмотр (без редактирования) memoedit(prime,11,21,18,59,.f.,"k2mmem_ff_prm",38) ......... ......... Функция обработки педалей Если в ней юзать INKEY , текст сообщения я вижу сразу , но грузит проц. Если вместо нее юзать INKEYGUI(100) , проц не грузит но не вижу сообщения , пока какую то кнопку не нажму. func k2mmem_ff_prm() local nxkey:=0 local local_time:=seconds() do while (nxkey:=INKEY(0.01))==0 if seconds()-local_time>10 TestKillUser() local_time:=seconds() endif enddo if nxkey==27 ft_putkey(nxkey) endif return 0 До кучи. Вставил в свой бровс вместо nkey:=inkey(0.01) -> nkey:=inkeygui(100) и функция пользователя больше не реагирует на функциональные клавиши. Enter обрабатывается.
|
|
|
|
| постоянный участник
|
Пост N: 582
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.04.15 10:32. Заголовок: Dima сравни коды nk..
Dima сравни коды nkey после инкеев в gui VK_..., если правильно помню ...
|
|
|
|
| постоянный участник
|
Пост N: 583
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.04.15 10:35. Заголовок: PS ? 'test'..
PS ? 'test' inkeygui(3000) видно или как ?
|
|
|
|
| |
Пост N: 4737
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.04.15 10:47. Заголовок: Да ESC , ENTER , Про..
Да ESC , ENTER , Пробел совпадают , функциональные нет , насчет буквенно цифровых не проверял.
|
|
|
|
| |
Пост N: 4738
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.04.15 10:51. Заголовок: SergKis пишет: ? ..
SergKis пишет: цитата: | ? 'test' inkeygui(3000) видно или как ? |
| Видно
|
|
|
|
| |
Пост N: 4739
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.04.15 10:59. Заголовок: Кажется понял чего н..
Кажется понял чего надо. Нужен переходник из кодов INKEYGUI в обычные не расширенные коды INKEY. При чем с учетом раскладки клавы. Вопрос как это без напряга сделать !
|
|
|
|
| постоянный участник
|
Пост N: 585
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.04.15 11:06. Заголовок: Dima пишетНужен пере..
Dima пишет цитата: | Нужен переходник из кодов INKEYGUI |
| где то видел, но непомню и заменяя inkey, inkeygui - аналог inkey clipper 5.2e и еще мышь не отрабатывает
|
|
|
|
| |
Пост N: 4740
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.04.15 11:11. Заголовок: Странно что в самом ..
Странно что в самом Harbour нет аналога типа INKEYIDLE , потому как если опрашивать клаву в IDLE фоновой задачи ( НЕ в потоке ), c помощью INKEY то грузит проц. Если в основном потоке идет опрос с помощью INKEY , проц не грузит.
|
|
|
|
| постоянный участник
|
Пост N: 1056
Зарегистрирован: 27.01.07
|
|
Отправлено: 16.04.15 11:26. Заголовок: Использовать в цикле..
Использовать в цикле hb_ReleaseCPU() не подойдет?
|
|
|
|
| |
Пост N: 4741
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.04.15 11:33. Заголовок: PSP пишет: Использо..
|
|
|
|
| постоянный участник
|
Пост N: 587
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.04.15 12:51. Заголовок: Dima мой товарищь п..
Dima мой товарищь посоветовал делать так: nKey := InkeyGui( ... ) nKey подать в hb_gt_wvt_Info(...) gtwwt.c добавить свою константу в case static BOOL hb_gt_wvt_Info( PHB_GT pGT, int iType, PHB_GT_INFO pInfo ) например case HB_GTI_VK_TO_INKEY используя hb_gt_wvt_KeyEvent(...) в которой hb_gt_wvt_TranslateKey(...) произвести перекодировку но надо пересобрать gtwwt.obj
|
|
|
|
| |
Пост N: 4742
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.04.15 13:10. Заголовок: SergKis Спасибо ! Д..
SergKis Спасибо ! Думал есть способ проще , без переделки сырцов. Попробую.
|
|
|
|
| постоянный участник
|
Пост N: 589
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.04.15 14:48. Заголовок: Dima пишет:Думал ест..
Dima пишет: цитата: | Думал есть способ проще , без переделки сырцов |
| вытащить из gtwvt.c эти функции (они static), сделать не static, переименовать ... повторить все - вряд ли это проще
|
|
|
|
| |
Пост N: 4744
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.04.15 13:22. Заголовок: В сишный код я точно..
В сишный код я точно не полезу , так как должен понимать что делаю.
|
|
|
|
| |
Пост N: 4745
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.04.15 14:57. Заголовок: SergKis А можете не..
|
|
|
|
| |
Пост N: 4746
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.04.15 16:50. Заголовок: Почти победил преобр..
Почти победил преобразование VK кодов , но с кирилицей фигня полная. Что не так сделал ? Собирал так c:\hb32\bin\hbmk2 t -gtwvt -gui #include "hbgtinfo.ch" proc main local a REQUEST HB_GT_WVT_DEFAULT REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) hb_gtInfo(HB_GTI_FONTNAME, 'Lucida Console') ? "TEST" do while (a:=inkeygui(0))#27 ? a ? chr(toasciiex(a)) enddo return ************************* #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #include "hbapiitm.h" HB_FUNC( TOASCIIEX ) { HKL hkl = GetKeyboardLayout( 0 ); BYTE KeyState[256]; WORD lpChar; GetKeyboardState( KeyState ); ToAsciiEx( hb_parnl(1), 0, KeyState, &lpChar, 0, hkl ); hb_retnl( LOBYTE( lpChar )); } #pragma ENDDUMP #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> HB_FUNC( INKEYGUI ) { MSG Msg; BOOL lNoLoop=FALSE; UINT dwTimer, nRet=0, uTimeout=10; if( HB_ISNUM(1) ) uTimeout = hb_parni(1); if( uTimeout==0 ) uTimeout = 0x0FFFFFFF; dwTimer = SetTimer( NULL, 0, uTimeout, NULL); while( GetMessage(&Msg, NULL, 0, 0) ) { switch( Msg.message ) { case WM_KEYDOWN : case WM_SYSKEYDOWN : { nRet = Msg.wParam; lNoLoop = TRUE; break; } case WM_TIMER : { lNoLoop = Msg.wParam == dwTimer; break; } } if( lNoLoop ) { KillTimer( NULL, dwTimer ); hb_retni( nRet ); return ; } else { TranslateMessage( &Msg ); // Translates virtual key codes DispatchMessage( &Msg ); // Dispatches message to window } } } #pragma ENDDUMP
|
|
|
|
| |
Пост N: 4747
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.04.15 16:53. Заголовок: Упс , понял , надо т..
Упс , понял , надо так ? hb_ansitooem(chr(toasciiex(a)))
|
|
|
|
| постоянный участник
|
Пост N: 598
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.04.15 20:04. Заголовок: Dima пишет:Упс , пон..
Dima пишет: и что ? получилось ?
|
|
|
|
| |
Пост N: 4748
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.04.15 20:16. Заголовок: SergKis пишет: и чт..
SergKis пишет: Практически да , допиливаю пока.
|
|
|
|
| |
Пост N: 4749
Зарегистрирован: 17.05.05
|
|
Отправлено: 18.04.15 09:18. Заголовок: SergKis А вот такой..
SergKis А вот такой фокус похоже не работает. Keyboard chr(112) ? inkeygui() // ни какой реакции на посыл кода через Keyboard
|
|
|
|
| постоянный участник
|
Пост N: 600
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.04.15 10:13. Заголовок: Dima в wvt соорудил..
Dima в wvt соорудили перекодировку (см.функции выше ..event..1) VK клавиш цитата: | ни какой реакции на посыл кода через Keyboard |
| возможно надо использовать сообщение WM_COPYDATA, типа Keyboard посылает а в inkeygui вставить обработку
|
|
|
|
| |
Пост N: 4754
Зарегистрирован: 17.05.05
|
|
Отправлено: 19.04.15 21:23. Заголовок: PSP пишет: Использ..
PSP пишет: цитата: | Использовать в цикле hb_ReleaseCPU() не подойдет? |
| Таки да Если в основном потоке клаву опрашивать так , nkey:=Inkey(0.01) , проц не грузит. Если так же ее опрашивать в IDLE функции живущей в HB_IdleAdd() , то да грузит проц. Долго игрался и доигрался В IDLE опрашивать надо так nKey:=Inkey() hb_releasecpu() * ни чего грузит и все пучком.
|
|
|
|
| постоянный участник
|
Пост N: 1059
Зарегистрирован: 27.01.07
|
|
Отправлено: 19.04.15 21:29. Заголовок: Ну да, именно так ))..
Ну да, именно так )))
|
|
|
|
| |
Пост N: 4755
Зарегистрирован: 17.05.05
|
|
Отправлено: 19.04.15 21:33. Заголовок: PSP пишет: Ну да, и..
PSP пишет: Нет что б сразу сказать подробнее ))) 2 дня убил да еще мучал InkeyGui (с ним тоже вариант , но функция специфическая)
|
|
|
|
| постоянный участник
|
Пост N: 1060
Зарегистрирован: 27.01.07
|
|
Отправлено: 19.04.15 22:07. Заголовок: Я ж не знал... ))..
Я ж не знал ) А ты написал, что уже пробовал... ))
|
|
|
|
| |
Пост N: 5468
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.01.16 16:42. Заголовок: Можно ли в вызываемо..
Можно ли в вызываемой функции узнать , она была вызвана из основного потока или дочернего ? ЗЫ MT приложение. Проехали , нашел. hb_threadSelf()
|
|
|
|
| moderator
|
Пост N: 963
Зарегистрирован: 06.07.06
|
|
Отправлено: 25.01.16 13:21. Заголовок: pThID := hb_threadSe..
pThID := hb_threadSelf() Возвращает указатель потока, из которого вызывается эта функция.
|
|
|
|
| |
Пост N: 5607
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.04.16 17:04. Заголовок: Почему есть функции ..
Почему есть функции HB_LEFTEQ() и HB_LEFTEQI() (удобнее чем LEFT()) а подобных аналогов c RIGHT нет ?
|
|
|
|
| постоянный участник
|
Пост N: 1188
Зарегистрирован: 09.10.06
|
|
Отправлено: 17.04.16 18:21. Заголовок: В ChangeLog логика..
В ChangeLog логика HB_LEFT* ясно описана + added new function to replace "=" operator without the SET EXACT ambiguity in its most common pattern of usage: hb_LeftEq( <cString1>, <cString2> ) -> <lResult> it's equivalent to this expression, but faster and shorter: ( Left( <cString1>, Len( <cString2> ) ) == <cString2> ) 2014-01-22 03:09 UTC+0100 Viktor Szakáts + added hb_LeftEqI(). Same as hb_LeftEq() but case-insensitive. hb_LeftEqI( <cString1>, <cString2> ) -> <lResult> 2014-02-04 13:38 UTC+0100 Viktor Szakáts Ну а RIGHT, наверное, так часто не пользуются
|
|
|
|
| |
Пост N: 5608
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.04.16 21:16. Заголовок: Петр пишет: Ну а RI..
Петр пишет: цитата: | Ну а RIGHT, наверное, так часто не пользуются |
| Да наверное так и есть. PRG аналоги могли бы быть примерно такими Func Hb_rightEQI(Cstr1 , Cstr2) return Iif (Hb_isstring(Cstr1) .and. Hb_isstring(Cstr1) ; .and. Right(upper(Cstr1),len(Cstr2))==Upper(Cstr2),.T.,.F.) Примерно так же Hb_rightEQ , но без Upper или можно было сделать единую функцию Hb_right() с 3-м параметром.
|
|
|
|
| |
Пост N: 5671
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.05.16 21:33. Заголовок: Посетила меня идея ,..
Посетила меня идея , организовать в своей сетевой задаче просмотр экрана другого юзера , для начала только скрин , в перспективе "видео" (показ тех же скринов с задержкой). Реализация думаю не очень сложная и решу. Есть пара вопросов ( Терминал GTWVT (WVG) ) 1. Как средствами Harbour снять скрин окна с нужным заголовком и сохранить в файл формата JPG скажем. 2. -\\-\\-\\\-\\- cнять скрин всего рабочего стола со всеми окнами и -\\-\\-\\\-\\-
|
|
|
|
| постоянный участник
|
Пост N: 4953
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.05.16 01:11. Заголовок: Dima пишет: экрана ..
Dima пишет: цитата: | экрана другого юзера , для начала только скрин |
| Давай уж сразу на МиниГуи ! Тем более там уже реализовано снятие всего экрана ! Не помню какой пример, но точно сам видел !
|
|
|
|
| |
Пост N: 187
Зарегистрирован: 21.04.13
|
|
Отправлено: 25.05.16 07:21. Заголовок: ScreenshotMaker
есть такой пример..\MiniGUI\SAMPLES\Applications\ScreenshotMaker портируется и в harbour, из примера нужно взять JPG.DLL = = = DYNAMIC SaveToJpgEx ... Function SnapJpg(cSaveFile,cfile_dll) Local nW := HB_GTINFO( HB_GTI_DESKTOPWIDTH ) Local nH := HB_GTINFO( HB_GTI_DESKTOPHEIGHT ) Local nHandle := GETDESKTOPWINDOW() Local ret := .f. cfile_dll := IIF(cfile_dll=NIL,"jpg.dll",cfile_dll) if file(cfile_dll) cSaveFile := IIF( cSaveFile=NIL, "test.jpg" ,cSaveFile) Calldll32( "SaveToJpgEx",cfile_dll, nHandle, cSaveFile, nW, nH ) ret:=file(cSaveFile) else tolog("SnapJpG: Нет файла DLL {"+cfile_dll+"} ") ret:=.f. endif Return ret
|
|
|
|
| |
Пост N: 5673
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.05.16 13:33. Заголовок: petr707 Спасибо за ..
petr707 Спасибо за идею , работает. #include "hbgtinfo.ch" #include "hbdyn.ch" Proc main REQUEST HB_GT_WVT REQUEST HB_GT_WVG_DEFAULT ? " " ? snapJpg(CurDrive()+":\"+CurDir()+"\test.jpg",0) wait return ********************* Func SnapJpg(cfile,nmode) Local nW Local nH Local nHandle hb_default(@nmode,0) hb_default(@cfile,"test.jpg") if nmode==0 nHandle := wapi_GETDESKTOPWINDOW() nW := HB_GTINFO( HB_GTI_DESKTOPWIDTH ) nH := HB_GTINFO( HB_GTI_DESKTOPHEIGHT ) else nHandle := GETFOREGROUNDWINDOW() nw := HB_GTINFO( HB_GTI_SCREENWIDTH ) nh := HB_GTINFO( HB_GTI_SCREENHEIGHT ) endif hb_DynCall( { "SaveToJpgEx", "jpg.dll",HB_DYN_CALLCONV_STDCALL },nHandle,cfile,nw,nh ) return HB_fileexists(cfile) ***************** #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> HB_FUNC (GETFOREGROUNDWINDOW) { HWND hWnd = GetForegroundWindow(); hb_retnl ((LONG) hWnd); } #pragma ENDDUMP
|
|
|
|
| |
Пост N: 5674
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.05.16 21:32. Заголовок: Dima пишет: petr707..
Dima пишет: цитата: | petr707 Спасибо за идею , работает. |
| Я так понял что снять скриншот окна по хендлу не получится если окно свернуто , или можно ? PS Можно конечно проверить если свернуто то развернуть , снять скрин и снова свернуть...
|
|
|
|
| |
Пост N: 188
Зарегистрирован: 21.04.13
|
|
Отправлено: 25.05.16 22:21. Заголовок: Не, не надо проверять и свертывать..
Просто поднять окно..чтоб юзер помнил , что у него есть задача .. и не спал и не отвлекался на непрофильное..
|
|
|
|
| |
Пост N: 5675
Зарегистрирован: 17.05.05
|
|
Отправлено: 25.05.16 23:00. Заголовок: petr707 Вариант , с..
petr707 Вариант , спасибо !
|
|
|
|
| |
Пост N: 319
Зарегистрирован: 05.11.05
|
|
Отправлено: 27.04.21 16:51. Заголовок: А есть функция переи..
А есть функция переименовать папку (с файлами внутри)?
|
|
|
|
| |
Пост N: 7330
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.04.21 18:48. Заголовок: rvu Самопал придетс..
rvu Самопал придется писать...
|
|
|
Ответов - 85
, стр:
1
2
3
4
5
All
[только новые]
|
|