ich habe eine Funktion Tabelle, die vieles macht, vielleicht kann die dir helfen.
Code: Alles auswählen
*------------------------------------------------------- tabelle ------
procedure tabelle ( o,l,u,r,dat_alias,afelder,afeld_name,fest,auswahl,;
bildretten,hilfe,SatzNr, FarbString )
// o , l , u , r Positionen des Fensters
// dat_alias Alias in dem die Datei ge”ffnet ist z.B. "DRUCK"
// afelder Array mit den Feldnamen, bzw. Codeblocks !
// z.B. recno() -> {|| recno() }
// normale Funktionen mssen als CODEBLOCK definiert sein !
// afeld_name Array mit den šberschriftennamen fr die Feldnamen
// fest Ab welcher Spalte links eingefroren wird
// auswahl wenn .t., kann Anzeige mit Enter beendet werden.
// bildretten wenn .t., dann Bildschirm sichern und zurcksetzen
// hilfe Text, welcher an Hilfeprozedur bergeben werden soll
// SatzNr Falls anzuzeigende Datei mit Seek bewegt wurde, und
// somit nicht auf dem 1. Satz steht, muá fr Laufbalken-
// die logische Satznummer (Dateiposition) angegeben
// werden. Ungef„hrer Wert reicht aus. NIL -> 1
// Farbstring Farbdefinition fr Anzeige
// Anzeige einer Datenbank mit Laufbalken
local otab,altselect,altcolor,altscreen,altcursor,x,t,datpos,zeipos
local zeimax,zeiprosatz,log_recn
if farbstring=NIL
farbstring=if(farbe,"w+/g,w+/n,n/w","w/n,u,n/w")
endif
if auswahl=NIL // Standard ist mit Enter kein Ende
auswahl=.f.
endif
if bildretten=NIL // Standard ist Bild sichern und
bildretten=.t. // zurcksetzen
endif
if hilfe=NIL
hilfe=""
endif
if fest=NIL
fest=0
endif
if bildretten
altscreen =savescreen( o, l, u, r )
endif
altselect =select()
altcolor =setcolor()
altcursor =setcursor(0)
if SatzNr=NIL
log_recn = 1 // wegen Indexdatei wird
// Satznummer selbst hochge-
// z„hlt, und nicht mit
// recno() ermittelt.
else
log_recn = max( SatzNr , 1 ) // mindestens 1
endif
zeimax= u - o + 1 // Anzahl der Anzeigepositionen
// des Rollbalkens
select (dat_alias)
otab:=tbrowseDB( o, l, u, r-1 ) // Tabellenobject
otab:headSep := "ÄÅÄ" // Kopf- und Spalten
otab:colSep := " ³ " // trennzeichen setzen
otab:colorspec := farbstring
* Die SKIP, GO TOP und GO BOTTOM mssen wegen Laufbalken bei Index
* ge„ndert werden !
* ACHTUNG log_recn muá per Referenz bergeben werden ( @ ) !!!!
* SKIP Funktion setzt logische Satznummer.
* Wichtig fr Index !
otab:skipBlock := { |x| tab_skipper(x, @log_recn ) }
otab:GoTopBlock := { || tab_gotop( @log_recn ) }
otab:GoBottomBlock := { || tab_gobottom( @log_recn ) }
// TB Spalten erzeugen, je nach Parameter
do case
case valtype(afelder)="A" .and. valtype(afeld_name)="A"
* Felderliste und Feldnamensliste wurden bergeben, verwenden !
for x = 1 to len(afelder)
if valtype( afelder[x] ) = "B"
otab:addColumn( TBColumnNew( afeld_name[x] , afelder[x] ))
else
otab:addColumn( TBColumnNew( afeld_name[x] , ;
fieldwblock( afelder[x], select() ) ))
endif
next
case valtype(afelder)="A"
* NUR Felderliste wurde bergeben, richtige Feldnamen anzeigen
for x = 1 to len(afelder)
if valtype( afelder[x] ) = "B"
otab:addColumn( TBColumnNew( afelder[x] , afelder[x] ))
else
otab:addColumn( TBColumnNew( afelder[x] , ;
fieldwblock( afelder[x], select() ) ))
endif
next
otherwise // sonst alle Felder mit richtigem Namen
for x = 1 TO fcount()
otab:addColumn( TBColumnNew( fieldname(x) , ;
fieldwblock( fieldname(x), select() ) ))
next
endcase
otab:freeze:= fest // Feste Spalten
do while .t.
do while ! otab:stable
otab:stabilize() // Alle Daten korrekt anzeigen
enddo
// Rollbalken anzeigen
datpos = log_recn / recc() // Datenpositon des aktuellen
// Datensatzes im Verh„ltnis
// zur Anzahl der S„tze
zeiprosatz=int(zeimax / recc()+.99)
zeipos = int(zeimax-1)*datpos // Position des Zeigers
for x=o to u // Anzeigebereich zurcksetzen
devpos( x,r )
do case
case x=o
devout( "A",if(farbe,"w/b","w"))
case x=u
devout( "E",if(farbe,"w/b","w"))
otherwise
devout( "º",if(farbe,"w/b","w"))
end case
next
if zeiprosatz < 1
devpos( o + zeipos ,r ) // Position anzeigen
devout( "*" ,if(farbe,"w+/n","w+"))
else
for x=o+zeipos-zeiprosatz+1 to o+zeipos
devpos( x ,r ) // Position anzeigen
devout( "*" ,if(farbe,"w+/n","w+"))
next
endif
otab:colorRect( {otab:rowpos,1,otab:rowpos,otab:colcount} ,;
{2,3} ) // Cursorzeile hervorheben
t=inkey(0)
otab:colorRect( {otab:rowpos,1,otab:rowpos,otab:colcount} ,;
{1,2} ) // Cursorzeile auf Standard !
do case // Auf Taste reagieren !
case t=K_UP // Pfeil auf 1 Satz aufw„rts
otab:up()
case t=K_DOWN // Pfeil ab 1 Satz abw„rts
otab:down()
case t=K_RIGHT // Pfeil rechts 1 Feld rechts
otab:panright() // als Bildschirm rollen
case t=K_LEFT // Pfeil links 1 Feld links
otab:panleft() // als Bildschirm rollen
case t=K_HOME // POS1 1. Feld der Zeile
otab:panhome()
case t=K_END // ENDE letztes Feld in Zeile
otab:panend()
case t=K_PGUP // Bild auf -> Seite auf
otab:pageup()
case t=K_PGDN // Bild ab -> Seite ab
otab:pagedown()
case t=K_CTRL_PGUP // STRG+Bild auf -> 1. Zeile
otab:gotop()
case t=K_CTRL_PGDN // STRG+Bild ab -> letzte Z.
otab:gobottom()
case t=K_CTRL_HOME
otab:gotop()
otab:panhome()
case t=K_CTRL_END
otab:gobottom()
otab:panhome()
// Funktionstasten // abarbeiten
case t=K_F1 .and. f[1]=.t. // Hilfetext
help( "ANZEIGEN",0,HILFE )
case t=K_CTRL_F1 .and. f[1]=.t. // Hilfetext „ndern
helpedit("ANZEIGEN",0,HILFE )
case t=K_F3 .or. t=K_ESC // Ende der Anzeige
exit
case t=K_F12 .and. f[12]=.t. // Ende des Programmes
do prog_ende
case t=K_ENTER .and. auswahl=.t. // In Auswahllisten ist
exit // Enter eine Endetaste.
endcase
enddo
if bildretten
restscreen( o, l, u, r ,altscreen )
endif
select (altselect)
setcolor(altcolor)
setcursor(altcursor)
return
*---------------------------------------------------------- TAB_SKIPPER --
static function tab_skipper ( anzahl,log_recn )
* die log_recn (logische Satznummer) wird von der SKIP Funktion jeweils
* angepaát. Dies ist die einzig sichere Methode fr Dateien mit und ohne
* Index. Fr Filter jedoch noch nicht ganz ausreichend.
* ACHTUNG log_recn muá per Referenz bergeben werden ( @ ) !!!!
local x
x := 0
if anzahl == 0 .OR. recc()== 0
go recno() // Puffer neu lesen, rest ok !
elseif anzahl > 0 .and. recno() != recc() + 1
// vorw„rts
do while x < anzahl
skip 1
if ( eof() )
skip -1
log_recn=recc()
exit
endif
log_recn=MIN(log_recn+1,recc()) //erfolgreich, logische Satznummer
// erh”hen. H”chstwert = recc()
x++ // Z„hler der durchzufhrenden SKIP
// erh”hen
enddo
elseif anzahl < 0
// rckw„rts
do while x > anzahl
skip -1
if ( bof() )
log_recn=1 // Dateianfang = 1. log. Satz
exit
endif
log_recn=MAX(log_recn-1,1) // erfolgreich, logische Satznummer
// senken, kleinster Wert = 1
x-- // Z„hler der durchzufhrenden SKIP
// senken
enddo
endif
RETURN x
*---------------------------------------------------------- TAB_GOTOP --
static function tab_GOTOP ( log_recn )
* die log_recn (logische Satznummer) wird von der Funktion jeweils
* angepaát. Dies ist die einzig sichere Methode fr Dateien mit und ohne
* Index. Fr Filter jedoch noch nicht ganz ausreichend.
* ACHTUNG log_recn muá per Referenz bergeben werden ( @ ) !!!!
go top
log_recn=1
return( NIL )
*---------------------------------------------------------- TAB_GOBOTTOM --
static function tab_GOBOTTOM ( log_recn )
* die log_recn (logische Satznummer) wird von der Funktion jeweils
* angepaát. Dies ist die einzig sichere Methode fr Dateien mit und ohne
* Index. Fr Filter jedoch noch nicht ganz ausreichend.
* ACHTUNG log_recn muá per Referenz bergeben werden ( @ ) !!!!
go bottom
log_recn=recc()
return( NIL )