А вот и второй.
/*
* MINIGUI - Harbour Win32 GUI library Demo
*
* Copyright 2002 Roberto Lopez <harbourminigui@gmail.com>
*
http://harbourminigui.googlepages.com/ */
#include "minigui.ch"
#include "Dbstruct.ch"
Function Main
Private aRows [20] [3]
Private nSortColBrowse := 1, nSortColGrid := 1, cSearchText := "", cPressedKeys := ""
REQUEST DBFCDX , DBFFPT
SET CENTURY ON
SET DELETED ON
//------------------------------------------------------------------------------
SET CODEPAGE TO RUSSIAN // Very important for UPPER()
SET EVENTS FUNCTION TO MYEVENTS
//------------------------------------------------------------------------------
DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 640 HEIGHT 480 ;
TITLE "MiniGUI Browse/Grid ColumnSearch 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 ColumnSearch Demo")
END POPUP
END MENU
DEFINE STATUSBAR
STATUSITEM 'HMG Power Ready'
END STATUSBAR
@ 10,10 BROWSE Browse_1 ;
WIDTH 610 ;
HEIGHT 200 ;
HEADERS { 'Code' , 'First Name' , 'Last Name', 'Birth Date', 'Married' , 'Biography' } ;
WIDTHS { 100 , 150 , 150 , 150 , 150 } ;
WORKAREA Test ;
FIELDS { 'Test->Code' , 'Test->First' , 'Test->Last' , 'Test->Birth' , 'Test->Married' } ;
VALUE 1 ;
JUSTIFY { BROWSE_JTFY_RIGHT, BROWSE_JTFY_CENTER, BROWSE_JTFY_CENTER, ;
BROWSE_JTFY_CENTER, BROWSE_JTFY_CENTER } ;
ON HEADCLICK { {|| BrowseHeadClick(1)}, {|| BrowseHeadClick(2)}, , , } ;
ON GOTFOCUS {|| BrowseHeadClick( nSortColBrowse ) }
aRows [1] := {'Simpson','Homer','555-5555'}
aRows [2] := {'Петров','Иван','324-6432'}
aRows [3] := {'Smart','Max','432-5892'}
aRows [4] := {'Иванов','Андрей','894-2332'}
aRows [5] := {'Русский','James','346-9873'}
aRows [6] := {'Сидоров','Сергей','394-9654'}
aRows [7] := {'Flanders','Ned','435-3211'}
aRows [8] := {'Калугина','Анна','123-1234'}
aRows [9] := {'Pedemonti','Flavio','000-0000'}
aRows [10] := {'Gomez','Juan','583-4832'}
aRows [11] := {'Попова','Ирина','321-4332'}
aRows [12] := {'Borges','Javier','326-9430'}
aRows [13] := {'Альварес','Alberto','543-7898'}
aRows [14] := {'Гонсалес','Ольга','437-8473'}
aRows [15] := {'Batistuta','Gol','485-2843'}
aRows [16] := {'Vinazzi','Amigo','394-5983'}
aRows [17] := {'Котлов','Flavio','534-7984'}
aRows [18] := {'Ладыко','Геннадий','854-7873'}
aRows [19] := {'Теплицын','Alejandra','???-????'}
aRows [20] := {'Reyes','Monica','432-5836'}
@ 220,10 GRID Grid_1 ;
WIDTH 610 ;
HEIGHT 170 ;
HEADERS {'Column 1','Column 2','Column 3'} ;
WIDTHS {140,140,140} ;
ITEMS aRows ;
ON HEADCLICK { {|| GridHeadClick(1)}, {|| GridHeadClick(2)}, } ;
ON GOTFOCUS {|| GridHeadClick( nSortColGrid ) }
END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
Return Nil
Function BrowseHeadClick( nCol )
if nCol = 1
set order to tag "Code"
nSortColBrowse := 1
cPressedKeys := ""
cSearchText := "Sort&Search by < " + "Code" + " >: "
Form_1.Browse_1.Header( 1 ) := 'Code ' +chr(94)
Form_1.Browse_1.Header( 2 ) := 'First Name ' +chr(45)
elseif nCol = 2
set order to tag "First"
nSortColBrowse := 2
cPressedKeys := ""
cSearchText := "Sort&Search by < " + "First Name" + " >: "
Form_1.Browse_1.Header( 1 ) := 'Code ' +chr(45)
Form_1.Browse_1.Header( 2 ) := 'First Name ' +chr(94)
endif
Form_1.Browse_1.Refresh
Form_1.StatusBar.Item(1) := cSearchText
Return Nil
Function GridHeadClick( nCol )
Local i
if nCol = 1
aRows := asort( aRows,,, { |x, y| x[1] < y[1] } )
// Must be Refresh
for i = 1 to len( aRows )
Form_1.Grid_1.Item( i ) := aRows[ i ]
next
nSortColGrid := 1
cPressedKeys := ""
cSearchText := "Sort&Search by < " + "Column 1" + " >: "
Form_1.Grid_1.Header( 1 ) := 'Column 1 ' +chr(94)
Form_1.Grid_1.Header( 2 ) := 'Column 2 ' +chr(45)
elseif nCol = 2
aRows := asort( aRows,,, { |x, y| x[2] < y[2] } )
// Must be Refresh
for i = 1 to len( aRows )
Form_1.Grid_1.Item( i ) := aRows[ i ]
next
nSortColGrid := 2
cPressedKeys := ""
cSearchText := "Sort&Search by < " + "Column 2" + " >: "
Form_1.Grid_1.Header( 1 ) := 'Column 1 ' +chr(45)
Form_1.Grid_1.Header( 2 ) := 'Column 2 ' +chr(94)
endif
Form_1.Grid_1.Value := if( Form_1.Grid_1.Value = 0, 1, Form_1.Grid_1.Value )
Form_1.StatusBar.Item(1) := cSearchText
Return Nil
Procedure OpenTables()
if !file("test.dbf")
CreateTable()
endif
Use Test index Test Via "DBFCDX"
set order to tag "Code"
Go Top
Form_1.Browse_1.Value := RecNo()
BrowseHeadClick( 1 )
Return
Procedure CloseTables()
Use
Return
Procedure CreateTable
LOCAL aDbf[5][4]
aDbf[1][ DBS_NAME ] := "Code"
aDbf[1][ DBS_TYPE ] := "Numeric"
aDbf[1][ DBS_LEN ] := 10
aDbf[1][ DBS_DEC ] := 0
//
aDbf[2][ DBS_NAME ] := "First"
aDbf[2][ DBS_TYPE ] := "Character"
aDbf[2][ DBS_LEN ] := 25
aDbf[2][ DBS_DEC ] := 0
//
aDbf[3][ DBS_NAME ] := "Last"
aDbf[3][ DBS_TYPE ] := "Character"
aDbf[3][ DBS_LEN ] := 25
aDbf[3][ DBS_DEC ] := 0
//
aDbf[4][ DBS_NAME ] := "Married"
aDbf[4][ DBS_TYPE ] := "Logical"
aDbf[4][ DBS_LEN ] := 1
aDbf[4][ DBS_DEC ] := 0
//
aDbf[5][ DBS_NAME ] := "Birth"
aDbf[5][ DBS_TYPE ] := "Date"
aDbf[5][ DBS_LEN ] := 8
aDbf[5][ DBS_DEC ] := 0
//
DBCREATE("Test", aDbf, "DBFCDX")
Use test Via "DBFCDX"
zap
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
//------------------------------------------------------------------------------
#DEFINE NATION_CHARS ;
"`1234567890-=\~!@#$%^&*()_+/.,|QWERTYUIOPASDFGHJKLZXCVBNMЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ"
//------------------------------------------------------------------------------
Function Form1Event1( i, lParam )
//------------------------------------------------------------------------------
Local nLastRec := 1
Local nVirtKey := GetGridvKey( lParam )
Do Case
/*
Case nVirtKey == 65 // A
if GetAltState() == -127 .or. GetAltState() == -128 // ALT
if _HMG_acontrolmiscdata1
[2] == .T.
_BrowseEdit ( _hmg_acontrolhandles , _HMG_acontrolmiscdata1 [4] ,;
_HMG_acontrolmiscdata1 [5] , _HMG_acontrolmiscdata1 [3] ,;
_HMG_aControlInputMask , .t. , _HMG_aControlFontColor )
EndIf
EndIf
*/
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
Case nVirtKey == 33 // PGUP
_BrowsePrior('','',i)
cPressedKeys := ""
Form_1.StatusBar.Item(1) := cSearchText
Return 1
Case nVirtKey == 34 // PGDN
_BrowseNext('','',i)
cPressedKeys := ""
Form_1.StatusBar.Item(1) := cSearchText
Return 1
Case nVirtKey == 38 // UP
_BrowseUp('','',i)
cPressedKeys := ""
Form_1.StatusBar.Item(1) := cSearchText
Return 1
Case nVirtKey == 40 // DOWN
_BrowseDown('','',i)
cPressedKeys := ""
Form_1.StatusBar.Item(1) := cSearchText
Return 1
Case ( Upper( chr( ToAsciiEx(nVirtKey) ) ) $ NATION_CHARS ) .or. nVirtKey = 8
if nVirtKey = 8 // BackSpace
cPressedKeys := left( cPressedKeys, len(cPressedKeys)-1 )
else
cPressedKeys := cPressedKeys + Upper( chr( ToAsciiEx(nVirtKey) ) )
endif
Form_1.StatusBar.Item(1) := cSearchText + cPressedKeys
nLastRec := recno()
*if lSearchFromTop
go top
*endif
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
Otherwise
cPressedKeys := ""
Form_1.StatusBar.Item(1) := cSearchText
EndCase
RETURN 0
//------------------------------------------------------------------------------
Function Form1Event2( i, lParam )
//------------------------------------------------------------------------------
Local nLastRec := 1, nFindElem := 0
Local nVirtKey := GetGridvKey( lParam )
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
Case nVirtKey == 33 // PGUP
_GridPgUp('','',i)
cPressedKeys := ""
Form_1.StatusBar.Item(1) := cSearchText
Return 1
Case nVirtKey == 34 // PGDN
_GridPgDn('','',i)
cPressedKeys := ""
Form_1.StatusBar.Item(1) := cSearchText
Return 1
Case nVirtKey == 38 // UP
_GridPrior('','',i)
cPressedKeys := ""
Form_1.StatusBar.Item(1) := cSearchText
Return 1
Case nVirtKey == 40 // DOWN
_GridNext('','',i)
cPressedKeys := ""
Form_1.StatusBar.Item(1) := cSearchText
Return 1
Case ( Upper( chr( ToAsciiEx(nVirtKey) ) ) $ NATION_CHARS ) .or. nVirtKey = 8
if nVirtKey = 8 // BackSpace
cPressedKeys := left( cPressedKeys, len(cPressedKeys)-1 )
else
cPressedKeys := cPressedKeys + Upper( chr( ToAsciiEx(nVirtKey) ) )
endif
Form_1.StatusBar.Item(1) := cSearchText + cPressedKeys
nLastRec := Form_1.Grid_1.Value
nFindElem := ascan( aRows, { | x | left( upper( x[nSortColGrid] ), len(cPressedKeys) ) == cPressedKeys } )
if nFindElem > 0
Form_1.Grid_1.Value := nFindElem
else
Form_1.Grid_1.Value := nLastRec
endif
Return 1 // Must be 1 to disable standard search procedure
Otherwise
cPressedKeys := ""
Form_1.StatusBar.Item(1) := cSearchText
EndCase
RETURN 0
//------------------------------------------------------------------------------
#include "MyEvents.prg"
//------------------------------------------------------------------------------