Пару месяцев не был здесь. Скачал новый релиз MiniGUI-Ext и обнаружил там мой старый пример использования Events в папочке \Samples\Basic\IncrementalSearch. Как пример выделения и обработки событий он годится, но для практического применения - нет. Обрабатывать локализованные символы (в т.ч. русские) в нём нельзя, кроме того функциональные клавиши порождают символы, что также мешает реальной работе. Мы обсуждали этот код в теме "MiniGUI-Browse- поиск по букве". Я его уже давно доработал и использую в своей программе и хочу предложить полный вариант свободный от недостатков. Я влил в обновлённый код доработки команды разработчиков MiniGUI-Ext, так что получилась полноценная замена IncrementalSearch. В модуле MyEvents.prg появилась функция KeyToChar(). Она хороша тем, что очень простая, читабельная и главное, легко локализуемая. Её можно сделать, как у меня, на два языка, а можно и на много.
REQUEST DBFCDX SET CENTURY ON SET DELETED ON // SET CODEPAGE TO RUSSIAN // Important for localize UPPER SET EVENTS FUNCTION TO MYEVENTS //
DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 640 HEIGHT 480 ; TITLE "MiniGUI Browse/Grid Incremental Search Demo" ; MAIN NOMAXIMIZE ; ON INIT OpenTables() ; ON RELEASE CloseTables()
DEFINE MAIN MENU POPUP 'File' ITEM 'Exit' ACTION Form_1.Release END POPUP POPUP 'Help' ITEM 'About' ACTION MsgInfo ("MiniGUI Browse/Grid Incremental Search Demo") END POPUP END MENU
DEFINE STATUSBAR STATUSITEM 'HMG Power Ready' END STATUSBAR
//------------------------------------------------------------------------------ Function GridHeadClick( nCol ) //------------------------------------------------------------------------------ Local i
For i:= 1 To 100 append blank Replace code with i Replace First With aRows[Random(20)][1] Replace Last With 'Last Name '+ Str(i) Replace Married With .t. replace birth with date()+i-10000 Next i
Index on str(Code,10) Tag "Code" To "Test" Index on upper(First) Tag "First" To "Test"
Use
Return
//------------------------------------------------------------------------------ Function Form1Event1( i, nVirtKey, cKey ) //------------------------------------------------------------------------------ LOCAL nLastRec := 1
Do Case Case nVirtKey == 46 // DEL *If _HMG_aControlPicture == .t. If MsgYesNo( _HMG_BRWLangMessage [1] , _HMG_BRWLangMessage [2] ) == .t. _BrowseDelete('','',i) EndIf *EndIf
Case nVirtKey == 36 // HOME _BrowseHome('','',i) cPressedKeys := "" Form_1.StatusBar.Item(1) := cSearchText Return 1
Case nVirtKey == 35 // END _BrowseEnd('','',i) cPressedKeys := "" Form_1.StatusBar.Item(1) := cSearchText Return 1
nLastRec := recno() if nSortColBrowse = 1 if ! dbseek( str(val(cPressedKeys), 10) ) go nLastRec endif elseif nSortColBrowse = 2 if ! dbseek( cPressedKeys ) go nLastRec endif endif Form_1.Browse_1.Value := recno() Return 1
EndCase
RETURN 0
//------------------------------------------------------------------------------ Function Form1Event2( i, nVirtKey, cKey ) //------------------------------------------------------------------------------ LOCAL nLastRec := 1, nFindElem := 0
Do Case Case nVirtKey == 36 // HOME _GridHome('','',i) cPressedKeys := "" Form_1.StatusBar.Item(1) := cSearchText Return 1
Case nVirtKey == 35 // END _GridEnd('','',i) cPressedKeys := "" Form_1.StatusBar.Item(1) := cSearchText Return 1
//------------------------------------------------------------------------------ FUNCTION MyEvents( hWnd, nMsg, wParam, lParam ) //------------------------------------------------------------------------------ LOCAL i, nVirtKey, cKey, Result := 0 LOCAL cFormName := "", cControlName := ""
if nMsg = WM_NOTIFY if GetNotifyCode( lParam ) = LVN_KEYDOWN
else Result := Events( hWnd, nMsg, wParam, lParam ) endif else Result := Events( hWnd, nMsg, wParam, lParam ) endif
RETURN Result
//------------------------------------------------------------------------------ Static Function KeyToChar( nVirtKey ) //------------------------------------------------------------------------------ LOCAL i, cRetChar := "" LOCAL nKeyboardMode := GetKeyboardMode() LOCAL lShift := CheckBit( GetKeyState( 16 ), 32768 ) LOCAL aKeysNumPad := { 96,97,98,99,100,101,102,103,104,105,106,107,109,110,111 } LOCAL cKeysNumPad := "0123456789*+-./" LOCAL aKeys1 := { 192,189,187,219,221,220,186,222,188,190,191 } LOCAL cKeys1US := "`-=[]\;',./" LOCAL cKeys1ShiftUS := '~_+{}|:"<>?' LOCAL cKeys1RU := "Ё-=ХЪ\ЖЭБЮ." LOCAL cKeys1ShiftRU := "Ё_+ХЪ/ЖЭБЮ," LOCAL cKeys2US := "1234567890QWERTYUIOPASDFGHJKLZXCVBNM " LOCAL cKeys2ShiftUS := "!@#$%^&*()QWERTYUIOPASDFGHJKLZXCVBNM " LOCAL cKeys2RU := "1234567890ЙЦУКЕНГШЩЗФЫВАПРОЛДЯЧСМИТЬ " LOCAL cKeys2ShiftRU := '!"№;%:?*()ЙЦУКЕНГШЩЗФЫВАПРОЛДЯЧСМИТЬ '
i := ascan( aKeysNumPad, nVirtKey ) if i > 0 RETURN substr( cKeysNumPad, i, 1 ) endif
i := ascan( aKeys1, nVirtKey ) if i > 0 if nKeyboardMode == 1033 // US if lShift cRetChar := substr( cKeys1ShiftUS, i, 1 ) else cRetChar := substr( cKeys1US, i, 1 ) endif elseif nKeyboardMode == 1049 // RU if lShift cRetChar := substr( cKeys1ShiftRU, i, 1 ) else cRetChar := substr( cKeys1RU, i, 1 ) endif endif RETURN cRetChar endif
i := at( chr( nVirtKey ), cKeys2US ) if i > 0 if nKeyboardMode == 1033 // US if lShift cRetChar := substr( cKeys2ShiftUS, i, 1 ) else cRetChar := substr( cKeys2US, i, 1 ) endif elseif nKeyboardMode == 1049 // RU if lShift cRetChar := substr( cKeys2ShiftRU, i, 1 ) else cRetChar := substr( cKeys2RU, i, 1 ) endif endif endif
хочу предложить полный вариант свободный от недостатков. Я влил в обновлённый код доработки команды разработчиков MiniGUI-Ext, так что получилась полноценная замена IncrementalSearch.
Большое спасибо! Обязательно включу это обновление в новый релиз
Все даты в формате GMT
3 час. Хитов сегодня: 2107
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет