Kampf mit TBROWSE [erledigt]
Verfasst: Do, 29. Mär 2018 12:20
Mahlzeit,
ich wollte mal was Gutes tun und mich mit TBROWSE anfreunden. Habe dazu das Beispiel aus der Doku verwendet, scheitere aber schon in den ersten paar Zeilen mit der Fehlermeldung:
"Acces to method not allowed in this context"
Operation::init
Aufgerufen von DBFVIEW()
Was ist da schon wieder falsch???
Vielleicht hat jemand eine Idee
Gruß Wolfgang
ich wollte mal was Gutes tun und mich mit TBROWSE anfreunden. Habe dazu das Beispiel aus der Doku verwendet, scheitere aber schon in den ersten paar Zeilen mit der Fehlermeldung:
"Acces to method not allowed in this context"
Operation::init
Aufgerufen von DBFVIEW()
Code: Alles auswählen
PROCEDURE BROWSE_MIT
dbfView( 5,10,20,70, "vb_opb.dbf" )
RETURN
PROCEDURE dbfView(nTop, nLeft, nBottom, nRight, cDbfFile )
LOCAL oTBrowse, n, nCount
// The program example shows the basic procedures for programming with TBrowse and TBColumn objects in this example
// of a simple DBF File Viewer. In order to display data on the screen the following steps are required:
//
// Generate TBrowse object and define navagation code blocks. (-> PROCEDURE DbfView )
//
// Generate TBColumn objects and (-> FUNCTION FieldColumn ) attach to the TBrowse object. (-> PROCEDURE DbfView )
//
// Display, stabilize browse window and examine keyboard (events). (-> PROCEDURE TBSetFocus )
//
// Call methods for the movement of the browse cursor (-> FUNCTION TBNavigate )
//
// Perform appropriate skip operations based on cursor movement (-> FUNCTION DbfSkipper )
//
// The basic steps are programmed in five different functions and procedures.
//////
// The function generates a TBrowse object for viewing the data records and activates the TBrowse object
//////
USE (cDbfFile) NEW // Open file
// Generate TBrowse object
oTBrowse := TBrowse():new( nTop, nLeft, nBottom, nRight )
oTBrowse:goTopBlock := {|| DbGoTop() }
oTBrowse:goBottomBlock := {|| DbGoBottom() }
oTBrowse:skipBlock := {|n| DbfSkipper(n) }
oTBrowse:headSep := Chr(205) + Chr(205) + Chr(205)
oTBrowse:colSep := Chr(32) + Chr(179) + Chr(32)
*oTBrowse:colorSpec := "N/BG,W+/B,N/R,W+/R"
nCount := FCount()
FOR n:=1 TO nCount // Generate TBColumn object
oTBColumn:= FieldColumn( n ) // in UDF
oTBrowse:AddColumn( oTBColumn ) // Attach TBColumn object
NEXT
TBSetFocus( oTBrowse ) // Activate TBrowse
RETURN
//////
// The function generates a TBColumn object for a field variable with help of the field position
//////
FUNCTION FieldColumn( nFieldPos )
LOCAL oTBColumn , cHeading , bBlock , cFieldname, cFieldtype
cFieldname := FieldName( nFieldPos )
cFieldtype := Type( cFieldname )
cHeading := Left( cFieldname, 1 ) + Lower( SubStr( cFieldname, 2 ) )
IF cFieldtype == "M" // Produce data code block
bBlock := {|| IIf( Empty( FieldGet(nFieldPos) ), " ", "<Memofield>" ) }
ELSE
bBlock := FieldWBlock( cFieldname, Select() )
ENDIF
// Generate TBColumn object
oTBColumn := TBColumn():new( cHeading, bBlock )
IF cFieldtype == "N" // Negative numbers have
// different colors than
// positive numbers.
oTBColumn:colorBlock := {|n| IIF( n<0, {3,4}, {1,2} ) }
ELSEIF cFieldtype == "L"
oTBColumn:Picture := "Y" // Picture for logical values
ENDIF
RETURN oTBColumn
//////
// This function stabilizes the display in the browse window and gets input from the keyboard
//////
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)
ENDIF
TBNavigate( oTbrowse, nKey )
ENDDO
RETURN
//////
// The function sends different messages to a TBrowse object for moving the cursor, depending on the key pressed.
//////
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
//////
// This function executes a skip operation on the data source of a TBrowse object. It is called from oTBrowse:skipBlock
// which is evaluated in oTBrowse:stabilize(), and receives as a parameter the number of skip
// operations to perform. DbSkipper() works with DBF files
//////
FUNCTION DbfSkipper( nWantSkip )
LOCAL nDidSkip := 0
DO CASE
CASE LastRec() == 0 // No data records to skip,
// nothing happens.
CASE nWantSkip == 0
GOTO RecNo() // Refresh data buffer
CASE nWantSkip > 0 // Skip forward
DO WHILE nWantSkip > nDidSkip .AND. .NOT. Eof()
SKIP
IF Eof() // End of file
SKIP -1
EXIT
ENDIF
nDidSkip ++
ENDDO
CASE nWantSkip < 0 // Skip backward
DO WHILE nWantSkip < nDidSkip .AND. .NOT. Bof()
SKIP -1
IF Bof() // Beginning of file reached
EXIT
ENDIF
nDidSkip --
ENDDO
ENDCASE
RETURN nDidSkip // This much was skipped
//////
// EOF TEST.PRG
//////
Vielleicht hat jemand eine Idee
Gruß Wolfgang