XbpBrowse mit Array

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
Roger
Rookie
Rookie
Beiträge: 10
Registriert: Do, 17. Mai 2007 7:59

XbpBrowse mit Array

Beitrag 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?
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: XbpBrowse mit Array

Beitrag 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
Antworten