hi,
Roger hat geschrieben:
Ich möchte mit XbpBrowse (in einem CRT-Fenster) ein Array bearbeiten lassen. In der Hilfe steht etwas von "databases or arrays", aber ich habe noch kein Beispiel gefunden, das mit einem Array arbeitet.
C:\ALASKA\XPPW32\SOURCE\samples\basics\GuiBrow\EBROWSE.prg
Roger hat geschrieben:
Gibt es solche Beispiele (mit Funktionalität zum Bearbeiten von Zellen sowie zum Einfügen und Löschen von Zeilen)?
das bearbeiten von Zellen sollte ja kein Problem sein und AINS() und
ADEL() gibt es doch.
Roger hat geschrieben:
PS: Das Aussehen von EDITBROW (aus ..\samples\solution\xbpget) kommt meinen Anforderungen schon recht nahe. Was müsste da geändert werden, um mit einem Array statt mit einer DBF zu arbeiten?
bei dem Beispiel geht es weniger um das Browse sondern vielmehr um
das XbpGET und um den "Controller" XbpGETC, deshalb der falsche
Ausgangspunkt.
Der grundlegende Unterschiede zwischen DBF und Array sind die
"Navigations" codeblöcke und der o:datalink.
Code: Alles auswählen
DBF :
oBrowse := XbpBrowse():new( oParent,, aPos, aSize,, .F. ):create()
// Navigations Codebloecke fuer den Browser
oBrowse:skipBlock := {|n| DbSkipper(n) }
oBrowse:goTopBlock := {| | DbGoTop() }
oBrowse:goBottomBlock := {| | DbGoBottom() }
oBrowse:phyPosBlock := {| | Recno() }
// Codebloecke fuer den vertikalen Scrollbar.
// Hinweis: DbPosition() liefert Werte zwischen 0 und 100.
// Wir multiplizieren das mit 10 um eine feinere Granularitaet
// fuer den Scrollbar zu erreichen.
oBrowse:posBlock := {| | DbPosition()*10 }
oBrowse:goPosBlock := {|n| DbGoPosition(n/10) }
oBrowse:lastPosBlock := {| | 1000 }
oBrowse:firstPosBlock := {| | 0 }
********************************************************
ARRAY:
::oValues := XbpBrowse():new( ::oValueGroup )
::oValues:SkipBlock := {|nSkip,oBrowse| ::Skip(nSkip,oBrowse) }
::oValues:GoBottomBlock := {|| ::nRecno := LEN(::aData) }
::oValues:GoTopBlock := {|| ::nRecno := 1 }
::oValues:PosBlock := {|| ::nRecno }
::oValues:PhyPosBlock := {|| ::nRecno }
::oValues:LastPosBlock := {|| LEN(::aData) }
::oValues:FirstPosBlock := {|| 1 }
::oValues:HScroll := .F.
::oValues:VScroll := .F.
::oValues:SizeCols := .F.
::oValues:CursorMode := XBPBRW_CURSOR_ROW
nicht verwirren lassen das beim Array Class Code benutzt wurde und
bei der DBF nicht (typisch Alaska ...), aber man sieht wohl deutlich die
unterschiede.
Nun die :datalink
Code: Alles auswählen
DBF
imax := FCount()
aStruct := DbStruct()
FOR i:=1 TO imax
IF .NOT. aStruct[i,2] $ "BOVTXY"
oBrowse:addColumn( FieldBlockTrimmed(aStruct[i,1], aStruct[i,2]), , aStruct[i,1] )
ENDIF
NEXT
FUNCTION FieldBlockTrimmed( cFieldName, cType )
LOCAL bBlock
IF FieldPos( cFieldName ) <> 0
IF ! "->" $ cFieldName
cFieldName := "FIELD->"+cFieldName
ENDIF
IF cType = "C"
bBlock := &( "{|x| IIf(x==NIL,RTrim("+cFieldName+"),"+cFieldName+":=x) }" )
ELSE
bBlock := &( "{|x| IIf(x==NIL,"+cFieldName+","+cFieldName+":=x) }" )
ENDIF
ENDIF
RETURN bBlock
********************************************************
ARRAY:
::aData := { { "Januar", 1200 }, ;
...
::oValues:AddColumn ( {|| ::aData[::nRecno,1] }, , "Monat" )
::oValues:AddColumn ( {|| ::aData[::nRecno,2] }, , "Einkommen" )
...
:DataLink := { | cValue | IIF ( cValue != NIL, ;
::aData[::nRecno][2] := VAL ( cValue ),;
ALLTRIM ( STR ( ::aData[::nRecno][2] ) ) ) }
bei der DBF wird also ein :datalink zum FELD der DBF hergestellt und
beim Array ist der .datalink mit dem Element eines Array verbunden.
tja das war es den auch schon, viel Erfolg mit deinem Browser.
gruss by OHR
Jimmy