/* ZE_BROWSEADO.PRG - Browse para ADO versão simplificada */ #include "inkey.ch" FUNCTION BrowseADO( nTop, nLeft, nBottom, nRight, oADO, oTBrowse, bKeyboard, bUserFunction ) LOCAL nKey := 0, oBrowse, bAction, oElement, oThisColumn oBrowse := TBrowseDb():New( nTop, nLeft, nBottom, nRight ) oBrowse:HeadSep := Chr(196) oBrowse:ColSep := Chr(179) oBrowse:FootSep := "" oBrowse:GoTopBlock := { || oADO:MoveFirst() } oBrowse:GoBottomBlock := { || oADO:MoveLast() } oBrowse:SkipBlock := { | n | cnSQLBrowseSkipper( oADO, n ) } FOR EACH oElement IN oTBrowse oThisColumn := tbColumnNew( oElement[ 1 ], oElement[ 2 ] ) IF Len( oElement ) > 2 oThisColumn:ColorBlock := oElement[ 3 ] ENDIF oBrowse:AddColumn( oThisColumn ) NEXT DO WHILE ! oBrowse:Stable() oBrowse:Stabilize() ENDDO DO WHILE .T. oBrowse:RefreshCurrent() DO WHILE nKey == 0 .AND. ! oBrowse:Stable oBrowse:Stabilize() nKey := Inkey() ENDDO oBrowse:RefreshCurrent() IF nKey == 0 DO WHILE ! oBrowse:Stabilize() ENDDO nKey := Inkey( 0, HB_INKEY_ALL - INKEY_MOVE ) ENDIF IF ( bAction := SetKey( nKey ) ) != NIL Eval( bAction, ProcName(), ProcLine(), ReadVar() ) ENDIF DO CASE CASE nKey == K_ESC EXIT CASE nKey == K_ENTER .AND. bUserFunction == NIL DO WHILE ! oBrowse:Stable oBrowse:Stabilize() ENDDO IF bKeyboard != NIL KEYBOARD Eval( bKeyBoard ) + Chr( K_ENTER ) ENDIF EXIT CASE nkey == K_CTRL_PGDN ; nKey := 0; oBrowse:GoBottom() ; LOOP CASE nkey == K_CTRL_PGUP ; nKey := 0; oBrowse:GoTop() ; LOOP CASE nkey == K_DOWN ; nKey := 0; oBrowse:Down() ; LOOP CASE nkey == K_HOME ; nKey := 0; oBrowse:GoTop() ; LOOP CASE nkey == K_END ; nKey := 0; oBrowse:GoBottom() ; LOOP CASE nkey == K_LEFT ; nKey := 0; oBrowse:Left() ; LOOP CASE nkey == K_RIGHT ; nKey := 0; oBrowse:Right() ; LOOP CASE nkey == K_PGDN ; nKey := 0; oBrowse:PageDown() ; LOOP CASE nkey == K_PGUP ; nKey := 0; oBrowse:PageUp() ; LOOP CASE nkey == K_UP ; nKey := 0; oBrowse:Up() ; LOOP ENDCASE IF bUserFunction != NIL DO WHILE ! oBrowse:Stable oBrowse:Stabilize() ENDDO Eval( bUserFunction, oBrowse, nKey, oADO ) oBrowse:RefreshAll() ENDIF nKey := 0 // para refresh ENDDO @ MaxRow(), MaxCol() SAY "" RETURN NIL STATIC FUNCTION cnSQLBrowseSkipper( oADO, nSkip ) LOCAL nRec := oADO:AbsolutePosition() IF ! oADO:Eof() oADO:Move( nSkip ) IF oADO:Eof() oADO:MoveLast() ENDIF IF oADO:Bof() oADO:MoveFirst() ENDIF ENDIF RETURN oADO:AbsolutePosition() - nRec