Array anzeigen mit Tbrowse()

Auf dem Weg von Clipper, FoxPro u.ä. nach Xbase++

Moderator: Moderatoren

Antworten
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Array anzeigen mit Tbrowse()

Beitrag von saul »

Hallo,
ich wollte mir ein Array mit Dateinamen mit Tbrowse() anzeigen lassen. Leider funktioniert die Spaltenbildung nicht.

Code: Alles auswählen

   setcursor(0)
   afiles = directory(verzeich+"\bezug\*.pdf")
   anzdat=len(afiles)

   tausw:=tbrowse():new(7,08,20,68)
   FOR n:=1 TO anzdat          
      oTBColumn:= tbcolumn():new("Info Nr.",{|| afiles[i,F_NMAE]})
      tausw : AddColumn( oTBColumn ) 
   NEXT

   do while .t.
      tausw:forcestable()
      minkey:=inkey(0)
      finfoedit1()           // Regel Programverlauf
      if minkey=27 .or. chr(minkey)$"eE"
         exit
      endif
      dummy= tbapplykey(tausw, minkey)
   enddo
weiß jemand Rat?
Danke
Wolfgang
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array anzeigen mit Tbrowse()

Beitrag von brandelh »

Hi,

ich kann momentan nicht auf Xbase++ und deren Hilfe zugreifen, aber wenn das kein Übertragungsfehler ist, ist da ein Tippfehler:
saul hat geschrieben:Hallo,

Code: Alles auswählen

      oTBColumn:= tbcolumn():new("Info Nr.",{|| afiles[i,F_NMAE]})
F_NAME ist richtig. Hast du auch weiter oben #include "directry.ch" eingebunden ?

Wo genau liegt dein Problem ?
(ich muss zugeben, dass ich schon ewig kein TBrowse mehr nutze, aber zu dem Thema - speziell mit Arrays - gab es schon einiges, suche mal nach TBrowse ...
Gruß
Hubert
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Beitrag von saul »

Hallo,
stimmt, da hat sich ein Schreibfehler eingeschlichen. Aber auch mit F_NAME richtig geschrieben bleibt die Fehlermeldung.

Mein Problem ist, das ich nicht weiß wie die Zeile aussieht um ein Array als Spalte anzuzeigen.

Code: Alles auswählen

  oTBColumn  := TBColumn():new( "Heading", FieldBlock("name")  ) 
erzeugt eine Spalte in Tbrowse() für ein Feld einer Datenbank.

Wie heißt diese Zeile bei einem Array welches ich mit anzeigen lassen möchte?
Wolfgang
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
saul hat geschrieben: Mein Problem ist, das ich nicht weiß wie die Zeile aussieht um ein Array als Spalte anzuzeigen.

Code: Alles auswählen

  oTBColumn  := TBColumn():new( "Heading", FieldBlock("name")  ) 
erzeugt eine Spalte in Tbrowse() für ein Feld einer Datenbank.

Wie heißt diese Zeile bei einem Array welches ich mit anzeigen lassen möchte?
siehe dir mal die Beispiele :
C:\ALASKA\XPPW32\SOURCE\samples\basics\GuiBrow\FBROWSE.prg
C:\ALASKA\XPPW32\SOURCE\samples\basics\GuiBrow\EBROWSE.prg
an. Das sind Browser mit Arrays.
Ok die sind GUI, aber das Prinzip mit Arrays ist das selbe.

Code: Alles auswählen

// das geht NICHT so ! 
   FOR i:=1 TO anzdat          
      oTBColumn:= tbcolumn():new("Info Nr.",{|| afiles[i,F_NAME]}) 
      tausw : AddColumn( oTBColumn ) 
   NEXT 
Dein 1st. Problem ist das dein Codeblock "so" nicht stimmt. Das "i"
(war vorher "n" ) in deinem Codeblock {|| afiles[i,F_NAME]}
stimmt nicht zur Laufzeit sondern hat "immer" den Wert "anzdat".

Code: Alles auswählen

   FOR i:=1 TO anzdat          
      oCol := tbcolumn():new()
      oCol:heading := "Info Nr."
      bBlock := "{|| afiles["+ STR(i) + ",F_NAME]}"
      oCol:block     :=  &bBlock 
      tausw : AddColumn( oCol ) 
   NEXT 
nun aber zu deinem 2nd. "Problem" : Du hast keinen "passenden" Array
"Skipper" den der "normale" von TBrowse ist ja für DBF mit SKIP etc ...

Code: Alles auswählen

:skipBlock     := {| nSkip | - np+(np := MAX(1,MIN(LEN(aArray),np+nSkip)))}
:goTopBlock    := {|| np := 1}
:goBottomBlock := {|| np := LEN(aArray)}
:posBlock      := {|| np}
:phyPosBlock   := {|| np}
:lastPosBlock  := {|| LEN(aArray)}
:firstPosBlock := {|| 1}
Dieses wäre nun ein 1-Dim Skipper. "np" ist also der "bewegliche" Teil
und entspricht sowas wie RECNO() bei DBF zum navigieren im Browse.
gruss by OHR
Jimmy
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Beitrag von saul »

Hallo,
habe meinen Code jetzt so umgebaut.

Code: Alles auswählen

   setcursor(0)
   afiles = directory(verzeich+"\bezug\*.pdf")
   anzdat=len(afiles)

   tausw:=tbrowse():new(7,08,20,68)

	tausw:skipBlock     := {| nSkip | - np+(np := MAX(1,MIN(LEN(afiles),np+nSkip)))}
	tausw:goTopBlock    := {|| np := 1}
	tausw:goBottomBlock := {|| np := LEN(afiles)}
*	tausw:posBlock      := {|| np}
*	tausw:phyPosBlock   := {|| np}
*	tausw:lastPosBlock  := {|| LEN(afiles)}
*	tausw:firstPosBlock := {|| 1}

   FOR n:=1 TO anzdat
   	oCol := tbcolumn():new()
   	oCol:heading := "Info Nr."
   	bBlock := "{|| afiles["+ STR(i) + ",F_NAME]}"
   	oCol:block     :=  &bBlock
   	tausw : AddColumn( oCol )
   NEXT

    do while .t.
      tausw:forcestable()
      minkey:=inkey(0)
      finfoedit1()           // Regel Programverlauf
      if minkey=27 .or. chr(minkey)$"eE"
         exit
      endif
      dummy= tbapplykey(tausw, minkey)
   enddo


Jetzt bekomme ich eine Fehlermeldungen:
Wenn ich das erste * weglasse
Fehler Base/2240
Beschreibung: Member-Variable ist für dieses Object unbekannt
Operation: posblock

Mit dem *:
Fehler Base/1012
Beschreibung: Fehler bei der Arrayindizierung
Operation: <Aof13>[<184>]
Aufgerufen von tausw:forcestable()

Wolfgang
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
saul hat geschrieben: FOR n:=1 TO anzdat
...
bBlock := "{|| afiles["+ STR(i) + ",F_NAME]}"
Dein Zähler ist n nicht i und im Skipper steht np ...
gruss by OHR
Jimmy
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Beitrag von saul »

Hallo,
jetzt bekomme ich eine Fehlermeldung bei tausw:forcestable.
Die Beispiele sind für mich zu kompliziert, da sehr viele Funktionen zusammengefast sind.
Was ich nicht verstehe ist:
mit Directory() erzeuge ich ein 2 dimensionales Array. Mit len(Array) ermittle ich die Anzahl der Datensätze. Wenn ich jetzt eine Schleife mit for I = 1 to len(Array) bilde und dort den Codeblock {|| afiles[i, NAME]} einsetze, dann werden doch len(Array) Anzahl von Spalten gebildet.
Lasse ich mir ? afiles[i, NAME] anzeigen, so erhalte ich jeweils den Namen der Datei.
Bedeutet das nicht, dass ich Spalten aus den Dateiname erzeuge?
mfg
Wolfgang
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
saul hat geschrieben: Bedeutet das nicht, dass ich Spalten aus den Dateiname erzeuge?
JA ... und nun merke ich langsam was du überhaupt willst.

Die ganze FOR/NEXT ist bei dir überflüssig da du ja nur 1 Spalte haben
willst ... also eigendlich ein ACHOISE nur eben mit TB.

Code: Alles auswählen

#include "Directry.ch"

PROCEDURE MAIN
LOCAL afiles
LOCAL np := 1
LOCAL anzdat
LOCAL tausw
LOCAL dummy
LOCAL minkey

   cls
   setcursor(0)
   afiles = directory("*.prg")

   tausw:=tbrowse():new(7,08,20,68)
   tausw:skipBlock     := {| nSkip | - np+(np := MAX(1,MIN(LEN(afiles),;
                                                     np+nSkip)))}
   tausw:goTopBlock    := {|| np := 1}
   tausw:goBottomBlock := {|| np := LEN(afiles)}

   tausw:ADDCOLUMN( TBCOLUMNNEW( "Info Nr.",;
                                 { || PAD(afiles[ np, F_NAME ],12) } ) )
   do while .t.
      tausw:forcestable()
      minkey:=inkey(0)
*      finfoedit1()           // Regel Programverlauf
      if minkey=27 .or. chr(minkey)$"eE"
         exit
      endif
      dummy= tbapplykey(tausw, minkey)
   enddo

RETURN
gruss by OHR
Jimmy
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Beitrag von saul »

Hallo,
das ist genau das was ich gebraucht habe. Dazu noch einige Fragen falls möglich:
1. Was bedeutet PAD(), habe ich in der Xbase Hilfe nicht gefunden

2. Die Variable np bei afiles[np,F_NAME) muß scheinbar die gleiche sein wie bei den Navigationsausdrücken. Wenn ich da nur p einsetze und local p=1 setze funktioniert die Sache nicht. np ist aber zu Anfang auch nur auf 1 gesetzt. Wodurch kommt die unterschiedliche Behandlung?

3. Was macht nskip hier? Ist das eine Variable? Wo kommt diese her und wo ist diese definiert?

4. Und jetzt die wichtigste Frage für mich. Wie kommt man zu diesem Ergebnis? In der ganzen Hilfe habe ich keinen Hinweis auf eine solche Lösung gefunden. Hast Du noch weitergehende Lektüre zu xbase++?

Danke
Wolfgang
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
saul hat geschrieben: 1. Was bedeutet PAD(), habe ich in der Xbase Hilfe nicht gefunden

2. Die Variable np bei afiles[np,F_NAME) muß scheinbar die gleiche sein wie bei den Navigationsausdrücken. Wenn ich da nur p einsetze und local p=1 setze funktioniert die Sache nicht. np ist aber zu Anfang auch nur auf 1 gesetzt. Wodurch kommt die unterschiedliche Behandlung?

3. Was macht nskip hier? Ist das eine Variable? Wo kommt diese her und wo ist diese definiert?

4. Und jetzt die wichtigste Frage für mich. Wie kommt man zu diesem Ergebnis? In der ganzen Hilfe habe ich keinen Hinweis auf eine solche Lösung gefunden. Hast Du noch weitergehende Lektüre zu xbase++?
ad 1.) Du hast Recht, in den Help File steht nur PadC() | PadL() | PadR()

ad 2.) JA. Wie du richtig sagt ist "np" auch im "Skipper", also kann auch
nur das "wirken"

ad 3.) "nSkip" steht hier im Parameter Teil ( " | nSkip | ") d.h. du erhälst
den "Wert" vom TBrowse.

ad 4.) ... über 20 Jahre Cl*pper/Xbase++ ...
und Nein es gibt keine Lektüre zu Xbase++ ausser Devcon Referate und
einigen Artikel von Usern (Clayton Jones GUI "Fenster")

.... aber dafür gibt es hier das Forum und Fragen sind gerne willkommen.
gruss by OHR
Jimmy
Antworten