Eu queria confirmar com quem já fez uso de browse com array se a minha rotina está certa:
Código: Selecionar todos
clrT :=hwg_RGB(0,0,255) //Cor do texto
clrB :=hwg_RGB(211,237,250) //Cor de fundo do browser
clrTSel:=hwg_RGB(0,0,255) //Cor do texto do selecionado
clrBSel:=hwg_RGB(255,255,0) //Cor de fundo do selecionado
HWG_AChoice( {"A 0123456789 0123456789","B 0123456789 0123456789","C 0123456789 0123456789"}, "Teste",,,, clrT, clrB, clrTSel, clrBSel, "Ok", "Sair" )
Código: Selecionar todos
FUNCTION HWG_AChoice( arr, cTitle, nLeft, nTop, oFont, clrT, clrB, clrTSel, clrBSel, cOk, cCancel )
LOCAL oDlg, oBrw, nChoice:=0, lArray:=.T., nField, lNewFont:=.F.
LOCAL i, aLen, nLen:=0, addX:=20, addY:=20, minWidth:=0, x1
LOCAL hDC, aMetr, nWidth, nHeight, aArea, aRect
LOCAL nStyle:=WS_POPUP + WS_VISIBLE + WS_CAPTION + WS_SYSMENU //+ WS_SIZEBOX
LOCAL nLenArray
LOCAL oIconOk:=HIcon():AddResource("ICON_OK24")
IF cTitle == Nil ; cTitle:="" ; ENDIF
IF nLeft == Nil .AND. nTop == Nil ; nStyle += DS_CENTER ; ENDIF
IF nLeft == Nil ; nLeft:=0 ; ENDIF
IF nTop == Nil ; nTop:=0 ; ENDIF
IF oFont == Nil
oFont:=HFont():Add( "Courier New", 0, -18,550 ) //
lNewFont:=.T.
ENDIF
IF cOk != Nil
minWidth += 120
IF cCancel != Nil
minWidth += 100
ENDIF
addY += 30
ELSE
cOk:="Ok"
ENDIF
IF ValType( arr ) == "C"
lArray:=.F.
aLen:=RecCount()
IF ( nField:=FieldPos( arr ) ) == 0
RETURN 0
ENDIF
nLen:=dbFieldInfo( 3, nField )
ELSE
aLen:=Len( arr )
IF ValType( arr[ 1 ] ) == "A"
FOR i:=1 TO aLen
nLen:=Max( nLen, Len( arr[ i, 1 ] ) )
NEXT
ELSE
FOR i:=1 TO aLen
nLen:=Max( nLen, Len( arr[ i ] ) )
NEXT
ENDIF
ENDIF
hDC:=hwg_Getdc( hwg_GetActiveWindow() )
HWG_SelectObject( hDC, oFont:handle )
aMetr:=HWG_GetTextMetric( hDC )
aArea:=HWG_GetDeviceArea( hDC )
aRect:=HWG_GetWindowRect( HWG_GetActiveWindow() )
hwg_Releasedc( hwg_GetActiveWindow(), hDC )
nLenArray:=aLen + 3
nLenArray:=Min(23,nLenArray)
nHeight:=( aMetr[ 1 ] + 1 ) * aLen + nLenArray + addY + nLenArray
IF nHeight > aArea[ 2 ] - aRect[ 2 ] - nTop - 60
nHeight:=aArea[ 2 ] - aRect[ 2 ] - nTop - 60
ENDIF
nWidth:=(nLen * aMetr[ 2 ]) + 60
INIT DIALOG oDlg TITLE cTitle ;
AT nLeft, nTop ;
ICON HIcon():AddResource("ICON_ACHOICE") ;
SIZE nWidth, nHeight ;
STYLE nStyle ;
FONT oFont ;
CLIPPER ;
NOEXIT ;
ON INIT { | o | hwg_ResetWindowPos( o:handle ), o:nInitFocus:=oBrw }
IF lArray
@ 0,0 Browse oBrw Array
oBrw:aArray:=Arr
IF ValType( arr[ 1 ] ) == "A"
oBrw:AddColumn( HColumn():New( , { | value, o | HB_SYMBOL_UNUSED( value ), o:aArray[ o:nCurrent, 1 ] }, "C", nLen ) )
ELSE
oBrw:AddColumn( HColumn():New( , { | value, o | HB_SYMBOL_UNUSED( value ), o:aArray[ o:nCurrent ] }, "C", nLen ) )
ENDIF
ELSE
@ 0, 0 Browse oBrw DATABASE
oBrw:AddColumn( HColumn():New( , { | value, o | HB_SYMBOL_UNUSED( value ), ( o:Alias ) ->( FieldGet( nField ) ) }, "C", nLen ) )
ENDIF
oBrw:oFont := oFont
oBrw:bSize := { | o, x, y | hwg_MoveWindow( o:handle, addX / 2, 10, x - addX, y - addY ) }
oBrw:bEnter := { | o | nChoice := o:nCurrent, hwg_EndDialog( o:oParent:handle ) }
oBrw:bKeyDown := {|o,key|HB_SYMBOL_UNUSED(o),IIF(key==27,(hwg_EndDialog(oDlg:handle),.F.),BrwKey(o,key))}
oBrw:lDispHead:=.F.
IF clrT != Nil
oBrw:tcolor:=clrT
ENDIF
IF clrB != Nil
oBrw:bcolor:=clrB
ENDIF
IF clrTSel != Nil
oBrw:tcolorSel:=clrTSel
ENDIF
IF clrBSel != Nil
oBrw:bcolorSel:=clrBSel
ENDIF
IF cOk != Nil
x1 := Int( nWidth/2 ) - IIF( cCancel != Nil, 90, 40 )
@ x1,nHeight - 36 OWNERBUTTON oOk SIZE 80,30 ;
TEXT cOk COORDINATES 35,0,0,0 ;
FONT HFont():Add( "Arial", 0, -13,550 ) ;
STYLE WS_TABSTOP ;
BITMAP "BMP_OK24" FROM RESOURCE COORDINATES 5,0,0,0 TRANSPARENT;
ON CLICK { || nChoice := oBrw:nCurrent, hwg_EndDialog( oDlg:handle )} ;
TOOLTIP "Escolher a seleção." ;
THEMED
IF cCancel != Nil
@ x1 + 100,nHeight - 36 OWNERBUTTON oSaida SIZE 80,30 ;
TEXT cCancel COORDINATES 35,0,0,0 ;
FONT HFont():Add( "Arial", 0, -13,550 ) ;
STYLE WS_TABSTOP ;
BITMAP "BMP_SAIR24" FROM RESOURCE COORDINATES 5,0,0,0 TRANSPARENT;
ON CLICK { || hwg_EndDialog( oDlg:handle )} ;
TOOLTIP "Abandonar a seleção." ;
THEMED
ENDIF
ENDIF
oDlg:Activate()
IF lNewFont
oFont:Release()
ENDIF
RETURN nChoice
STATIC FUNCTION BrwKey( oBrw, key )
LOCAL nPosicao
nPosicao:=ASCAN(oBrw:aArray,Chr(key))
IF nPosicao # 0
oBrw:nCurrent:=nPosicao
//Eval( oBrw:bGoTo, oBrw, nPosicao )
oBrw:Refresh()
ENDIF
RETURN .T.


