Ich habe mir den Thread über Xbase++ Dokumentation bzw. Buch mal reingezogen, und ich bin erstaunt, das alle, welche seit Jahren mit Xbase++ arbeiten sich nicht darauf einigen können, selbst ein Buch in elektronischer Form, oder Druck, zu realisieren. Mein Sohn hat mir mehrfach über die Schulter gesehn und mich gefragt, wie ich mit den Beispielen von Alaska zurechtkomme. Ich musste ihm sagen, das durch ausprobieren ich mir das angeeignet habe, was ich in Xbase++ machen kann. Und ich bin ein stümperhafter Laie !!! Ich bin mir sicher, das alle hier im Forum so genannte Experimente mit diversen Klassen, Funktionen, und so weiter gemacht haben. Wenn diese Experimente als Quellcode mit Beschreibung innerhalb des Quellcodes gesammelt würden, bin ich mir sicher, das da problemlos ein Buch entstehen könnte, welches durch die verschiedenen Denkweisen jeder Person besser wäre als die Doku von Xbase++. Ich habe seit 2013 nichts mehr mit Xbase++ gemacht und würde mich über so eine Sammlung erfreuen. Damit meine ich nicht Kostenfrei !!! Als Beispiel nehme ich mal von Jimmy eine Hilfestellung von 2012. Ich hatte angefragt wegen einem Editierbarem Array, welches er dann auch gepostet hat. Jetzt brauche ich dieses und habe mir sein damaliges Posting vorgenommen und soweit ich konnte für mich angepasst.
Code: Alles auswählen
#include "inkey.ch"
#include "setcurs.ch"
#include "Appevent.ch"
#define COL_CONTENT 1
#define COL_PICTURE 2
#define K_PLUS 43
#define K_MINUS 45
PROCEDURE main
LOCAL EK_Liste:=Space(20) // "1"+Space(19)
LOCAL aArray
aArray := {}
set confirm on
cls
AADD(aArray, EK_Liste )
ArrayBrowse(aArray,1,1,25,22)
RETURN
PROCEDURE ArrayBrowse(aArray, nTop, nLeft, nBottom, nRight)
LOCAL oTbrowse
LOCAL oCol
LOCAL nCursSave := SETCURSOR(SC_NONE)
LOCAL np := 1 // index Zeiger im Array
LOCAL n // index Zähler
* 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}
oTbrowse:colorSpec := "W+/BG,N/W"
oTbrowse:Create ()
oCol := TBColumnNew("Einkaufs Liste ", NIL)
oCol:block := { |xVal| IF(xVal == NIL, aArray[np], aArray[np] := xVal) }
oCol:cargo := {{|xVal| IF(xVal == NIL, aArray[np], aArray[np] := xVal) }, "!X"}
oCol:width := 20
oTbrowse:addColumn(oCol)
TBSetFocus( oTBrowse, aArray ) // TBrowse aktivieren
SETCURSOR(nCursSave)
RETURN
PROCEDURE TBSetFocus( oTBrowse, aArray )
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
DO CASE
CASE nKey == K_SPACE // Leertaste
DoGet(oTBrowse)
oTBrowse:refreshCurrent()
CASE nKey == K_PLUS
IF Len(aArray)<20
AADD(aArray, Space(20) )
* AADD(aArray, LTRIM(STR(Len(aArray)+1));
* +space(20-Len(LTRIM(STR(Len(aArray)+1) ) ) ) )
oTBrowse:refreshall()
oTBrowse:down()
ENDIF
CASE nKey == K_MINUS
IF Len(aArray) > 1
ADel( aArray, len(aArray) )
ASize( aArray, Len(aArray)-1 )
oTBrowse:refreshall()
ENDIF
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_UP ; oTBrowse:up()
OTHERWISE
lReturn:= .F.
ENDCASE
RETURN lReturn
STATIC FUNCTION DoGet(oTBrowse)
LOCAL oCol
LOCAL xValue
LOCAL nWidth
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
// Cursor sichtbar und do read an aktueller Position
SETCURSOR(SC_NORMAL)
READMODAL({GetNew(ROW(), COL(), oCol:cargo[COL_CONTENT],, ;
"@S"+LTRIM(STR(nWidth,2))+oCol:cargo[COL_PICTURE], oTBrowse:colorSpec)})
// Cursor ausschalten
SETCURSOR(SC_NONE)
RETURN (NIL)
*
* eof
*