hast ja Recht ... was "aus der Hüfte" kam war
Der Codeblock kommt als 2nd Parameter in das TBColumnNew() oder als oCol:block von TBColumn()
Code: Alles auswählen
#include "inkey.ch"
#include "setcurs.ch"
#include "NLS.ch"
#define EK_ARTIKEL 1
#define EK_PREIS 2
#define EK_STUECK 3
#define EK_GESBETRAG 4
#define EK_DATUM 5
#define EK_BEZAHLT 6
#define COL_CONTENT 1
#define COL_PICTURE 2
PROCEDURE main
local aArray
local ek_artikel,ek_preis,ek_stueck,ek_gesbetrag,ek_datum,ek_bezahlt
local taste
local nChoice
local oTBrowse
LOCAL GETLIST := {}
LOCAL i
SET EPOCH TO YEAR( DATE() ) - 50
SET DATE GERMAN // DD.MM.YY
SETLOCALE( NLS_ICURRENCYEURO, "1" )
SETLOCALE( NLS_SCURRENCY, CHR( 213 ) )
aArray := {}
ek_artikel := Space(30)
ek_preis := 0
ek_stueck := 0
ek_gesbetrag:= 0
ek_datum := ctod("")
ek_bezahlt := 0
taste:=0
set confirm on
set decimals to 2
cls
///
// Demo Daten
//
FOR i := 1 TO 55
AADD(aArray, {})
AADD(aArray[i], "Artikel"+STRZERO(i,2) )
AADD(aArray[i], i+(i/100*19) )
AADD(aArray[i], i+(i/100*29) )
AADD(aArray[i], i+(i/100*39) )
AADD(aArray[i],DATE() )
AADD(aArray[i], i+(i/100*49) )
NEXT
DoMyBrowse(aArray,1,1,35,79)
/*******************************************
@ 21,01 say "F5 - Artikel"
@ 21,20 say "ESC - Ende"
do while taste<>K_ESC
taste:=inkey(0)
do case
case taste=K_F5
@ 17,01 say "Artikel: " get ek_artikel
@ 17,45 say "Preis: " get ek_preis
@ 18,01 say "Menge: " get ek_stueck
@ 18,40 say "Ges.Betrag: " get ek_gesbetrag
@ 19,01 say "Wann: " get ek_datum
@ 19,40 say "Bezahlt: " get ek_bezahlt
read
AAdd( aArray,{ek_artikel,ek_preis,ek_stueck,ek_gesbetrag,ek_datum,ek_bezahlt} )
case taste=K_ESC
* quit
EXIT
endcase
enddo
DoMyBrowse(aArray,1,1,15,79)
*******************************************/
return
PROCEDURE DoMyBrowse(aArray,nTop, nLeft, nBottom, nRight)
LOCAL oTbrowse
LOCAL oCol
LOCAL nCursSave := SETCURSOR(SC_NONE)
LOCAL np := 1 // index pointer into array
LOCAL n // index counter
* Browser initialisieren
oTbrowse := TBrowse():new(nTop, nLeft, nBottom, nRight)
* Skip und Navigationsbloecke fuer den Browser initialisieren
oTbrowse:SkipBlock := {|nSkip| -np+(np := MAX(1, MIN(LEN(aArray), np+nSkip))) }
oTbrowse:GoBottomBlock := {|| np := LEN(aArray) }
oTbrowse:GoTopBlock := {|| np := 1}
// define default column attributes
oTbrowse:colSep := " ³ "
oTbrowse:headSep := "ÄÂÄ"
oTbrowse:footSep := ""
oTbrowse:colorSpec := "W+/BG,N/W"
oTbrowse:Create ()
// Column Cargo Contents:
// cargo[1] contains the code block to edit column
// cargo[2] is the picture clause for edit column
// cargo[3] is unused
oCol := TBColumnNew("Artikel ", NIL)
oCol:block := { |xVal| IF(xVal == NIL, aArray[np][EK_ARTIKEL] ,aArray[np][EK_ARTIKEL] := xVal) }
oCol:cargo := {{|xVal| IF(xVal == NIL, aArray[np][EK_ARTIKEL] ,aArray[np][EK_ARTIKEL] := xVal) }, "!XXXXXXXXX"}
oCol:width := 10
oTbrowse:addColumn(oCol)
oCol := TBColumnNew("Preis ", NIL)
oCol:block := {|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_PREIS] , '@N' )),aArray[np][EK_PREIS] := xVal) }
oCol:cargo := {{|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_PREIS] , '@N' )),aArray[np][EK_PREIS] := xVal) }, "99999.99"}
oCol:width := 8
oTbrowse:addColumn(oCol)
oCol := TBColumnNew("Stueck ", NIL)
oCol:block := {|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_STUECK] , '@N' )),aArray[np][EK_STUECK] := xVal) }
oCol:cargo := {{|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_STUECK] , '@N' )),aArray[np][EK_STUECK] := xVal) }, "99999.99"}
oCol:width := 8
oTbrowse:addColumn(oCol)
oCol := TBColumnNew("Gesbetrag", NIL)
oCol:block := {|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_GESBETRAG] , '@N' )),aArray[np][EK_GESBETRAG] := xVal) }
oCol:cargo := {{|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_GESBETRAG] , '@N' )),aArray[np][EK_GESBETRAG] := xVal) }, "99999.99"}
oCol:width := 8
oTbrowse:addColumn(oCol)
oCol := TBColumnNew("Datum " , NIL)
oCol:block := {|xVal| IF(xVal == NIL, aArray[np][EK_DATUM] ,aArray[np][EK_DATUM] := xVal) }
oCol:cargo := {{|xVal| IF(xVal == NIL, aArray[np][EK_DATUM] ,aArray[np][EK_DATUM] := xVal) }, "99.99.99"}
oCol:width := 8
oTbrowse:addColumn(oCol)
oCol := TBColumnNew("Bezahlt ", NIL)
oCol:block := {|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_BEZAHLT] , '@N' )),aArray[np][EK_BEZAHLT] := xVal) }
oCol:cargo := {{|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_BEZAHLT] , '@N' )),aArray[np][EK_BEZAHLT] := xVal) }, "99999.99"}
oCol:width := 8
oTbrowse:addColumn(oCol)
TBSetFocus( oTBrowse ) // TBrowse aktivieren
SETCURSOR(nCursSave)
RETURN
PROCEDURE TBSetFocus( oTBrowse )
LOCAL nKey := 0
DO WHILE nKey <> K_ESC
DO WHILE .NOT. oTBrowse:stabilize()
IF (nKey := Inkey()) <> 0
EXIT
ENDIF
ENDDO
IF oTBrowse:stable
nKey := Inkey(0.1)
ENDIF
//
// your spezial Keys
//
DO CASE
CASE nKey == K_ENTER // Enter
DoGet(oTBrowse)
oTBrowse:refreshCurrent()
OTHERWISE
TBNavigate( oTBrowse, nKey )
ENDCASE
ENDDO
RETURN
FUNCTION TBNavigate( oTBrowse, nKey )
LOCAL bBlock := SetKey( nKey )
LOCAL lReturn := .T.
DO CASE
CASE bBlock <> NIL ; Eval( bBlock, oTBrowse )
CASE nKey == K_DOWN ; oTBrowse:down()
CASE nKey == K_PGDN ; oTBrowse:pageDown()
CASE nKey == K_CTRL_PGDN ; oTBrowse:goBottom()
CASE nKey == K_LEFT ; oTBrowse:left()
CASE nKey == K_CTRL_LEFT ; oTBrowse:panLeft()
CASE nKey == K_HOME ; oTBrowse:home()
CASE nKey == K_CTRL_HOME ; oTBrowse:panHome()
CASE nKey == K_RIGHT ; oTBrowse:right()
CASE nKey == K_CTRL_RIGHT ; oTBrowse:panRight()
CASE nKey == K_END ; oTBrowse:end()
CASE nKey == K_CTRL_END ; oTBrowse:panEnd()
CASE nKey == K_UP ; oTBrowse:up()
CASE nKey == K_PGUP ; oTBrowse:pageUp()
CASE nKey == K_CTRL_PGUP ; oTBrowse:goTop()
OTHERWISE
lReturn:= .F.
ENDCASE
RETURN lReturn
STATIC FUNCTION DoGet(oTBrowse)
LOCAL oCol
LOCAL xValue
LOCAL nWidth
LOCAL nRecNo
LOCAL xSaveKey
oCol := oTBrowse:getColumn(oTBrowse:colPos)
// get ACTUAL width of column so we don't overwrite adjacent columns
nWidth := oCol:width
IF nWidth == NIL
xValue := EVAL(oCol:block)
DO CASE
CASE VALTYPE(xValue) == "C"
nWidth := LEN(xValue)
CASE VALTYPE(xValue) == "N"
nWidth := LEN(STR(xValue))
CASE VALTYPE(xValue) == "D"
nWidth := LEN(DTOC(xValue))
CASE VALTYPE(xValue) == "L"
nWidth := 1
ENDCASE
IF oCol:Heading != NIL
nWidth := MAX(nWidth, LEN(oCol:heading) )
ENDIF
ENDIF
//
// only used with INDEX
//
// save controlling index key value
* IF !EMPTY(INDEXKEY(0))
* xSaveKey := &(INDEXKEY(0))
* nRecNo := RECNO()
* ENDIF
// turn cursor on and do read at current position
SETCURSOR(SC_NORMAL)
READMODAL({GetNew(ROW(), COL(), oCol:cargo[COL_CONTENT],, ;
"@S"+LTRIM(STR(nWidth,2))+oCol:cargo[COL_PICTURE], oTBrowse:colorSpec)})
// turn cursor off
SETCURSOR(SC_NONE)
//
// only used with INDEX
//
* IF !EMPTY(xSaveKey) .AND. !(&(INDEXKEY(0)) == xSaveKey )
* oTBrowse:refreshAll()
* ForceStable( oTBrowse )
* DO WHILE (RECNO() != nRecNo)
* oTBrowse:up()
* ForceStable( oTBrowse )
* ENDDO
* ENDIF
RETURN (NIL)
PROCEDURE ForceStable( oTBrowse )
DISPBEGIN()
DO WHILE .NOT. oTBrowse:stabilize()
//
// xbase++
//
SLEEP(0)
ENDDO
DISPEND()
RETURN
*
* eof
*
mit DoGet(oTBrowse) wird nach nKey == K_ENTER ausgeführt und die PICTURE für das editieren ist auch dabei.
Er scheint immer N,13,2 zu sein d.h. bei oCol:width := 8 würde man nichts "sehen" wenn man nicht LTRIM() benutzt ?