Форум » GUI » PROGRESSBAR и INKEY .... » Ответить

PROGRESSBAR и INKEY ....

Andrey: Подскажите как задержка в INKEY() может влиять на показ PROGRESSBAR ? Просто непонятно как в МиниГуи делать бегунки.... Сделал отдельную програмку для просмотра бегунка и опытным методом вычислил, что если INKEY(0.5) - бегунок добегает до конца, а если меньше, то не добегает..... Мистика какая-то ! Или нельзя в МиниГуи пользоваться INKEY() ??? Пример здесь. Задержку в INKEY() - править в copy_file.ini -> параметр Delay_test = 0.? http://files.mail.ru/V0NJCQ

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

SergKis: Andrey пишет:Или нельзя в МиниГуи пользоваться INKEY() ??? Мы используем такую: [pre2] HB_FUNC( INKEYHMG ) { LONG TimeOut=0; if( ISNUM(1) ){ TimeOut = hb_parni(1); TimeOut = WaitForInputIdle( GetCurrentProcess(), (DWORD) TimeOut ); } hb_retni( TimeOut ); } [/pre2]

Andrey: SergKis пишет: Мы используем такую: Вставил к себе в программу: #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> HB_FUNC( INKEYHMG ) { LONG TimeOut=0; if( ISNUM(1) ){ TimeOut = hb_parni(1); TimeOut = WaitForInputIdle( GetCurrentProcess(), (DWORD) TimeOut ); } hb_retni( TimeOut ); } #pragma ENDDUMP Только теперь проект не собирается. Ошибка, нет функции: Error: Unresolved external '_ISNUM' referenced from W:\COPY_FILE_RUN1\COPY_FILE.OBJ Где взять ? А почему нет ТАКОЙ - INKEYHMG() функции в самом МиниГуи ?

SergKis: Andrey пишетОшибка, нет функции Нашел такие define, возможно ISNUM тоже [pre2] #ifdef __XHARBOUR__ #define HB_ISNIL( n ) ISNIL( n ) #define HB_ISCHAR( n ) ISCHAR( n ) #define HB_ISNUM( n ) ISNUM( n ) #define HB_ISLOG( n ) ISLOG( n ) #define HB_ISDATE( n ) ISDATE( n ) #define HB_ISBYREF( n ) ISBYREF( n ) #define HB_ISARRAY( n ) ISARRAY( n ) #endif [/pre2] Попробуй без ISNUM: [pre2] HB_FUNC( INKEYHMG ) { LONG TimeOut=0; /* if( ISNUM(1) ){ */ TimeOut = hb_parni(1); TimeOut = WaitForInputIdle( GetCurrentProcess(), (DWORD) TimeOut ); /* } */ hb_retni( TimeOut ); } [/pre2]


Andrey: Ерунда получается. Форма на экране запускается и тут же уходит. Промелькнула и все. Увеличил задержку Delay_test = 80 - тоже ерунда. А вообще программа раз на третий запускается ! Вообще стабильности нет.

SergKis: Andrey пишет:Ерунда получается Попробуй из hbwin.lib wapi_sleep(<dwMilliseconds>)

SergKis: Andrey пишет:Увеличил задержку Delay_test = 80 - тоже ерунда. А вообще программа раз на третий запускается ! Вообще стабильности нет. Это я был неправ, не дал пояснений и бегло глянул на пример (в нем нет реального копирования). InkeyHmg(<dwMilliseconds>) делает приостановку кода программы для обработки очереди сообщений, на время <dwMilliseconds>. Если очередь пуста, то приостановки нет, если очередь не успела обработаться, за указанное время, выполнение InkeyHmg прерывается и выполняется код программы дальше. Применение данной функции позволяет, например, снять программу по крестику. wapi_sleep(<dwMilliseconds>) делает приостановку кода программы, но очередь сообщений не обрабатывается (фактически окно не доступно - не управляется) и нельзя , например, снять программу по крестику !!! Пример:Test InkeyHmg

Dima: millisec() или hb_idleSleep() можно заюзать

SergKis: Dima пишет:hb_idleSleep() можно заюзать Можно (в параметре секунды), но очередь сообщений она не обрабатывает, т.е. длиная оперция COPY TO AAAA FOR {|| hb_IdleSleep(0.5), .T.} бесмыслена, а COPY TO AAAA FOR {|| InkeyHmg(100), .T.} не заморозит окно

fil: А это так надо в MiniGui чтоб End был до ACTIVATE ? ......................... END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1

SergKis: fil пишет: А это так надо в MiniGui чтоб End был до ACTIVATE ? см. i_window.ch там описания для препроцессора, ну и другие ch тоже, потом по функциям см. source miniGui. между DEFINE WINDOW ... END WINDOW находятся контролы

SergKis: Andrey если еще актуален аналог INKEY (как в 5.2) в MiniGui, то мои товарищ сделел Текст в примере http://zalil.ru/34015042

Andrey: SergKis пишет: Andrey если еще актуален аналог INKEY Конечно актуален. Спасибо БОЛЬШОЕ ! Буду пробовать.

Andrey: SergKis пишет: Andrey если еще актуален аналог INKEY (как в 5.2) в MiniGui, то мои товарищ сделел Функция СУПЕР ! Просто необходима. И в код добавляется очень просто. Буду пользоваться. Код программы здесь http://files.mail.ru/U8S0ZG Товарищу БОЛЬШОЕ СПАСИБО ! А Григорию предложение, может все таки добавить в МиниГуи эту функцию: INKEY_HMG() !

SergKis: Вот модифицированный код INKEY_HMG() ( с учетом клавиши Alt ), у себя мы переименовали в InkeyGui(...): [pre] 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 } } } [/pre]

Andrey: SergKis Спасибо БОЛЬШОЕ ! А сделайте лучше счет как в настоящем INKEY() ? А то путаница происходит INKEY() а счет на сотни идет, непорядок.... Только ограничение 0.01 убрать, чтобы можно было ставить типа 0.001 ?

SergKis: Andrey пишет: Только ограничение 0.01 убрать, чтобы можно было ставить типа 0.001 ? Реализация INKEY() сделана на функции создания виртуального таймера SetTimer( NULL, 0, uTimeout, NULL), которая через указанное время, посылает сообщение WM_TIMER в очередь сообщений: 1. сообщение WM_TIMER является низкоприоритетным 2. несмотря на указания интервалов времени в миллисекундах, реальная дискретность таймера определяется периодом прерываний, посылаемых таймером. Исходя из этого задержки с меньшим временем надо производить иначе, например используя функцию wapi_sleep(...), т.е. написать свою типа: [pre] FUNC ImkeyA(n) LOCAL i,k := 0 n := iif(n==NIL,0.001,n*1000) if n >= 100 k := InkeyGui(n) else wapi_sleep(n) endif Return k [/pre]

Andrey: Спасибо БОЛЬШОЕ ! Ан нет, ошибочку выдает... Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: Unresolved external '_HB_FUN_WAPI_SLEEP' referenced from W:\HB_PROJECT\UTIL_MINIGUI.OBJ Где взять эту функции в МиниГуи ?

Andrey: Объясните непонятному, может я что-то не так делаю... С главной формы тыкаю кнопочку: идет вызов моей функции StartFormCopy() FUNCTION StartFormCopy() Load Window StatusCopy StatusCopy.Center StatusCopy.Activate StartConvert() // сама обработка UpdateList2() // обновление списка файлов на форме RETURN Nil Сама форма построена IDE-дизайнером в отдельном файле StatusCopy.fmg Вот примерно его содержание: DEFINE WINDOW TEMPLATE AT 245 , 273 WIDTH 524 HEIGHT 233 TITLE "Пожалуйста подождите..." ICON "iProgramm" MODAL NOSYSMENU BACKCOLOR {255,255,255} DEFINE PROGRESSBAR Bar_1 ROW 40 COL 70 WIDTH 425 HEIGHT 44 RANGEMIN 1 RANGEMAX 10 END PROGRESSBAR .................. DEFINE PROGRESSBAR Bar_2 ROW 130 COL 70 WIDTH 425 HEIGHT 44 RANGEMIN 1 RANGEMAX 10 END PROGRESSBAR DEFINE IMAGE Image_2 ROW 125 COL 10 WIDTH 48 HEIGHT 48 PICTURE "iDBF" END IMAGE END WINDOW В функции StartConvert() // сама обработка происходит сама обработка, чтение директории, подсчет кол-ва файлов и показ бегунка ............... StatusCopy.Center StatusCopy.Image_1.Picture := "iCopyFile" StatusCopy.Bar_1.RangeMax := Len( ADir ) StatusCopy.Status1.Value := "Конвертируется файл 0 из " + AllTrim( Str( Len( ADir ) ) ) + " ..." FOR nI := 1 TO Len( ADir ) cFile := ADir[ nI, 1 ] StatusCopy.Bar_1.Value := nI StatusCopy.Status1.Value := "файл " + AllTrim( Str( nI ) ) + " из " + AllTrim( Str( Len( ADir ) ) ) + " ..." .............. // обработка NEXT StatusCopy.Bar_1.Value := StatusCopy.Bar_1.RangeMax StatusCopy.Bar_2.Value := StatusCopy.Bar_2.RangeMax StatusCopy.Status1.Value := "Конвертирование успешно завершено !" StatusCopy.Status2.Value := "Завершено " DO EVENTS InkeyGUI( 100 ) cText2 := "Проведено - файлов " + AllTrim( Str( nJ ) ) + " из " + AllTrim( Str( Len( ADir ) ) ) + " !" + Space( 20 ) + CLRW MsgInfo( cText2 + CLRW + cText + CLRW + CLRW, "Информация" ) cLogText += CLRW + cText2 + CLRW + cText + CLRW + CLRW IF nErr > 0 cText2 := "Не проведено - следующих файлов:" + Space( 20 ) + CLRW MsgStop( cText2 + CLRW + cTextErr + CLRW, "Информация" ) cLogText += cText2 + CLRW + cTextErr + CLRW ENDIF StatusCopy.Release() ENDIF ..... Так вот при нажатии на кнопку, форма с бегунком появляется и ВИСИТ !!! Где и в чем я не прав ?

Dima: Andrey пишет: Error: Unresolved external '_HB_FUN_WAPI_SLEEP Hbwin.lib прилинкуй

Andrey: Dima пишет: Hbwin.lib прилинкуй Не хотелось бы.. И так у меня не работает прога, еще и эту либу тащить нужно...



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