Tal vez esto te sirva, pero funciona con DBFs, los valores son una combinación de los que usa combobox y twbrowse, espero no sea tan difÃcil entenderle, sorry, perdà el archivo que tenÃa con ejemplo.
#xcommand REDEFINE COMBROWSE [ <oCbx> VAR ] <cVar> ;
[ ALIAS <cAlias> ] ;
[ ID <nId> ] ;
[ <dlg:OF,WINDOW,DIALOG> <oWnd> ] ;
[ <help:HELPID, HELP ID> <nHelpId> ] ;
[ ON CHANGE <uChange> ] ;
[ VALID <uValid> ] ;
[ <color: COLOR,COLORS> <nClrText> [,<nClrBack>] ] ;
[ <update: UPDATE> ] ;
[ MESSAGE <cMsg> ] ;
[ WHEN <uWhen> ] ;
[ BITMAPS <acBitmaps> ] ;
[ ON DRAWITEM <uBmpSelect> ] ;
[ STYLE <nStyle> ] ;
[ PICTURE <cPicture> ];
[ ON EDIT CHANGE <uEChange> ] ;
[ FIELDS <aFields,...>] ;
[ FIELDGET <cFieldGet> ] ;
=> ;
[ <oCbx> := ] qComBrowse():ReDefine( <nId>, bSETGET(<cVar>),;
<cAlias>, <oWnd>, <nHelpId>, <{uValid}>, [{|Self|<uChange>}],;
<nClrText>, <nClrBack>, <cMsg>, <.update.>, <{uWhen}>,;
<acBitmaps>, [{|nItem|<uBmpSelect>}], <nStyle>, <cPicture>,;
[<{uEChange}>], [{||{<aFields>}}], <{cFieldGet}> )
#xcommand @ <nRow>, <nCol> COMBROWSE [ <oCbx> VAR ] <cVar> ;
[ ALIAS <cAlias> ] ;
[ SIZE <nWidth>, <nHeight> ] ;
[ <dlg:OF,WINDOW,DIALOG> <oWnd> ] ;
[ <help:HELPID, HELP ID> <nHelpId> ] ;
[ ON CHANGE <uChange> ] ;
[ VALID <uValid> ] ;
[ <color: COLOR,COLORS> <nClrText> [,<nClrBack>] ] ;
[ <pixel: PIXEL> ] ;
[ FONT <oFont> ] ;
[ <update: UPDATE> ] ;
[ MESSAGE <cMsg> ] ;
[ WHEN <uWhen> ] ;
[ <design: DESIGN> ] ;
[ BITMAPS <acBitmaps> ] ;
[ ON DRAWITEM <uBmpSelect> ] ;
[ STYLE <nStyle> ] ;
[ PICTURE <cPicture> ];
[ ON EDIT CHANGE <uEChange> ] ;
[ FIELDS <aFields,...>] ;
[ FIELDGET <cFieldGet> ] ;
=> ;
[ <oCbx> := ] qComBrowse():New( <nRow>, <nCol>, bSETGET(<cVar>),;
<cAlias>, <nWidth>, <nHeight>, <oWnd>, <nHelpId>,;
[{|Self|<uChange>}], <{uValid}>, <nClrText>, <nClrBack>,;
<.pixel.>, <oFont>, <cMsg>, <.update.>, <{uWhen}>,;
<.design.>, <acBitmaps>, [{|nItem|<uBmpSelect>}], <nStyle>,;
<cPicture>, [<{uEChange}>], [{||{<aFields>}}], <{cFieldGet}> )
// Por: Enrique Guerra (Quique)
// email: <!-- e --><a href="mailto:quique@quiquesoft.com">quique@quiquesoft.com</a><!-- e -->
#INCLUDE "fivewin.ch"
CLASS qComBrowse from tComboBox
data aColSizes, aHeaders, cField, uValue1, uValue2, cAlias, aActions
data aFields // campos a mostrar en el browse
data bFieldGet // campo que se selecciona
data cIndice // Ãndice que tiene el archivo ::cAlias para recuperarlo en caso de que se cambie durante el browse
data oBrw // referencia al browse
data oDBF // se utiliza si el browse se hace a un objeto TARRAY u otro para DBFs
DATA lBrowse init .f. //protected // indica si el browse está activo
data lSet init .f. //protected // para evitar la recursividad en SET
data nBrwLeft init 0 // posición izquierda del browse
data nBrwWidth // ancho del browse
METHOD new( nRow, nCol, bSetGet, cAlias, nWidth, nHeight, oWnd, nHelpId, bChange, ;
bValid, nClrText, nClrBack, lPixel, oFont, cMsg, lUpdate, bWhen, lDesign, ;
acBitmaps, bDrawItem, nStyle, cPict, bEChange, aFields, bFieldGet ) ;
CONSTRUCTOR
METHOD reDefine( nId, bSetGet, cAlias, oWnd, nHelpId, bValid, bChange, nClrText, ;
nClrBack, cMsg, lUpdate, bWhen, acBitmaps, bDrawItem, nStyle, cPict, bEChange, ;
aFields, bFieldGet ) CONSTRUCTOR
METHOD lButtonDown( nRow, nCol, nKeyFlags )
METHOD keyDown( nKey, nFlags )
message set method _set( xNewItem )
method closeBrowse()
ENDCLASS
//-------------------------------------------------------------------------------------
METHOD new( nRow, nCol, bSetGet, cAlias, nWidth, nHeight, oWnd, nHelpId, bChange, ;
bValid, nClrText, nClrBack, lPixel, oFont, cMsg, lUpdate, bWhen, lDesign, ;
acBitmaps, bDrawItem, nStyle, cPict, bEChange, aFields, bFieldGet ) ;
class qComBrowse
::aFields := aFields
::bFieldGet := bFieldGet
IF valType( cAlias ) = "O"
::oDBF := cAlias
::cAlias := if( ::oDBF:classname() == "TARRAY", "ARRAY", ::oDBF:cAlias )
elseIf cAlias == nil
::cAlias := alias()
else
::cAlias := cAlias
ENDIF
super:new( nRow, nCol, bSetGet, , nWidth, 0, oWnd, nHelpId,, bValid, ;
nClrText, nClrBack, lPixel, oFont, cMsg, lUpdate, bWhen, lDesign, acBitmaps, ;
bDrawItem, nStyle, cPict, bEChange )
// IF ::oGet <> nil
// ::bValid := bValid
// ENDIF
::set( eval( bSetGet ) )
::bChange := bChange
RETURN self
//-------------------------------------------------------------------------------------
METHOD reDefine( nId, bSetGet, cAlias, oWnd, nHelpId, bValid, bChange, nClrText, ;
nClrBack, cMsg, lUpdate, bWhen, acBitmaps, bDrawItem, nStyle, cPict, bEChange, ;
aFields, bFieldGet ) class qComBrowse
::aFields := aFields
::bFieldGet := bFieldGet
IF valType(cAlias) = "O"
::oDBF := cAlias
::cAlias := if( ::oDBF:classname() ="TARRAY", "ARRAY", ::oDBF:cAlias )
else
::cAlias := cAlias
ENDIF
super:reDefine( nId, bSetGet, , oWnd, nHelpId, bValid,, nClrText, nClrBack, ;
cMsg, lUpdate, bWhen, acBitmaps, bDrawItem, nStyle, cPict, bEChange )
// ::bValid := bValid
::set( eval( bSetGet ) )
::bChange := bChange
return self
//-------------------------------------------------------------------------------------
METHOD lButtonDown( nRow, nCol, nKeyFlags ) class qComBrowse
local nFieldSay, bLine, bValid := ::bValid
local oDlg, this := self, aCor
IF ::bLClicked = nil .OR. Eval( ::bLClicked, nRow, nCol, nKeyFlags, self )
IF !::lBrowse
::setFocus()
::lBrowse := .t.
::bValid := nil
// ::bValid := nil
DEFINE DIALOG oDlg STYLE nOR( WS_VISIBLE, WS_POPUP ) OF ::oWnd
::oBrw := tWBrowse():new( , , , , ::aFields, ::aHeaders, ;
::aColSizes, oDlg, ::cField, ::uValue1, ::uValue2,, ;
{ || ::set(), ::closeBrowse() }, ::bRClicked, ::oFont, ::oCursor, ;
::nClrText, ::nClrPane, ::cMsg, .F., ::cAlias, .t.,, .F.,, ::bLClicked, ;
::aActions/*, ::bSeek, ::lSeekEOF*/ )
IF ::oDBF <> nil
if ::oDBF:classname() = "TARRAY"
::oBrw:setArray( ::oDBF:aDatos )
::oBrw:bLine := ::aFields
endIf
::oBrw:bGotop := { || ::oDBF:gotop() }
::oBrw:bGoBottom := { || ::oDBF:goBottom() }
::oBrw:bSkip := { | nSkip | ::oDBF:skip( nSkip ) }
elseIf ( ::cAlias )->( indexOrd() ) > 1
if ( ::cAlias )->( dbSeek() )
::oBrw:upStable()
else
::oBrw:goTop()
endIf
ENDIF
::oBrw:bChange := { || ::set() }
::oBrw:oWnd:bLostFocus := { || ::closeBrowse() }
::oBrw:bValid := { || ::bValid := bValid, /*::bValid := bValid, */.t. }
IF( ::cAlias <> "ARRAY", ::cIndice := ( ::cAlias )->( ordSetFocus() ) , )
oDlg:setControl( ::oBrw )
activate dialog oDlg nomodal;
on init ( aCor := getWndRect( this:hWnd ), ;
oDlg:Move( aCor[ 1 ] + 20, aCor[ 2 ] + this:nBrwLeft, if( this:nBrwWidth = nil, this:nWidth, this:nBrwWidth ), ;
min( 160, aCor[ 1 ] + this:oWnd:nHeight - aCor[ 1 ] - 39 ) ) )
ENDIF
ENDIF
return .t.
//-------------------------------------------------------------------------------------
METHOD keyDown( nKey, nFlags ) class qComBrowse
if nKey=VK_DOWN
if ::oDBF=nil
(::cAlias)->(dbSkip())
IF(eof(),dbGoBottom(),)
else
::oDBF:skip()
IF(::oDBF:eof(),::oDBF:goBottom(),)
endIf
::set()
::refresh()
elseif nKey=VK_UP
if(::oDBF=nil,(::cAlias)->(dbSkip(-1)),::oDBF:skip(-1))
::set()
::refresh()
endIf
return super:keyDown( nKey, nFlags )
//-------------------------------------------------------------------------------------
method _set( xNewItem ) class qComBrowse
local bChange := ::bChange
IF !::lSet
::lSet := .t.
::bChange := nil
IF empty( xNewItem )
xNewItem := eval( ::bFieldGet )
ENDIF
// IF ::oGet <> nil .AND. ::cPicture <> nil
// xNewItem := transform( xNewItem, ::cPicture )
// else
xNewItem := cValToChar( xNewItem )
// ENDIF
if ::nLeft == nil
::nLeft := 0
::nColPos := 1
endIf
::setItems( { xNewItem } )
super:set( xNewItem )
eval( ::bSetGet, xNewItem )
::bChange := bChange
::nAt := 0
::change()
::lSet := .f.
ENDIF
return nil
//-------------------------------------------------------------------------------------
method closeBrowse() class qComBrowse
::oBrw:oWnd:bLostFocus := nil
::oBrw:hide()
::oBrw:oWnd:end()
IF( ::cAlias <> "ARRAY", ( ::cAlias )->( ordSetFocus( ::cIndice ) ), )
::lBrowse := .f.
return nil