Arrays und Ihre Verwendungsmöglichkeiten?!? [ERLEDIGT]

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von messing »

So, hoffe ich hab die richtige Vorbereitung getroffen.
Bitte mal ne kleine Hilfe, wie ich das Array in die Tabelle bekomme, und auch Zur Anzeige bringe.

Code: Alles auswählen

#define EK_ARTIKEL		1
#define EK_PREIS		2
#define EK_STUECK		3
#define EK_GESBETRAG	4
#define EK_DATUM		5
#define EK_BEZAHLT		6

#include "inkey.ch"
PROCEDURE main
local aArray
local ek_artikel,ek_preis,ek_stueck,ek_gesbetrag,ek_datum,ek_bezahlt
local taste
local nChoice
local oTBrowse

aArray:={}
ek_artikel:=Space(30)
ek_preis:=0
ek_stueck:=0
ek_gesbetrag:=0
ek_datum:=ctod("")
ek_bezahlt:=0

set confirm on
set decimals to 2
cls

      oTBrowse := TBrowse():new( 0,1,15,79 ) 
      oTBrowse:headSep       := Chr(205) + Chr(205) + Chr(205)  
      oTBrowse:colSep        := Chr(32)  + Chr(179) + Chr(32) 
      oTBrowse:colorSpec     := "N/BG,W+/B,N/R,W+/R" 





@ 21,01 say "F5 - Artikel"
@ 21,20 say "ESC - Ende"

do while taste<>K_ESC
	DO WHILE .NOT. oTBrowse:stabilize() 
    	IF (taste := Inkey()) <> 0 
        	EXIT 
       	ENDIF 
   	ENDDO 
    IF oTBrowse:stable 
    	taste := Inkey(0) 
    ENDIF 


	do case
		case taste=K_F5
			@ 17,01 say "Artikel: " get ek_artikel
			@ 17,45 say "Preis: " get ek_preis
			@ 18,01 say "Menge: " get ek_stueck
			@ 18,40 say "Ges.Betrag: " get ek_gesbetrag
			@ 19,01 say "Wann: " get ek_datum
			@ 19,40 say "Bezahlt: " get ek_bezahlt
			read
			AAdd( aArray,{ek_artikel,ek_preis,ek_stueck,ek_gesbetrag,ek_datum,ek_bezahlt} )
		case taste=K_ESC
			quit
	endcase
enddo
return

* Programmende  EOF *
Gruß
Messing
Gruß
Bruno
Messing
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

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von AUGE_OHR »

messing hat geschrieben:Bitte mal ne kleine Hilfe, wie ich das Array in die Tabelle bekomme, und auch Zur Anzeige bringe.

Code: Alles auswählen

oTBrowse := TBrowse():new( 0,1,15,79 ) 
      oTBrowse:headSep       := Chr(205) + Chr(205) + Chr(205)  
      oTBrowse:colSep        := Chr(32)  + Chr(179) + Chr(32) 
      oTBrowse:colorSpec     := "N/BG,W+/B,N/R,W+/R" 
das kommt erst "später" wenn du das Array hast
messing hat geschrieben:

Code: Alles auswählen

@ 21,01 say "F5 - Artikel"
@ 21,20 say "ESC - Ende"

do while taste<>K_ESC
	DO WHILE .NOT. oTBrowse:stabilize() 
    	IF (taste := Inkey()) <> 0 
        	EXIT 
       	ENDIF 
   	ENDDO 
    IF oTBrowse:stable 
    	taste := Inkey(0) 
    ENDIF 

	do case
		case taste=K_F5
			@ 17,01 say "Artikel: " get ek_artikel
			@ 17,45 say "Preis: " get ek_preis
			@ 18,01 say "Menge: " get ek_stueck
			@ 18,40 say "Ges.Betrag: " get ek_gesbetrag
			@ 19,01 say "Wann: " get ek_datum
			@ 19,40 say "Bezahlt: " get ek_bezahlt
			read
			AAdd( aArray,{ek_artikel,ek_preis,ek_stueck,ek_gesbetrag,ek_datum,ek_bezahlt} )
		case taste=K_ESC
*			quit
EXIT
	endcase
enddo
//
// jetzt den Browser aufbauen mit dem Array
//
DoMyBrowse(aArray ...)
return
und so könnte es aussehen

Code: Alles auswählen

STATIC nLastRec := 0
STATIC nRecno   := 0

PROCEDURE DoMyBrowse(aArray,nTop, nLeft, nBottom, nRight)

   nLastRec := LEN(aArray)
   nRecno   := 1

   * Browser initialisieren
   oTbrowse := TBrowse():new(nTop, nLeft, nBottom, nRight)

   * Skip und Navigationsbloecke fuer den Browser initialisieren
   oTbrowse:SkipBlock     := {|nSkip,oBrowse| MySkip(nSkip,oBrowse) }
   oTbrowse:GoBottomBlock := {|| nRecno := LEN(aArray) }
   oTbrowse:GoTopBlock    := {|| nRecno := 1 }
   oTbrowse:PosBlock      := {|| nRecno }
   oTbrowse:PhyPosBlock   := {|| nRecno }
   oTbrowse:LastPosBlock  := {|| LEN(aArray) }
   oTbrowse:FirstPosBlock := {|| 1 }

   oTbrowse:Create ()

   //
   // die einzeile Columne zufgen
   //
   oTbrowse:AddColumn ( {|| aArray[nRecno,1] }, , "Artikel" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,2] }, , "Preis" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,3] }, , "Stueck" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,4] }, , "Gesbetrag" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,5] }, , "Datum" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,6] }, , "Bezahlt" )

   TBSetFocus( oTBrowse )             // TBrowse aktivieren

RETURN

PROCEDURE TBSetFocus( oTBrowse )
//
// siehe TBrowse()
//
...

   TBNavigate( oTBrowse, nKey )

RETURN

FUNCTION TBNavigate( oTBrowse, nKey )
//
// siehe TBrowse()
//
...

RETURN lReturn

FUNCTION MySkip( nSkip )
LOCAL nCanSkip
   //
   // nRecno und nLastRec sind STATIC "ganz oben" im PRG, also fieldwide
   //
   IF nRecno + nSkip < 1               // "BoF"
      nCanSkip := 1 - nRecno
      TONE ( 1000 )
   ELSEIF nRecno + nSkip > nLastRec  // "EoF"
      nCanSkip := nLastRec - nRecno
      TONE ( 500 )
   ELSE
      nCanSkip := nSkip
   ENDIF

   nRecno += nCanSkip

RETURN nCanSkip
gruss by OHR
Jimmy
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von messing »

AUGE_OHR hat geschrieben:
messing hat geschrieben:Bitte mal ne kleine Hilfe, wie ich das Array in die Tabelle bekomme, und auch Zur Anzeige bringe.

Code: Alles auswählen

oTBrowse := TBrowse():new( 0,1,15,79 ) 
      oTBrowse:headSep       := Chr(205) + Chr(205) + Chr(205)  
      oTBrowse:colSep        := Chr(32)  + Chr(179) + Chr(32) 
      oTBrowse:colorSpec     := "N/BG,W+/B,N/R,W+/R" 
das kommt erst "später" wenn du das Array hast
messing hat geschrieben:

Code: Alles auswählen

@ 21,01 say "F5 - Artikel"
@ 21,20 say "ESC - Ende"

do while taste<>K_ESC
	DO WHILE .NOT. oTBrowse:stabilize() 
    	IF (taste := Inkey()) <> 0 
        	EXIT 
       	ENDIF 
   	ENDDO 
    IF oTBrowse:stable 
    	taste := Inkey(0) 
    ENDIF 

	do case
		case taste=K_F5
			@ 17,01 say "Artikel: " get ek_artikel
			@ 17,45 say "Preis: " get ek_preis
			@ 18,01 say "Menge: " get ek_stueck
			@ 18,40 say "Ges.Betrag: " get ek_gesbetrag
			@ 19,01 say "Wann: " get ek_datum
			@ 19,40 say "Bezahlt: " get ek_bezahlt
			read
			AAdd( aArray,{ek_artikel,ek_preis,ek_stueck,ek_gesbetrag,ek_datum,ek_bezahlt} )
		case taste=K_ESC
*			quit
EXIT
	endcase
enddo
//
// jetzt den Browser aufbauen mit dem Array
//
DoMyBrowse(aArray ...)
return
und so könnte es aussehen

Code: Alles auswählen

STATIC nLastRec := 0
STATIC nRecno   := 0

PROCEDURE DoMyBrowse(aArray,nTop, nLeft, nBottom, nRight)

   nLastRec := LEN(aArray)
   nRecno   := 1

   * Browser initialisieren
   oTbrowse := TBrowse():new(nTop, nLeft, nBottom, nRight)

   * Skip und Navigationsbloecke fuer den Browser initialisieren
   oTbrowse:SkipBlock     := {|nSkip,oBrowse| MySkip(nSkip,oBrowse) }
   oTbrowse:GoBottomBlock := {|| nRecno := LEN(aArray) }
   oTbrowse:GoTopBlock    := {|| nRecno := 1 }
   oTbrowse:PosBlock      := {|| nRecno }
   oTbrowse:PhyPosBlock   := {|| nRecno }
   oTbrowse:LastPosBlock  := {|| LEN(aArray) }
   oTbrowse:FirstPosBlock := {|| 1 }

   oTbrowse:Create ()

   //
   // die einzeile Columne zufgen
   //
   oTbrowse:AddColumn ( {|| aArray[nRecno,1] }, , "Artikel" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,2] }, , "Preis" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,3] }, , "Stueck" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,4] }, , "Gesbetrag" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,5] }, , "Datum" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,6] }, , "Bezahlt" )

   TBSetFocus( oTBrowse )             // TBrowse aktivieren

RETURN

PROCEDURE TBSetFocus( oTBrowse )
//
// siehe TBrowse()
//
...

   TBNavigate( oTBrowse, nKey )

RETURN

FUNCTION TBNavigate( oTBrowse, nKey )
//
// siehe TBrowse()
//
...

RETURN lReturn

FUNCTION MySkip( nSkip )
LOCAL nCanSkip
   //
   // nRecno und nLastRec sind STATIC "ganz oben" im PRG, also fieldwide
   //
   IF nRecno + nSkip < 1               // "BoF"
      nCanSkip := 1 - nRecno
      TONE ( 1000 )
   ELSEIF nRecno + nSkip > nLastRec  // "EoF"
      nCanSkip := nLastRec - nRecno
      TONE ( 500 )
   ELSE
      nCanSkip := nSkip
   ENDIF

   nRecno += nCanSkip

RETURN nCanSkip
Erstmal vielen Dank,

Beim Datenbankbrowsen war das einfacher, deshalb muß ich erstmal die Schritte nachvollziehen, umgangssprachlich "erstmal fressen" :D

Gruß

Messing
Gruß
Bruno
Messing
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: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von brandelh »

AUGE_OHR hat geschrieben:
brandelh hat geschrieben:INKEY(0) verbraucht keine Rechenzeit (unter 2% Systemlast inkl. Taskmanager) und ist somit kein Problem !
hm ... und in einer TBrowse Schleife und :PgDn() während er bei "aufbauen" ist ?
Wenn ich eine laufende Schleife habe, die nicht durch Inkey(0) angehalten werden soll, dann ist das natürlich was anders ;-)

Im Beispiel mit TBrowse ...

Code: Alles auswählen

    IF oTBrowse:stable
       taste := Inkey(0)
    ENDIF 
wird inkey(0) aber ja erst aufgerufen, wenn die Anzeige stabil ist.

Tatsächlich habe ich die Aussage dass 'Inkey(0) mit Xbase++ gar nicht geht' aber globaler verstanden und
daher global widersprochen. Ob ein Wartezustand SINN macht kommt natürlich aufs Programm an.
Gruß
Hubert
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

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Wenn ich eine laufende Schleife habe, die nicht durch Inkey(0) angehalten werden soll, dann ist das natürlich was anders ;-)

Im Beispiel mit TBrowse ...

Code: Alles auswählen

    IF oTBrowse:stable
       taste := Inkey(0)
    ENDIF 
wird inkey(0) aber ja erst aufgerufen, wenn die Anzeige stabil ist.
Ich meine eigentlich die paar Zeiten "davor"

Code: Alles auswählen

  DO WHILE .NOT. oTBrowse:stabilize() 
     IF (nKey := Inkey(nTime)) <> 0 
        EXIT 
     ENDIF 
  ENDDO 
wobei nTime <> 0.0 sein (musste) damit er schon während des Seitenaufbaus (:stabilize() ) per :PgDn gleich weitermacht
brandelh hat geschrieben:Tatsächlich habe ich die Aussage dass 'Inkey(0) mit Xbase++ gar nicht geht' aber globaler verstanden und daher global widersprochen.
Ob ein Wartezustand SINN macht kommt natürlich aufs Programm an.
ok da hast du schon recht den einen "Wartezustand" will "ich" ja nicht (Programm Konzept).

Ich habe es auch lange nicht mehr "getestet", aber die aktuelle v1.9.355 scheint tatsächlich bei INKEY(0) nicht mehr "viel CPU" zu benötigen.
Ich habe es wohl nicht gemerkt da man unter GUI ja nun wirklich kein INKEY(0) braucht ... ;)
gruss by OHR
Jimmy
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von messing »

@Jimmy

Servus,

habe Prog. angepasst:

Code: Alles auswählen

#define EK_ARTIKEL                1
#define EK_PREIS                2
#define EK_STUECK                3
#define EK_GESBETRAG        4
#define EK_DATUM                5
#define EK_BEZAHLT                6

#include "inkey.ch"

STATIC nLastRec := 0
STATIC nRecno   := 0

PROCEDURE main
local aArray
local ek_artikel,ek_preis,ek_stueck,ek_gesbetrag,ek_datum,ek_bezahlt
local taste
local nChoice
local oTBrowse

aArray:={}
ek_artikel:=Space(30)
ek_preis:=0
ek_stueck:=0
ek_gesbetrag:=0
ek_datum:=ctod("")
ek_bezahlt:=0
taste:=0
set confirm on
set decimals to 2
cls

//DoMyBrowse(aArray,0,1,15,79)

@ 21,01 say "F5 - Artikel"
@ 21,20 say "ESC - Ende"

do while taste<>K_ESC
   taste:=inkey(0)
        do case
                case taste=K_F5
                        @ 17,01 say "Artikel: " get ek_artikel
                        @ 17,45 say "Preis: " get ek_preis
                        @ 18,01 say "Menge: " get ek_stueck
                        @ 18,40 say "Ges.Betrag: " get ek_gesbetrag
                        @ 19,01 say "Wann: " get ek_datum
                        @ 19,40 say "Bezahlt: " get ek_bezahlt
                        read
                        AAdd( aArray,{ek_artikel,ek_preis,ek_stueck,ek_gesbetrag,ek_datum,ek_bezahlt} )
                case taste=K_ESC
*                        quit
EXIT
        endcase
enddo
DoMyBrowse(aArray,0,1,15,79)

return

* Programmende  EOF *


PROCEDURE DoMyBrowse(aArray,nTop, nLeft, nBottom, nRight)

   nLastRec := LEN(aArray)
   nRecno   := 1

   * Browser initialisieren
   oTbrowse := TBrowse():new(nTop, nLeft, nBottom, nRight)

   * Skip und Navigationsbloecke fuer den Browser initialisieren
   oTbrowse:SkipBlock     := {|nSkip,oBrowse| MySkip(nSkip,oBrowse) }
   oTbrowse:GoBottomBlock := {|| nRecno := LEN(aArray) }
   oTbrowse:GoTopBlock    := {|| nRecno := 1 }
   oTbrowse:PosBlock      := {|| nRecno }
   oTbrowse:PhyPosBlock   := {|| nRecno }
   oTbrowse:LastPosBlock  := {|| LEN(aArray) }
   oTbrowse:FirstPosBlock := {|| 1 }

   oTbrowse:Create ()

   //
   // die einzeile Columne zufgen
   //
   oTbrowse:AddColumn ( {|| aArray[nRecno,1] }, , "Artikel" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,2] }, , "Preis" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,3] }, , "Stueck" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,4] }, , "Gesbetrag" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,5] }, , "Datum" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,6] }, , "Bezahlt" )

   TBSetFocus( oTBrowse )             // TBrowse aktivieren

RETURN

PROCEDURE TBSetFocus( oTBrowse )
      LOCAL nKey := 0
      DO WHILE nKey <> K_ESC
         DO WHILE .NOT. oTBrowse:stabilize()
            IF (nKey := Inkey()) <> 0
               EXIT
            ENDIF
         ENDDO
         IF oTBrowse:stable
            nKey := Inkey(0)
         ENDIF
         TBNavigate( oTBrowse, nKey )
      ENDDO
RETURN

FUNCTION TBNavigate( oTBrowse, nKey )
      LOCAL bBlock  := SetKey( nKey )
      LOCAL lReturn := .T.
      DO CASE
      CASE bBlock <> NIL        ; Eval( bBlock, oTBrowse )
      CASE nKey == K_DOWN       ; oTBrowse:down()
      CASE nKey == K_PGDN       ; oTBrowse:pageDown()
      CASE nKey == K_CTRL_PGDN  ; oTBrowse:goBottom()
      CASE nKey == K_LEFT       ; oTBrowse:left()
      CASE nKey == K_CTRL_LEFT  ; oTBrowse:panLeft()
      CASE nKey == K_HOME       ; oTBrowse:home()
      CASE nKey == K_CTRL_HOME  ; oTBrowse:panHome()
      CASE nKey == K_RIGHT      ; oTBrowse:right()
      CASE nKey == K_CTRL_RIGHT ; oTBrowse:panRight()
      CASE nKey == K_END        ; oTBrowse:end()
      CASE nKey == K_CTRL_END   ; oTBrowse:panEnd()
      CASE nKey == K_UP         ; oTBrowse:up()
      CASE nKey == K_PGUP       ; oTBrowse:pageUp()
      CASE nKey == K_CTRL_PGUP  ; oTBrowse:goTop()
      OTHERWISE
         lReturn:= .F.
      ENDCASE
RETURN lReturn

FUNCTION MySkip( nSkip )
LOCAL nCanSkip
   //
   // nRecno und nLastRec sind STATIC "ganz oben" im PRG, also fieldwide
   //
   IF nRecno + nSkip < 1               // "BoF"
      nCanSkip := 1 - nRecno
      TONE ( 1000 )
   ELSEIF nRecno + nSkip > nLastRec  // "EoF"
      nCanSkip := nLastRec - nRecno
      TONE ( 500 )
   ELSE
      nCanSkip := nSkip
   ENDIF

   nRecno += nCanSkip

RETURN nCanSkip
erhalte jetzt folgende ERROR-Meldung:

------------------------------------------------------------------------------
FEHLERPROTOKOLL von "c:\_AAA\arrlist.EXE" Datum: 21.04.2010 14:52:38

Xbase++ Version : Xbase++ (R) Version 1.90.331
Betriebssystem : Windows XP 05.01 Build 02600 Service Pack 3
------------------------------------------------------------------------------
oError:args :
-> VALTYPE: O CLASS: TBrowse
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: N
oError:cargo : NIL
oError:description : Member-Variable ist fr dieses Objekt unbekannt
oError:filename :
oError:genCode : 26
oError:operation : PosBlock
oError:osCode : 0
oError:severity : 2
oError:subCode : 2240
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von DOMYBROWSE(73)
Aufgerufen von MAIN(54)

Gruß
Messing
Gruß
Bruno
Messing
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von Martin Altmann »

Moin,
das gibt es alles nicht beim TBrowse:
  • PosBlock
  • PhyPosBlock
  • LastPosBlock
  • FirstPosBlock
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
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

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von AUGE_OHR »

messing hat geschrieben:@Jimmy

Servus,

habe Prog. angepasst:

Code: Alles auswählen

   oTbrowse:PosBlock      := {|| nRecno }
   oTbrowse:PhyPosBlock   := {|| nRecno }
   oTbrowse:LastPosBlock  := {|| LEN(aArray) }
   oTbrowse:FirstPosBlock := {|| 1 }
erhalte jetzt folgende ERROR-Meldung:
------------------------------------------------------------------------------
FEHLERPROTOKOLL von "c:\_AAA\arrlist.EXE" Datum: 21.04.2010 14:52:38

Xbase++ Version : Xbase++ (R) Version 1.90.331
Betriebssystem : Windows XP 05.01 Build 02600 Service Pack 3
------------------------------------------------------------------------------
oError:args :
-> VALTYPE: O CLASS: TBrowse
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: N
oError:cargo : NIL
oError:description : Member-Variable ist fr dieses Objekt unbekannt
oError:filename :
oError:genCode : 26
oError:operation : PosBlock
oError:osCode : 0
oError:severity : 2
oError:subCode : 2240
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von DOMYBROWSE(73)
Aufgerufen von MAIN(54)
sorry mein Fehler ... "man" sollte es vorher prüfen bevor man es veröffentlicht.
Die iVars :PosBlock, :PhyPosBlock, :LastPosBlock und :FirstPosBlock sind für XbpBrowse() gedacht und gibt es nicht bei Tbrowse, also bitte "rausnehmen"
gruss by OHR
Jimmy
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von messing »

Hai, :D wo schwimmt er denn? :D

Habe die vier Zeilen deaktiviert und erhalte jetzt den Fehler:

Code: Alles auswählen

#define EK_ARTIKEL                1
#define EK_PREIS                2
#define EK_STUECK                3
#define EK_GESBETRAG        4
#define EK_DATUM                5
#define EK_BEZAHLT                6

#include "inkey.ch"

STATIC nLastRec := 0
STATIC nRecno   := 0

PROCEDURE main
local aArray
local ek_artikel,ek_preis,ek_stueck,ek_gesbetrag,ek_datum,ek_bezahlt
local taste
local nChoice
local oTBrowse

aArray:={}
ek_artikel:=Space(30)
ek_preis:=0
ek_stueck:=0
ek_gesbetrag:=0
ek_datum:=ctod("")
ek_bezahlt:=0
taste:=0
set confirm on
set decimals to 2
cls

//DoMyBrowse(aArray,0,1,15,79)

@ 21,01 say "F5 - Artikel"
@ 21,20 say "ESC - Ende"

do while taste<>K_ESC
   taste:=inkey(0)
        do case
                case taste=K_F5
                        @ 17,01 say "Artikel: " get ek_artikel
                        @ 17,45 say "Preis: " get ek_preis
                        @ 18,01 say "Menge: " get ek_stueck
                        @ 18,40 say "Ges.Betrag: " get ek_gesbetrag
                        @ 19,01 say "Wann: " get ek_datum
                        @ 19,40 say "Bezahlt: " get ek_bezahlt
                        read
                        AAdd( aArray,{ek_artikel,ek_preis,ek_stueck,ek_gesbetrag,ek_datum,ek_bezahlt} )
                case taste=K_ESC
*                        quit
EXIT
        endcase
enddo
DoMyBrowse(aArray,0,1,15,79)

return

* Programmende  EOF *


PROCEDURE DoMyBrowse(aArray,nTop, nLeft, nBottom, nRight)

   nLastRec := LEN(aArray)
   nRecno   := 1

   * Browser initialisieren
   oTbrowse := TBrowse():new(nTop, nLeft, nBottom, nRight)

   * Skip und Navigationsbloecke fuer den Browser initialisieren
   oTbrowse:SkipBlock     := {|nSkip,oTBrowse| MySkip(nSkip,oTBrowse) }
   oTbrowse:GoBottomBlock := {|| nRecno := LEN(aArray) }
   oTbrowse:GoTopBlock    := {|| nRecno := 1 }
//   oTbrowse:PosBlock      := {|| nRecno }
//   oTbrowse:PhyPosBlock   := {|| nRecno }
//   oTbrowse:LastPosBlock  := {|| LEN(aArray) }
//   oTbrowse:FirstPosBlock := {|| 1 }

   oTbrowse:Create ()

   //
   // die einzeile Columne zufgen
   //
   oTbrowse:AddColumn ( {|| aArray[nRecno,1] }, , "Artikel" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,2] }, , "Preis" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,3] }, , "Stueck" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,4] }, , "Gesbetrag" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,5] }, , "Datum" )
   oTbrowse:AddColumn ( {|| aArray[nRecno,6] }, , "Bezahlt" )

   TBSetFocus( oTBrowse )             // TBrowse aktivieren

RETURN

PROCEDURE TBSetFocus( oTBrowse )
      LOCAL nKey := 0
      DO WHILE nKey <> K_ESC
         DO WHILE .NOT. oTBrowse:stabilize()
            IF (nKey := Inkey()) <> 0
               EXIT
            ENDIF
         ENDDO
         IF oTBrowse:stable
            nKey := Inkey(0)
         ENDIF
         TBNavigate( oTBrowse, nKey )
      ENDDO
RETURN

FUNCTION TBNavigate( oTBrowse, nKey )
      LOCAL bBlock  := SetKey( nKey )
      LOCAL lReturn := .T.
      DO CASE
      CASE bBlock <> NIL        ; Eval( bBlock, oTBrowse )
      CASE nKey == K_DOWN       ; oTBrowse:down()
      CASE nKey == K_PGDN       ; oTBrowse:pageDown()
      CASE nKey == K_CTRL_PGDN  ; oTBrowse:goBottom()
      CASE nKey == K_LEFT       ; oTBrowse:left()
      CASE nKey == K_CTRL_LEFT  ; oTBrowse:panLeft()
      CASE nKey == K_HOME       ; oTBrowse:home()
      CASE nKey == K_CTRL_HOME  ; oTBrowse:panHome()
      CASE nKey == K_RIGHT      ; oTBrowse:right()
      CASE nKey == K_CTRL_RIGHT ; oTBrowse:panRight()
      CASE nKey == K_END        ; oTBrowse:end()
      CASE nKey == K_CTRL_END   ; oTBrowse:panEnd()
      CASE nKey == K_UP         ; oTBrowse:up()
      CASE nKey == K_PGUP       ; oTBrowse:pageUp()
      CASE nKey == K_CTRL_PGUP  ; oTBrowse:goTop()
      OTHERWISE
         lReturn:= .F.
      ENDCASE
RETURN lReturn

FUNCTION MySkip( nSkip )
LOCAL nCanSkip
   IF nRecno + nSkip < 1               // "BoF"
      nCanSkip := 1 - nRecno
      TONE ( 1000 )
   ELSEIF nRecno + nSkip > nLastRec  // "EoF"
      nCanSkip := nLastRec - nRecno
      TONE ( 500 )
   ELSE
      nCanSkip := nSkip
   ENDIF

   nRecno += nCanSkip

RETURN nCanSkip

------------------------------------------------------------------------------
FEHLERPROTOKOLL von "c:\DISPO\_AAA\arrlist.EXE" Datum: 21.04.2010 15:12:38

Xbase++ Version : Xbase++ (R) Version 1.90.331
Betriebssystem : Windows XP 05.01 Build 02600 Service Pack 3
------------------------------------------------------------------------------
oError:args :
-> VALTYPE: B VALUE: {|| aArray[nRecno,1] }
-> VALTYPE: N VALUE: 15
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Parameter hat falschen Typ
oError:filename :
oError:genCode : 2
oError:operation : configure
oError:osCode : 0
oError:severity : 2
oError:subCode : 1025
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von TBSETFOCUS(97)
Aufgerufen von DOMYBROWSE(90)
Aufgerufen von MAIN(54)


Gruß
Messing
Gruß
Bruno
Messing
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: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von brandelh »

Hi,

frei aus der Hüfte würde ich schätzen, dass entweder das Array keine 15 Zeilen hat, oder das erste Feld der 15. Zeile nicht vorhanden bzw. nil ist.

Man sollte TBrowse() auch nicht mit einem leeren bzw. unpassenden Array aufrufen !

Code: Alles auswählen

aArray := {}  // leer, gibt fehler bei z.B. aArray[1,...]
aArray := { {"1","32",.....},;  // 1. Satz OK
                 NIL,;                 // oops leere Zeile mag er nicht
                {"3",NIL,.....} }    // NIL statt Text mag er auch nicht, Fehler bei aArray[3,2]
das Array muss also ein Abbild einer DBF sein, leere Felder mit " " auffüllen, Leerzeilen am Besten vermeiden oder komplett { "","",...} füllen.
Gruß
Hubert
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von messing »

brandelh hat geschrieben:Hi,

frei aus der Hüfte würde ich schätzen, dass entweder das Array keine 15 Zeilen hat, oder das erste Feld der 15. Zeile nicht vorhanden bzw. nil ist.

Man sollte TBrowse() auch nicht mit einem leeren bzw. unpassenden Array aufrufen !

Code: Alles auswählen

aArray := {}  // leer, gibt fehler bei z.B. aArray[1,...]
aArray := { {"1","32",.....},;  // 1. Satz OK
                 NIL,;                 // oops leere Zeile mag er nicht
                {"3",NIL,.....} }    // NIL statt Text mag er auch nicht, Fehler bei aArray[3,2]
das Array muss also ein Abbild einer DBF sein, leere Felder mit " " auffüllen, Leerzeilen am Besten vermeiden oder komplett { "","",...} füllen.
Servus, habe aArray geändert

Code: Alles auswählen

aArray:={" "," "," "," "," "," "} 
Fehler bleibt.

Gruß
Messing
Gruß
Bruno
Messing
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: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von brandelh »

Hi,

laut Hilfe (die sollte man zu den Befehlen mal lesen ;-) ) geht das so nicht:

Code: Alles auswählen

oTbrowse:AddColumn ( {|| aArray[nRecno,1] }, , "Artikel" )
AddColumn() erwartet keinen CodeBlock, sondern ein TBColumn() Objekt.
Diesem wird der Codeblock übergeben...

Code: Alles auswählen

oTBC := TBColumn():new(  "Artikel", {|| aArray[nRecno,1] } )
oTbrowse:AddColumn ( oTBC )
oder direkt ...

Code: Alles auswählen

oTbrowse:AddColumn ( TBColumn():new(  "Artikel", {|| aArray[nRecno,1] } ) )

Sinnvoll ist es auch direkt im codeblock die verschiedenen Datentypen auf Strings umzuwandeln ...

Code: Alles auswählen

{|| Transform(aArray[nRecno,nBetragsSpalte],"999,999.99") } 
Die alten Clipper Befehle sind heute nicht mehr sehr geläufig, da hilft nur das Handbuch. 8)
Gruß
Hubert
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von messing »

brandelh hat geschrieben:Hi,

laut Hilfe (die sollte man zu den Befehlen mal lesen ;-) ) geht das so nicht:

Code: Alles auswählen

oTbrowse:AddColumn ( {|| aArray[nRecno,1] }, , "Artikel" )
AddColumn() erwartet keinen CodeBlock, sondern ein TBColumn() Objekt.
Diesem wird der Codeblock übergeben...

Code: Alles auswählen

oTBC := TBColumn():new(  "Artikel", {|| aArray[nRecno,1] } )
oTbrowse:AddColumn ( oTBC )
oder direkt ...

Code: Alles auswählen

oTbrowse:AddColumn ( TBColumn():new(  "Artikel", {|| aArray[nRecno,1] } ) )

Sinnvoll ist es auch direkt im codeblock die verschiedenen Datentypen auf Strings umzuwandeln ...

Code: Alles auswählen

{|| Transform(aArray[nRecno,nBetragsSpalte],"999,999.99") } 
Die alten Clipper Befehle sind heute nicht mehr sehr geläufig, da hilft nur das Handbuch. 8)
Servus,
sag mal, das ist doch jetzt ein 2 Dim Array oder?

Jetzt funktioniert es, solange ich nicht ein leeres Array anzeigen lasse

Danke für den Wink.

Gruß
Messing


[erledigt]
Zuletzt geändert von messing am Mo, 26. Apr 2010 8:42, insgesamt 1-mal geändert.
Gruß
Bruno
Messing
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von messing »

So denn, laßt uns mal sehen

so läufts jetzt mit der Anzeige:

Code: Alles auswählen

#include "inkey.ch"

STATIC nLastRec := 1
STATIC nRecno   := 0

PROCEDURE main
local aArray
local ek_artikel,ek_preis,ek_stueck,ek_gesbetrag,ek_datum,ek_bezahlt
local taste
local nChoice
local oTBrowse

aArray:={}
ek_artikel:=Space(10)
ek_preis:=0
ek_stueck:=0
ek_gesbetrag:=0
ek_datum:=ctod("")
ek_bezahlt:=0
taste:=0
set confirm on
set decimals to 2
cls

@ 21,01 say "F5 - Artikel"
@ 21,15 say "F8 - Tabelle"
@ 21,30 say "ESC - Ende"

do while taste<>K_ESC
   taste:=inkey(0)
        do case
                case taste=K_F5
                        @ 17,01 say "Artikel: " get ek_artikel
                        @ 17,45 say "Preis: " get ek_preis
                        @ 18,01 say "Menge: " get ek_stueck
                        @ 18,40 say "Ges.Betrag: " get ek_gesbetrag
                        @ 19,01 say "Wann: " get ek_datum
                        @ 19,40 say "Bezahlt: " get ek_bezahlt
                        read
                        AAdd( aArray,{ek_artikel,ek_preis,ek_stueck,ek_gesbetrag,ek_datum,ek_bezahlt} )
                case taste=K_F8
                        DoMyBrowse(aArray,0,1,15,79)
                case taste=K_ESC
                        quit
        endcase
enddo

return

* Programmende  EOF *

PROCEDURE DoMyBrowse(aArray,nTop, nLeft, nBottom, nRight)

   nLastRec := LEN(aArray)
   nRecno   := 1

   * Browser initialisieren
   oTbrowse := TBrowse():new(nTop, nLeft, nBottom, nRight)

   * Skip und Navigationsbloecke fuer den Browser initialisieren
   oTbrowse:SkipBlock     := {|nSkip,oTBrowse| MySkip(nSkip,oTBrowse) }
   oTbrowse:GoBottomBlock := {|| nRecno := LEN(aArray) }
   oTbrowse:GoTopBlock    := {|| nRecno := 1 }
//   oTbrowse:PosBlock      := {|| nRecno }
//   oTbrowse:PhyPosBlock   := {|| nRecno }
//   oTbrowse:LastPosBlock  := {|| LEN(aArray) }
//   oTbrowse:FirstPosBlock := {|| 1 }

   oTbrowse:Create ()

   // die einzeile Columne zufgen
oTbrowse:AddColumn ( TBColumn():new(  "Artikel", {|| aArray[nRecno,1] } ) )
oTbrowse:AddColumn ( TBColumn():new(  "Preis", {|| aArray[nRecno,2] } ) )
oTbrowse:AddColumn ( TBColumn():new(  "Stueck", {|| aArray[nRecno,3] } ) )
oTbrowse:AddColumn ( TBColumn():new(  "Gesbetrag", {|| aArray[nRecno,4] } ) )
oTbrowse:AddColumn ( TBColumn():new(  "Datum", {|| aArray[nRecno,5] } ) )
oTbrowse:AddColumn ( TBColumn():new(  "Bezahlt", {|| aArray[nRecno,6] } ) )

   TBSetFocus( oTBrowse )             // TBrowse aktivieren

RETURN

PROCEDURE TBSetFocus( oTBrowse )
      LOCAL nKey := 0
      DO WHILE nKey <> K_ESC
         DO WHILE .NOT. oTBrowse:stabilize()
            IF (nKey := Inkey()) <> 0
               EXIT
            ENDIF
         ENDDO
         IF oTBrowse:stable
            nKey := Inkey(0)
         ENDIF
         TBNavigate( oTBrowse, nKey )
      ENDDO
RETURN

FUNCTION TBNavigate( oTBrowse, nKey )
      LOCAL bBlock  := SetKey( nKey )
      LOCAL lReturn := .T.
      DO CASE
      CASE bBlock <> NIL        ; Eval( bBlock, oTBrowse )
      CASE nKey == K_DOWN       ; oTBrowse:down()
      CASE nKey == K_PGDN       ; oTBrowse:pageDown()
      CASE nKey == K_CTRL_PGDN  ; oTBrowse:goBottom()
      CASE nKey == K_LEFT       ; oTBrowse:left()
      CASE nKey == K_CTRL_LEFT  ; oTBrowse:panLeft()
      CASE nKey == K_HOME       ; oTBrowse:home()
      CASE nKey == K_CTRL_HOME  ; oTBrowse:panHome()
      CASE nKey == K_RIGHT      ; oTBrowse:right()
      CASE nKey == K_CTRL_RIGHT ; oTBrowse:panRight()
      CASE nKey == K_END        ; oTBrowse:end()
      CASE nKey == K_CTRL_END   ; oTBrowse:panEnd()
      CASE nKey == K_UP         ; oTBrowse:up()
      CASE nKey == K_PGUP       ; oTBrowse:pageUp()
      CASE nKey == K_CTRL_PGUP  ; oTBrowse:goTop()
      OTHERWISE
         lReturn:= .F.
      ENDCASE
RETURN lReturn

FUNCTION MySkip( nSkip )
LOCAL nCanSkip
   IF nRecno + nSkip < 1               // "BoF"
      nCanSkip := 1 - nRecno
      TONE ( 1000 )
   ELSEIF nRecno + nSkip > nLastRec  // "EoF"
      nCanSkip := nLastRec - nRecno
      TONE ( 500 )
   ELSE
      nCanSkip := nSkip
   ENDIF

   nRecno += nCanSkip

RETURN nCanSkip
Was ist jetzt nötig um Daten aus dem Array zu veränder, z.B. den Preis, und wie lösche ich eine Zeile mit

Code: Alles auswählen

ADel( aArray, 3 )  
kann man den Satz mit der Satznummer löschen? Oder geht das eleganter?
Muß ich danach die Größe des Array Anpassen?

Code: Alles auswählen

ASize( aArray, Len(aArray)-1 ) 
oder geht das auch automatisch?


Gruß
Messing
Gruß
Bruno
Messing
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von Martin Altmann »

Wenn Du statt ADel() ARemove() verwendest, wird das Array automatisch verkleinert - schrieb Tom bereits.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
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

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von AUGE_OHR »

brandelh hat geschrieben:

Code: Alles auswählen

oTbrowse:AddColumn ( {|| aArray[nRecno,1] }, , "Artikel" )
AddColumn() erwartet keinen CodeBlock, sondern ein TBColumn() Objekt.
Diesem wird der Codeblock übergeben...
JA hast ja Recht ... was "aus der Hüfte" kam war FALSCH !
Der Codeblock kommt als 2nd Parameter in das TBColumnNew() oder als oCol:block von TBColumn()

Also hier nochmals eine (getestete) Version wo auch ein "edit" eingebaut ist

Code: Alles auswählen

#include "inkey.ch"
#include "setcurs.ch"
#include "NLS.ch"

#define EK_ARTIKEL          1
#define EK_PREIS            2
#define EK_STUECK           3
#define EK_GESBETRAG        4
#define EK_DATUM            5
#define EK_BEZAHLT          6

#define COL_CONTENT 1
#define COL_PICTURE 2

PROCEDURE main
local aArray
local ek_artikel,ek_preis,ek_stueck,ek_gesbetrag,ek_datum,ek_bezahlt
local taste
local nChoice
local oTBrowse
LOCAL GETLIST := {}
LOCAL i

   SET EPOCH TO YEAR( DATE() ) - 50
   SET DATE GERMAN                               // DD.MM.YY
   SETLOCALE( NLS_ICURRENCYEURO, "1" )
   SETLOCALE( NLS_SCURRENCY, CHR( 213 ) )

   aArray      := {}
   ek_artikel  := Space(30)
   ek_preis    := 0
   ek_stueck   := 0
   ek_gesbetrag:= 0
   ek_datum    := ctod("")
   ek_bezahlt  := 0
   taste:=0
   set confirm on
   set decimals to 2
   cls
   ///
   // Demo Daten
   //
   FOR i := 1 TO 55
      AADD(aArray, {})
      AADD(aArray[i], "Artikel"+STRZERO(i,2) )
      AADD(aArray[i],     i+(i/100*19) )
      AADD(aArray[i],     i+(i/100*29) )
      AADD(aArray[i],     i+(i/100*39) )
      AADD(aArray[i],DATE() )
      AADD(aArray[i],     i+(i/100*49) )
   NEXT

   DoMyBrowse(aArray,1,1,35,79)

/*******************************************
@ 21,01 say "F5 - Artikel"
@ 21,20 say "ESC - Ende"

do while taste<>K_ESC
   taste:=inkey(0)
        do case
                case taste=K_F5
                        @ 17,01 say "Artikel: " get ek_artikel
                        @ 17,45 say "Preis: " get ek_preis
                        @ 18,01 say "Menge: " get ek_stueck
                        @ 18,40 say "Ges.Betrag: " get ek_gesbetrag
                        @ 19,01 say "Wann: " get ek_datum
                        @ 19,40 say "Bezahlt: " get ek_bezahlt
                        read
                        AAdd( aArray,{ek_artikel,ek_preis,ek_stueck,ek_gesbetrag,ek_datum,ek_bezahlt} )
                case taste=K_ESC
*                        quit
EXIT
        endcase
enddo

DoMyBrowse(aArray,1,1,15,79)

*******************************************/

return

PROCEDURE DoMyBrowse(aArray,nTop, nLeft, nBottom, nRight)
LOCAL oTbrowse
LOCAL oCol
LOCAL nCursSave := SETCURSOR(SC_NONE)
LOCAL np := 1            // index pointer into array
LOCAL n                  // index counter


   * Browser initialisieren
   oTbrowse := TBrowse():new(nTop, nLeft, nBottom, nRight)

   * Skip und Navigationsbloecke fuer den Browser initialisieren
   oTbrowse:SkipBlock     := {|nSkip| -np+(np := MAX(1, MIN(LEN(aArray), np+nSkip))) }
   oTbrowse:GoBottomBlock := {|| np := LEN(aArray) }
   oTbrowse:GoTopBlock    := {|| np := 1}

   // define default column attributes
   oTbrowse:colSep  := " ³ "
   oTbrowse:headSep := "ÄÂÄ"
   oTbrowse:footSep := ""
   oTbrowse:colorSpec := "W+/BG,N/W"
   oTbrowse:Create ()

   // Column Cargo Contents:
   //   cargo[1] contains the code block to edit column
   //   cargo[2] is the picture clause for edit column
   //   cargo[3] is unused

   oCol := TBColumnNew("Artikel  ", NIL)
   oCol:block := { |xVal| IF(xVal == NIL,                  aArray[np][EK_ARTIKEL]            ,aArray[np][EK_ARTIKEL]   := xVal) }
   oCol:cargo := {{|xVal| IF(xVal == NIL,                  aArray[np][EK_ARTIKEL]            ,aArray[np][EK_ARTIKEL]   := xVal) }, "!XXXXXXXXX"}
   oCol:width  := 10
   oTbrowse:addColumn(oCol)

   oCol := TBColumnNew("Preis    ", NIL)
   oCol:block :=  {|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_PREIS]     , '@N' )),aArray[np][EK_PREIS]     := xVal) }
   oCol:cargo := {{|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_PREIS]     , '@N' )),aArray[np][EK_PREIS]     := xVal) }, "99999.99"}
   oCol:width  := 8
   oTbrowse:addColumn(oCol)

   oCol := TBColumnNew("Stueck   ", NIL)
   oCol:block :=  {|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_STUECK]    , '@N' )),aArray[np][EK_STUECK]    := xVal) }
   oCol:cargo := {{|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_STUECK]    , '@N' )),aArray[np][EK_STUECK]    := xVal) }, "99999.99"}
   oCol:width  := 8
   oTbrowse:addColumn(oCol)

   oCol := TBColumnNew("Gesbetrag", NIL)
   oCol:block :=  {|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_GESBETRAG] , '@N' )),aArray[np][EK_GESBETRAG] := xVal) }
   oCol:cargo := {{|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_GESBETRAG] , '@N' )),aArray[np][EK_GESBETRAG] := xVal) }, "99999.99"}
   oCol:width  := 8
   oTbrowse:addColumn(oCol)

   oCol := TBColumnNew("Datum  "  , NIL)
   oCol:block :=  {|xVal| IF(xVal == NIL,                  aArray[np][EK_DATUM]              ,aArray[np][EK_DATUM]     := xVal) }
   oCol:cargo := {{|xVal| IF(xVal == NIL,                  aArray[np][EK_DATUM]              ,aArray[np][EK_DATUM]     := xVal) }, "99.99.99"}
   oCol:width  := 8
   oTbrowse:addColumn(oCol)

   oCol := TBColumnNew("Bezahlt  ", NIL)
   oCol:block :=  {|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_BEZAHLT]   , '@N' )),aArray[np][EK_BEZAHLT]   := xVal) }
   oCol:cargo := {{|xVal| IF(xVal == NIL, LTRIM(TRANSFORM( aArray[np][EK_BEZAHLT]   , '@N' )),aArray[np][EK_BEZAHLT]   := xVal) }, "99999.99"}
   oCol:width  := 8
   oTbrowse:addColumn(oCol)

   TBSetFocus( oTBrowse )             // TBrowse aktivieren

   SETCURSOR(nCursSave)

RETURN

PROCEDURE TBSetFocus( oTBrowse )
LOCAL nKey := 0

   DO WHILE nKey <> K_ESC
      DO WHILE .NOT. oTBrowse:stabilize()
         IF (nKey := Inkey()) <> 0
            EXIT
         ENDIF
      ENDDO
      IF oTBrowse:stable
         nKey := Inkey(0.1)
      ENDIF

      //
      // your spezial Keys
      //
      DO CASE
         CASE nKey == K_ENTER   // Enter
            DoGet(oTBrowse)
            oTBrowse:refreshCurrent()

      OTHERWISE
         TBNavigate( oTBrowse, nKey )
      ENDCASE
   ENDDO
RETURN

FUNCTION TBNavigate( oTBrowse, nKey )
LOCAL bBlock  := SetKey( nKey )
LOCAL lReturn := .T.

   DO CASE
   CASE bBlock <> NIL        ; Eval( bBlock, oTBrowse )
   CASE nKey == K_DOWN       ; oTBrowse:down()
   CASE nKey == K_PGDN       ; oTBrowse:pageDown()
   CASE nKey == K_CTRL_PGDN  ; oTBrowse:goBottom()
   CASE nKey == K_LEFT       ; oTBrowse:left()
   CASE nKey == K_CTRL_LEFT  ; oTBrowse:panLeft()
   CASE nKey == K_HOME       ; oTBrowse:home()
   CASE nKey == K_CTRL_HOME  ; oTBrowse:panHome()
   CASE nKey == K_RIGHT      ; oTBrowse:right()
   CASE nKey == K_CTRL_RIGHT ; oTBrowse:panRight()
   CASE nKey == K_END        ; oTBrowse:end()
   CASE nKey == K_CTRL_END   ; oTBrowse:panEnd()
   CASE nKey == K_UP         ; oTBrowse:up()
   CASE nKey == K_PGUP       ; oTBrowse:pageUp()
   CASE nKey == K_CTRL_PGUP  ; oTBrowse:goTop()
   OTHERWISE
      lReturn:= .F.
   ENDCASE

RETURN lReturn

STATIC FUNCTION DoGet(oTBrowse)
   LOCAL oCol
   LOCAL xValue
   LOCAL nWidth
   LOCAL nRecNo
   LOCAL xSaveKey

   oCol := oTBrowse:getColumn(oTBrowse:colPos)

   // get ACTUAL width of column so we don't overwrite adjacent columns
   nWidth := oCol:width
   IF nWidth == NIL
      xValue := EVAL(oCol:block)
      DO CASE
      CASE VALTYPE(xValue) == "C"
         nWidth := LEN(xValue)
      CASE VALTYPE(xValue) == "N"
         nWidth := LEN(STR(xValue))
      CASE VALTYPE(xValue) == "D"
         nWidth := LEN(DTOC(xValue))
      CASE VALTYPE(xValue) == "L"
         nWidth := 1
      ENDCASE
      IF oCol:Heading != NIL
         nWidth := MAX(nWidth, LEN(oCol:heading) )
      ENDIF
   ENDIF
//
// only used with INDEX
//
   // save controlling index key value
*   IF !EMPTY(INDEXKEY(0))
*      xSaveKey := &(INDEXKEY(0))
*      nRecNo   := RECNO()
*   ENDIF


   // turn cursor on and do read at current position
   SETCURSOR(SC_NORMAL)
   READMODAL({GetNew(ROW(), COL(), oCol:cargo[COL_CONTENT],, ;
     "@S"+LTRIM(STR(nWidth,2))+oCol:cargo[COL_PICTURE], oTBrowse:colorSpec)})

   // turn cursor off
   SETCURSOR(SC_NONE)

//
// only used with INDEX
//
*   IF !EMPTY(xSaveKey) .AND. !(&(INDEXKEY(0)) == xSaveKey )
*      oTBrowse:refreshAll()
*      ForceStable( oTBrowse )
*      DO WHILE (RECNO() != nRecNo)
*         oTBrowse:up()
*         ForceStable( oTBrowse )
*      ENDDO
*   ENDIF

RETURN (NIL)

PROCEDURE ForceStable( oTBrowse )

   DISPBEGIN()
   DO WHILE .NOT. oTBrowse:stabilize()
      //
      // xbase++
      //
      SLEEP(0)
   ENDDO
   DISPEND()

RETURN
*
* eof
*
mit DoGet(oTBrowse) wird nach nKey == K_ENTER ausgeführt und die PICTURE für das editieren ist auch dabei.

eine Sache stört mich aber noch : Die oCol:width von numerischen Werten !
Er scheint immer N,13,2 zu sein d.h. bei oCol:width := 8 würde man nichts "sehen" wenn man nicht LTRIM() benutzt ?
gruss by OHR
Jimmy
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: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von brandelh »

AUGE_OHR hat geschrieben:JA hast ja Recht ... was "aus der Hüfte" kam war FALSCH !
Hallo Jimmy,

nicht ärgern, ich wollte dir nicht zu nahe treten, ICH muss bei den alten Befehlen auch immer in die Hilfe schauen :D
Gruß
Hubert
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von messing »

Servus,

gibt es eine Möglichkeit, innerhalb eines Array eine Summierung durchzuführen, oder muß ich jede Zeile eines Array auslesen und addieren?

Gruß
Messing
Gruß
Bruno
Messing
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von Tom »

Hallo, Messing.

Dafür gibt es keine Standardfunktionen, aber derlei ist simpel:

Code: Alles auswählen

FUNCTION MyArraySum(aArray,nSpalte)
LOCAL i, nArraySum := 0.00
FOR i := 1 TO Len(aArray)
  nArraySum += aArray[i,nSpalte]
NEXT
RETURN nArraySum
Analog ggf. für Zeilen oder eine Matrix.
Herzlich,
Tom
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von messing »

Tom hat geschrieben:Hallo, Messing.

Dafür gibt es keine Standardfunktionen, aber derlei ist simpel:

Code: Alles auswählen

FUNCTION MyArraySum(aArray,nSpalte)
LOCAL i, nArraySum := 0.00
FOR i := 1 TO Len(aArray)
  nArraySum += aArray[i,nSpalte]
NEXT
RETURN nArraySum
Analog ggf. für Zeilen oder eine Matrix.
Danke

Gruß
Messing
[erledigt]
Gruß
Bruno
Messing
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: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von brandelh »

Oder mit aEval() und Codeblock:

Code: Alles auswählen

local  nArraySum := 0
eEval( aArray , {|aZ| nArraySum += aZ[nSpalte]})
wenn man z.B. die Summe aller Felder haben möche ... ( also { { 1,2,3}, {4,5,6} } -> 21 ) ...

Code: Alles auswählen

local  nArraySumAll := 0, nTemp
aEval( aArray , {|aZ| nTemp := 0,  nArraySum +=  aEval( aZ , {|nWert| nTemp += nWert} ) })
Allerdings würde ein NIL oder nicht numerischer Inhalt einer Zelle einen Absturz provozieren.
Wenn man es zu sehr verkettet, kann man es auch kaum noch lesen, also nicht übertreiben.
TOMs nette For Next Schleife ist auf jeden Fall übersichtlicher ;-)
Gruß
Hubert
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von messing »

brandelh hat geschrieben:Oder mit aEval() und Codeblock:

Code: Alles auswählen

local  nArraySum := 0
eEval( aArray , {|aZ| nArraySum += aZ[nSpalte]})
wenn man z.B. die Summe aller Felder haben möche ... ( also { { 1,2,3}, {4,5,6} } -> 21 ) ...

Code: Alles auswählen

local  nArraySumAll := 0, nTemp
aEval( aArray , {|aZ| nTemp := 0,  nArraySum +=  aEval( aZ , {|nWert| nTemp += nWert} ) })
Allerdings würde ein NIL oder nicht numerischer Inhalt einer Zelle einen Absturz provozieren.
Wenn man es zu sehr verkettet, kann man es auch kaum noch lesen, also nicht übertreiben.
TOMs nette For Next Schleife ist auf jeden Fall übersichtlicher ;-)
Danke

wäre der Funktionsaufbau richtig?

Code: Alles auswählen

FUNCTION HBARRAYSUM(aArray,nSpalte)
local  nArraySum := 0
aEval( aArray , {|aZ| nArraySum += aZ[nSpalte]})
return nArraySum
:?:

Gruß

Messing
Gruß
Bruno
Messing
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von messing »

@ Tom

Servus,
als Array Liebhaber frag ich Dir mal ein paar Löcher in den Bauch :D !

Array erstellen und mit Tbrowse anzeigen hab ich jetzt durch :binky: .

Array summieren (Spaltenbezogen) auch :binky: .

Lassen sich rechenoperationen im Array ablegen z.B.: Summe/100*19 :?:

Gruß
Messing
Gruß
Bruno
Messing
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von Martin Altmann »

Moin,
meinst Du jetzt als Formel oder das Ergebnis?
Beides geht leicht.
Letzteres als Wert, ersteres als Codeblock - der dann ausgewertet werden muss, um das Ergebnis zu bekommen...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
messing
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 216
Registriert: Mi, 13. Jan 2010 9:42
Wohnort: Lauterbach / Hessen

Re: Arrays und Ihre Verwendungsmöglichkeiten?!?

Beitrag von messing »

Hei, ei wo schwimmt er denn? :D

Kann man die Summierung einer Arrayspalte unter dem Tbrowse anzeigen lassen?

Code: Alles auswählen

oTbrowse:footSep // Fußzeilenbegrenzer
Besitzt Tbrowse eine Fußzeile :?:

Gruß
Messing
Gruß
Bruno
Messing
Antworten