Seite 1 von 1

XbpBrowse mit Array

Verfasst: Di, 05. Jun 2007 23:40
von Roger
Hi,

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.

Gibt es solche Beispiele (mit Funktionalität zum Bearbeiten von Zellen sowie zum Einfügen und Löschen von Zeilen)?

Vielen Dank für jeden Tipp!

Gruss, Roger

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?

Re: XbpBrowse mit Array

Verfasst: Mi, 06. Jun 2007 1:16
von AUGE_OHR
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