Editierbares Array

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Editierbares Array

Beitrag von Bruno »

Hallo, an die Xbase++ Gemeinde
Ich habe mir den Thread über Xbase++ Dokumentation bzw. Buch mal reingezogen, und ich bin erstaunt, das alle, welche seit Jahren mit Xbase++ arbeiten sich nicht darauf einigen können, selbst ein Buch in elektronischer Form, oder Druck, zu realisieren. Mein Sohn hat mir mehrfach über die Schulter gesehn und mich gefragt, wie ich mit den Beispielen von Alaska zurechtkomme. Ich musste ihm sagen, das durch ausprobieren ich mir das angeeignet habe, was ich in Xbase++ machen kann. Und ich bin ein stümperhafter Laie !!! Ich bin mir sicher, das alle hier im Forum so genannte Experimente mit diversen Klassen, Funktionen, und so weiter gemacht haben. Wenn diese Experimente als Quellcode mit Beschreibung innerhalb des Quellcodes gesammelt würden, bin ich mir sicher, das da problemlos ein Buch entstehen könnte, welches durch die verschiedenen Denkweisen jeder Person besser wäre als die Doku von Xbase++. Ich habe seit 2013 nichts mehr mit Xbase++ gemacht und würde mich über so eine Sammlung erfreuen. Damit meine ich nicht Kostenfrei !!! Als Beispiel nehme ich mal von Jimmy eine Hilfestellung von 2012. Ich hatte angefragt wegen einem Editierbarem Array, welches er dann auch gepostet hat. Jetzt brauche ich dieses und habe mir sein damaliges Posting vorgenommen und soweit ich konnte für mich angepasst.

Code: Alles auswählen

#include "inkey.ch"
#include "setcurs.ch"
#include "Appevent.ch"

#define COL_CONTENT 1
#define COL_PICTURE 2
#define K_PLUS      43
#define K_MINUS     45
PROCEDURE main

    LOCAL EK_Liste:=Space(20)               // "1"+Space(19)
    LOCAL aArray

    aArray           := {}

    set confirm on
    cls

    AADD(aArray, EK_Liste )

    ArrayBrowse(aArray,1,1,25,22)

RETURN

PROCEDURE ArrayBrowse(aArray, nTop, nLeft, nBottom, nRight)
    LOCAL oTbrowse
    LOCAL oCol
    LOCAL nCursSave := SETCURSOR(SC_NONE)
    LOCAL np := 1            // index Zeiger im Array
    LOCAL n                  // index Zähler

    * 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}

    oTbrowse:colorSpec := "W+/BG,N/W"
    oTbrowse:Create ()

    oCol := TBColumnNew("Einkaufs Liste ", NIL)
    oCol:block := { |xVal| IF(xVal == NIL,   aArray[np],    aArray[np]  := xVal) }
    oCol:cargo := {{|xVal| IF(xVal == NIL,   aArray[np],    aArray[np]  := xVal) }, "!X"}
    oCol:width  := 20
    oTbrowse:addColumn(oCol)

    TBSetFocus( oTBrowse, aArray )             // TBrowse aktivieren

    SETCURSOR(nCursSave)

RETURN

PROCEDURE TBSetFocus( oTBrowse, aArray )
    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

        DO CASE
            CASE nKey == K_SPACE   // Leertaste
                DoGet(oTBrowse)
                oTBrowse:refreshCurrent()
            CASE nKey == K_PLUS
                IF Len(aArray)<20

                    AADD(aArray, Space(20) )

*                    AADD(aArray, LTRIM(STR(Len(aArray)+1));
*                        +space(20-Len(LTRIM(STR(Len(aArray)+1) ) ) ) )
                    oTBrowse:refreshall()
                    oTBrowse:down()
                ENDIF
            CASE nKey == K_MINUS
                IF Len(aArray) > 1
                    ADel( aArray, len(aArray) )
                    ASize( aArray, Len(aArray)-1 )
                    oTBrowse:refreshall()
                ENDIF
        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_UP         ; oTBrowse:up()
    OTHERWISE
        lReturn:= .F.
    ENDCASE

RETURN lReturn

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

    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

    // Cursor sichtbar und do read an aktueller Position
    SETCURSOR(SC_NORMAL)
    READMODAL({GetNew(ROW(), COL(), oCol:cargo[COL_CONTENT],, ;
        "@S"+LTRIM(STR(nWidth,2))+oCol:cargo[COL_PICTURE], oTBrowse:colorSpec)})

    // Cursor ausschalten
    SETCURSOR(SC_NONE)

RETURN (NIL)

*
* eof
*
Das ich einen Teil davon noch nicht gedanklich umsetzen kann gebe ich offen zu. Ich hoffe, das Ihr mir etwas Unterstützung gebt. Ein Buch mit diversen Möglichkeiten wäre jetzt echt Geil ( Sorry, aber das meine ich wirklich so ) ! Ich möchte aus dieser Inkey Situation raus, also Event gesteuert. So wie es bis hier läuft bin ich mit mir zufrieden, abgeändert auf eindimensionales Array mit "+" erweitern, mit "-" verkleinern. Schaut es Euch doch bitte mal an, und teilt mir mit wo ich was ändern muss, um das ganze noch besser zu bekommen. Und ja, jeder hier darf es nutzen. Dieses Forum hier soll ja nicht nur Hilfestellung geben, sondern ein Treffpunkt der Xbase++ Entwickler sein, wo man sich austauscht.
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Editierbares Array

Beitrag von AUGE_OHR »

hi Bruno,
Bruno hat geschrieben: Mo, 05. Jun 2023 22:20Ich möchte aus dieser Inkey Situation raus, also Event gesteuert.
lies mal was über

Code: Alles auswählen

SetMouse()
hier Dateien mit CODE Beispelen
C:\ALASKA\XPPW32\Source\SYS\BrowSys.prg
C:\ALASKA\XPPW32\Source\SYS\DBEDIT.PRG
C:\ALASKA\XPPW32\Source\SYS\GetSysX.prg
C:\ALASKA\XPPW32\Source\SYS\xbparts.prg

p.s. gehe auf "full" GUI und verwende XbpBrowse() statt Hybrid mit TBrowse()
gruss by OHR
Jimmy
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Editierbares Array

Beitrag von Bruno »

Hallo Jimmy, ist nicht möglich, da mein Bruder kein Freund von Windows und Maus ist. Er will zwar das Programm über Windows nutzen, aber es soll textorientiert bleiben. Und um die ganzen Objekte im GUI Modus alle auf Tastatur zu bekommen, würde ich ohne fremde Hilfe nicht hinbekommen.
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Editierbares Array

Beitrag von Martin Altmann »

Moin Bruno,
Du findest oben im Menü verlinkt das Wiki, mit dessen Aufbau und bisheriger Befüllung unser Georg sich sehr viel Mühe gemacht hat: https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Vielleicht hilft dir das auch ein bisschen weiter? Es freut sich auch über weitere Einträge.

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
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Editierbares Array

Beitrag von Bruno »

Martin Altmann hat geschrieben: Di, 06. Jun 2023 4:01 Moin Bruno,
Du findest oben im Menü verlinkt das Wiki, mit dessen Aufbau und bisheriger Befüllung unser Georg sich sehr viel Mühe gemacht hat: https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Vielleicht hilft dir das auch ein bisschen weiter? Es freut sich auch über weitere Einträge.

Viele Grüße
Martin
Hallo Martin, Danke, letzte Änderungen im WIKI waren 2013 und natürlich ist es eine kleine Hilfe.

Oh, Oh, Oh !!! Tut mir aufrichtig leid, habe das erste Datum gelesen, muss meine Brille putzen :lol: :lol: :lol:
Zuletzt geändert von Bruno am Do, 08. Jun 2023 14:40, insgesamt 1-mal geändert.
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Editierbares Array

Beitrag von georg »

Hallo, Bruno -


also, ich bezweifle, dass meine letzten Beiträge aus 2013 sind ...
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Editierbares Array

Beitrag von Manfred »

genau, es war 2023.....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Editierbares Array

Beitrag von Martin Altmann »

2023 auf der Hauptseite, 2022 im Gemeinschaftsportal.
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: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Editierbares Array

Beitrag von AUGE_OHR »

hi Bruno,
Bruno hat geschrieben: Di, 06. Jun 2023 1:08Und um die ganzen Objekte im GUI Modus alle auf Tastatur zu bekommen, würde ich ohne fremde Hilfe nicht hinbekommen.
die "Keys" von Hybrid und GUI sind die selben und fangen mit xbeK_* an
also statt VIO

Code: Alles auswählen

   CASE nKey == K_UP   .OR. nKey == K_SH_TAB
ist es in Hybrid / GUI

Code: Alles auswählen

   CASE nEvent == xbeK_UP .OR. nEvent == xbeK_SH_TAB
den "Array-Skipper" kannst du so übernehmen nur für der vertikalen Scrollbat brauchst du den "Rest"

Code: Alles auswählen

      oBrowse:phyPosBlock   := {| | Recno()      } 

      // Navigationscodeblöcke für den vertikalen Scrollbar 
      oBrowse:posBlock      := {| | DbPosition()    } 
      oBrowse:goPosBlock    := {|n| DbGoPosition(n) } 
      oBrowse:lastPosBlock  := {| | 100             } 
      oBrowse:firstPosBlock := {| | 0   }

diese Codeblock Slots hat TBrowse()
gruss by OHR
Jimmy
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Editierbares Array

Beitrag von Bruno »

georg hat geschrieben: Di, 06. Jun 2023 15:03 Hallo, Bruno -


also, ich bezweifle, dass meine letzten Beiträge aus 2013 sind ...
Hallo Georg und auch die anderen,
Sorry, aber bei mir wurde im Browser das angezeigt.
Habe das erste Datum gesehn und nicht auf das andere geachtet.
Werde 1 KG Pfeffer auf die Brille schütten, um das Glas zu schärfen. :lol: :lol: :lol:
2013 war Seitenerstellung. Ja also ich habe mit mir geschimpft, ich sag nämlich selbst zu anderen, richtig lesen. :banghead: :banghead: :banghead:
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Editierbares Array

Beitrag von Bruno »

Hei Xbase++ Freunde,
wie bekomme ich eine Validierung in ein editierbares Array?

Code: Alles auswählen

   oCol := TBColumnNew("Anf.", NIL)
   oCol:block := { |xVal| IF(xVal == NIL, aArray[np][P_ANF] ,aArray[np][P_ANF]   := xVal) }
   oCol:cargo := {oCol:block, "99:99"}
   oCol:width  := len(left(aArray[np][P_ANF],5))
   oTbrowse:addColumn(oCol)
Der :postblock funktioniert nicht bei oCol.
Habe mal mein kleines Testprogramm hier.

Code: Alles auswählen

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

#define P_ANF           1
#define P_END           2
#define P_STD           3
#define P_REFERENZ      4
#define P_COLLI         5
#define P_KG            6
#define P_LADESTELLE    7
#define P_ENTLADEST     8
#define P_KM            9
#define P_PAUSCHAL      10
#define P_DMSTD         11
#define P_DMKM          12
#define P_DMKG          13

#define COL_CONTENT 1
#define COL_PICTURE 2

PROCEDURE main
MEMVAR dispoarray
local aArray
local posarray
local oTBrowse
LOCAL GETLIST := {}
LOCAL i
LOCAL xyz
PUBLIC dispoarray

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

set deleted off
*use dispo alias dispo exclusive new
*dispo->(DbGoto(LastRec()+1))
*dispoarray:=dispo->(scatter())

posarray:={"06:00:00","18:30:00",12.5,"TESTDATEN",123,45.750,"HIER","DORT",333,500.99,55.25,2.75,1.89}
*AADD(posarray,dispoarray[D_ZEIT_ANF])
*AADD(posarray,dispoarray[D_ZEIT_END])
*AADD(posarray,dispoarray[D_KD_ST_STD])
*AADD(posarray,dispoarray[D_REFERENZ])
*AADD(posarray,dispoarray[D_COLLI])
*AADD(posarray,dispoarray[D_KG_M3])
*AADD(posarray,dispoarray[D_LADESTELLE])
*AADD(posarray,dispoarray[D_ENTLADESTE])
*AADD(posarray,dispoarray[D_KILOMETER])
*AADD(posarray,dispoarray[D_DM_PAUSCHA])
*AADD(posarray,dispoarray[D_DM_STD])
*AADD(posarray,dispoarray[D_DM_KM])
*AADD(posarray,dispoarray[D_DM_KG1])

   aArray      := {}

   set confirm on
   set decimals to 2
   cls

      AADD(aArray, posarray )

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
LOCAL n
local xVal

   * 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 ()

xVal:=aArray[np][P_ANF]

   oCol := TBColumnNew("Anf.", NIL)
   oCol:block := { |xVal| IF(xVal == NIL, aArray[np][P_ANF] ,aArray[np][P_ANF]   := xVal) }
   oCol:cargo := {oCol:block, "99:99"}
   oCol:width  := len(left(aArray[np][P_ANF],5))
   oTbrowse:addColumn(oCol)

xVal:=aArray[np][P_END]

   oCol := TBColumnNew("Ende", NIL)

   oCol:block :=  {|xVal| IF(xVal == NIL, aArray[np][P_END],aArray[np][P_END]       := xVal) }
   oCol:cargo := {oCol:block, "99:99"}
   oCol:width  := len(left(aArray[np][P_ANF],5))
   oTbrowse:addColumn(oCol)

xVal:=aArray[np][P_STD]

   oCol := TBColumnNew("Std.", NIL)
   oCol:block := { |xVal| IF(xVal == NIL, aArray[np][P_STD] ,aArray[np][P_STD]   := xVal) }
   oCol:cargo := {oCol:block, "99.99"}
*   oCol:width  := 5
   oTbrowse:addColumn(oCol)

xVal:=aArray[np][P_REFERENZ]

   oCol := TBColumnNew("Referenz", NIL)

   oCol:block :=  {|xVal| IF(xVal == NIL, aArray[np][P_REFERENZ],aArray[np][P_REFERENZ]       := xVal) }
   oCol:cargo := {oCol:block, "!X"}
   oCol:width  := len(aArray[np][P_REFERENZ])
   oTbrowse:addColumn(oCol)
   TBSetFocus( oTBrowse )             // TBrowse aktivieren

   SETCURSOR(nCursSave)                                                                           //       {|oGet| ZeitCheck(oGet) }

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

      DO CASE
         CASE nKey == K_F1
              altd()

         CASE nKey == K_ENTER   // Enter
   DO WHILE .NOT. oTBrowse:stabilize()

   ENDDO

            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
altd()
oAbfrage:= GetNew(ROW(), COL(), oCol:cargo[COL_CONTENT],,oCol:cargo[COL_PICTURE], oTBrowse:colorSpec)

   SETCURSOR(SC_NORMAL)
   READMODAL({oAbfrage})

   SETCURSOR(SC_NONE)

RETURN (NIL)

FUNCTION ZeitCheck( oGet )
   local cZeit
   LOCAL cStd, nStd, cMin, nMin

   cZeit:=oGet:buffer
   cStd:=left(cZeit,2)
   cMin:=right(cZeit,2)

   if val(cStd)<10
      nStd:=val(cStd)
      cStd:=str(nStd,2)
      cStd:=stuff(cStd,1,1,"0")
      cStd:=stuff(cStd,1,2,cStd)
   endif

   if val(cMin)<10
      nMin:=val(cMin)
      cMin:=str(nMin,2)
      cMin:=stuff(cMin,1,1,"0")
      cMin:=stuff(cMin,1,2,cMin)
   endif

   cZeit:=cStd+":"+cMin

   if val(substr(cZeit,4,2))>59
      return .F.
   endif

   if val(substr(cZeit,1,2))>23
      return .F.
   endif

   oGet:varput(cZeit)                           // zurück in den get Puffer

RETURN .T.
Bei einem Get Aufruf kann ich VALID benutzen mit der Zeitcheck Funktion benutzen, das würde ich auch gerne bei Änderung im TBrowse.
Wo muss ich hier ansetzen? Und wie kann ich verhindern, das in der Spalte Std. das Ändern nicht funktioniert? Dort soll später die Differenz von Spalte Anf. und Ende angezeigt werden. Also Berechnung von Zeit.
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Editierbares Array

Beitrag von Bruno »

Hei,
habe erstmal über die COL()

Code: Alles auswählen

IF COL()=20 .or. 28
oAbfrage:postblock:= {|oAbfrage|zeitcheck(oAbfrage)}
endif
das reallisiert. Gibt es noch ne andere Möglichkeit?
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Editierbares Array

Beitrag von Bruno »

Ich bräuchte nochmal Eure Hilfe,
wenn ich im TBrowse ( Array ) Daten verändere oder anfüge, würde ich gerne die Summierung auch aktualisieren.

Code: Alles auswählen

   oCol := TBColumnNew("Betrag", NIL)

   oCol:block :=  {|xVal| IF(xVal == NIL,aArray[np][P_PAUSCHAL]:=Ausrechnen(aArray[np]) , aArray[np][P_PAUSCHAL]     := xVal) }
   oCol:cargo := {oCol:block, "9999999999.99"}
   oCol:width  := 13
   oCol:footing := HbArraySum(aArray,P_PAUSCHAL)

FUNCTION HbArraySum(aArray,nSpalte)
local  nArraySum := 0
aEval( aArray , {|aZ| nArraySum += aZ[nSpalte]})
return nArraySum
dies funktioniert wenn ein Array mit Werten gefüllt ist, wenn sich jedoch die Werte ändern, wird die neue Summe nicht angezeigt.
wie muss ich das bei :footing umsetzen, um eine Änderung der Werte auch dort erkennen zu können?
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Antworten