Seite 1 von 1

Array in getlist

Verfasst: Mo, 27. Jul 2015 16:23
von Manfred
Ich habe folgendes Problem, hier ein kleiner Auszug:

Code: Alles auswählen

local getlist := {}

oDialogZusatz:maskeget(@getlist)

METHOD DialogNummernkreise:maskeget(getlist)
       LOCAL nI
       LOCAL nY := 5

       SetColor("W/N,N/BG,N/N,N/N,N/W")
       FOR nI := 1 TO Len(::aNummern)
           @ nY  ,22 GET ::aNummern[nI,ANFANGNR]                      PICTURE "999999999" VALID ::pruefNummern("anfang",getlist)
           @ nY  ,32 GET ::aNummern[nI,ENDENR]                        PICTURE "999999999" VALID ::pruefNummern("ende",getlist)
           @ nY  ,42 GET ::aNummern[nI,LFDNR]                         PICTURE "999999999" WHEN {|| .F.}
           @ nY  ,52 GET ::aNummern[nI,RESERVE]                       PICTURE "999999999" VALID ::pruefNummern("reserve",getlist)
           @ nY++,62 SAY ::aNummern[nI,ENDENR] - ::aNummern[nI,LFDNR] PICTURE "999999999"
       NEXT
       SetColor("W/N,N/W,N/N,N/N,N/W")
RETURN self
*********************************************************************
METHOD DialogNummernkreise:pruefNummern(cVorgang,getlist)
       LOCAL lErfolg := .T.

       MEMVAR oSysPara

       IF Upper(cVorgang) == "ANFANG"
          IF ::aNummern[nSatz,ANFANGNR] = 0
             lErfolg := .F.
          ENDIF
       ELSEIF Upper(cVorgang) == "ENDE"
          IF ::aNummern[nSatz,ENDENR] = 0 .OR. ::aNummern[nSatz,ENDENR] <= ::aNummern[nSatz,ANFANGNR]
             lErfolg := .F.
          ENDIF
       ELSEIF Upper(cVorgang) == "RESERVE"
          IF ::aNummern[nSatz,RESERVE] = 0 .OR. ::aNummern[nSatz,RESERVE] <= ::aNummern[nSatz,ENDENR] - ::aNummern[nSatz,ANFANGNR]
             lErfolg := .F.
          ENDIF
       ENDIF
       IF ! lErfolg
          oSysPara:oMessage:anzeigen("Bitte Eingabe prüfen. Nicht korrekt!!!")
       ENDIF
RETURN lErfolg
warum kann ich in pruefnummern kein getactive() abfragen? Es ergibt immer NIL. Oder mache ich einen Fehler in :maskeget()? Geht das nicht mit dem Array?

Re: Array in getlist

Verfasst: Mo, 27. Jul 2015 20:18
von AUGE_OHR
hi,

wo ist dein READ ?
IMHO ohne READ gibt es kein "aktives" GET

Re: Array in getlist

Verfasst: Di, 28. Jul 2015 6:57
von Manfred
ach so, sorry, das steht natürlich ganz oben unter dem Aufruf des Get. Wie gesagt, es klappt alles, nur wenn die valid Abfrage läuft kann ich in der Funktion das getlist Array zwar im Debugger als gefüllt erkennen (steht voller gets), aber über getactive() wird NIL zurückgegeben. Wenn ich das Array direkt anspreche kome ich an alle Werte daran. Aber getactive() sollte doch das gerade aktive Get zurückgegeben.

Re: Array in getlist

Verfasst: Di, 28. Jul 2015 7:55
von georg
Hallo, Markus -


da ich schon lange nicht mehr mit GET arbeite, kann ich nur ein paar Hinweise liefern:

1. getactive() ist in \xppw32\source\sys\getsys.prg definiert - vielleicht kopierst Du die Quelle mal in Dein Programmverzeichnis und nimmst sie in die xpj auf und debugst mal den Aufruf von getactive(), vielleicht liefert das einen Hinweis,
2. getactive() verwendet die Klasse ReadStatus() aus \xppw32\source\sys\getsysx.prg - auch hier würde ich mal reinschauen, weil da das aktive Get-Element abgefragt wird.
3. Würde ich eine GET-Anweisung so abändern, dass sie auf eine normale Variable verweist, und dann mal sehen, ob dort das getactive() funktioniert - das wäre ein Indiz dafür, dass es Probleme bei Array (geschachtelten Arrays) gibt.

Re: Array in getlist

Verfasst: Di, 28. Jul 2015 8:07
von Manfred
Hi Georg, (ich bin übrigens Manfred, nicht Markus ;-) )

mit "normalen" Gets klappt es, deshalb ja auch meine Eingangsfrage. Da benutze ich es ja auch. Ich habe es jetzt mal ohne Schleife nur mit einem Element geprüft. Da klappt es auch nicht. Also muß ich es wohl anders lösen. Schade.

Re: Array in getlist

Verfasst: Di, 28. Jul 2015 9:19
von georg
Hallo, Markus -


äh, Manfred ... bin wohl noch nicht wach genug.

Ich würde der Sache mit dem Debugger auf den Grund gehen, denn eigentlich spricht nichts dagegen, dass es auch mit Array-Elementen funktioniert. Vielleicht benennt Alaska dann den PDR ja nach Dir ...

Re: Array in getlist

Verfasst: Di, 28. Jul 2015 9:28
von Manfred
ich habe es mit dem Debugger geprüft. Die Gets sind alle belegt. Wenn ich die gets einzeln direkt abfrage (pauschal) dann bekomme ich auch die Werte. Also z.B.:

getlist[1]:buffer

dann bekomme ich den Inhalt angezeigt im Debugger. Bzw. im ObjectInspector steht alles drin.

Re: Array in getlist

Verfasst: Di, 28. Jul 2015 10:23
von georg
Hallo, Manfred -


was ich so gesehen habe, wird auf eine Instanzvariable in der ReadStatus()-Klasse zugegriffen. Kann es sein, dass die in Deinem Fall nicht richtig belegt wird? Hast Du da mal ein Debugger-Auge drauf geworfen?

Re: Array in getlist

Verfasst: Di, 28. Jul 2015 10:51
von Manfred
Hi Georg,

im Moment bin ich blind. Wo soll ich drauf schauen? Das sehe ich in der Pruefroutine

Re: Array in getlist

Verfasst: Di, 28. Jul 2015 11:30
von georg
Hallo, Manfred -


aus getsys.prg:

Code: Alles auswählen

FUNCTION GetActive( oGet )
   LOCAL oPrevious := ReadStatus():activeGet
aus getsysx.prg:

Code: Alles auswählen

*****************************************************************************
* Class to monitor READ status variables
*    The class object contains the current state variables.
*    Instances of the class contain saved state variables in case of
*    nested READs
*****************************************************************************
CLASS ReadStatus
   EXPORTED:
   CLASS VAR updated , killRead , lastStatus
   CLASS VAR hitTop  , hitBottom, lastExitState
   CLASS VAR lastPos , thisPos  , nextPos
   CLASS VAR getList , activeGet, lastActiveGet
   CLASS VAR procName, procLine , readVar
   CLASS VAR useAppEvent
Wenn Du getactive() ausführst, wird im Endeffekt ReadStatus():activeGet zurückgemeldet. Um herauszufinden, warum NIL und nicht ein GET-Objekt geliefert wird, müsstest Du prüfen, wo und wie ReadStatus():activeGet mit Werten besetzt wird. Das passiert z.B. in ReadStatus:PostActiveGet() und in ReadStatus:LbClick( nMouseRow, nMouseCol ) - da würde ich mit dem Debugger ansetzen und mal schauen, was passiert. (Aber, wie schon manchesmal geschrieben, arbeite ich eigentlich nur noch mit Xbase-Parts.)