Support Forum

[Frage] Fehler GLOB_UI_BUTTON_ID und OPEN/INPUT

Schlagworte:
  • SmartPart
  • Fehler
  • Buttons
  • File

Hallo!

Im Dialogfenster meines SmartParts soll mit Buttons jeweils 1 Punkt hinzugefügt bzw. entfernt werden. Leider werden jedoch immer 2 Punkte hinzugefügt bzw. entfernt.
Ich habe mich mal auf Fehlersuche begeben und bin fündig geworden. Eine .csv-Datei wird vom SmartPart mit den Befehlen OPEN und IMPUT eingelesen - wenn ich diese Datei nicht einlese funktionieren auch die Buttons ganz normal.

Kann mir jemand sagen warum das so ist bzw. ob und was ich hier was falsch gemacht habe?
Ich bin Dankbar für jede Hilfe! Hier noch die Ausschnitte aus dem Script:

Buttons Skript:

Parameter-Script:

IF GLOB_UI_BUTTON_ID = 4000 THEN

PARAMETERS box_ptcnt = box_ptcnt + 1
PARAMETERS box_x [ box_ptcnt ] = box_x [ box_ptcnt - 1 ] + next_x
PARAMETERS box_y [ box_ptcnt ] = box_y [ box_ptcnt - 1 ] + next_y

ENDIF

IF GLOB_UI_BUTTON_ID = 4001 THEN

PARAMETERS box_ptcnt = box_ptcnt - 1

ENDIF

Dialog-Script:

I_SECTION "Punkte hinzufügen"

LOCK "box_ptcnt"
I_INFIELD "box_ptcnt" , 0 , 0 , 0 , 0
I_SEPARATOR 0 , 0 , 0 , 0

I_ROW "move" , 1
I_BUTTON I_FUNCTION , `hinzufügen` , 0 , 0 , 1 , 25 , 4000
I_BUTTON I_FUNCTION , `entfernen` , 0 , 0 , 1 , 25 , 4001
I_ROW_END
row = row + 1

----------

Datei Script:

filename = "Dateipfad_Dateiname.csv"
filter = "TEXT"
parameter_string = "SEPARATOR = ';', MODE = RO, fullpath"

DIM aa [ ], ...

con = 2
stream = OPEN ( filter , filename , parameter_string )

REPEAT
n = INPUT ( stream , con , 1 , variable1 , ... )

IF n > 0 THEN
aa [ con - 1 ] = variable1
.
.
.
con = con + 1
ENDIF

UNTIL n < 0
CLOSE stream

Folgender Hinweis:

PARAMETERS box_ptcnt = box_ptcnt + 1
PARAMETERS box_x [ box_ptcnt ] = box_x [ box_ptcnt - 1 ] + next_x
PARAMETERS box_y [ box_ptcnt ] = box_y [ box_ptcnt - 1 ] + next_y

ist nicht ganz richtig!

Mit PARAMETERS box_ptcnt = box_ptcnt + 1 erhöht sich nur der Parameter box_ptcnt um eins!
Die im Script verwendete Variable box_ptcnt bleibt unverändert!
Und genau diese Variable box_ptcnt wird dann beim nächsten Aufruf benutzt:
PARAMETERS box_x [ box_ptcnt ] = box_x [ box_ptcnt - 1 ] + next_x

Richtig müsste diese Stelle lauten:
box_ptcnt = box_ptcnt + 1 !Variable hochzählen
PARAMETERS box_ptcnt = box_ptcnt !Variable in Parameter zurückschreiben
box_x [ box_ptcnt ] = box_x [ box_ptcnt - 1 ] + next_x !X-Wert des Variablen-Arrays erhöhen
PARAMETERS box_x [ box_ptcnt ] = box_x [ box_ptcnt ] !Variablen-Array in Parameter-Array zurückschreiben
box_y [ box_ptcnt ] = box_y [ box_ptcnt - 1 ] + next_y !Y-Wert des Variablen-Arrays erhöhen
PARAMETERS box_y [ box_ptcnt ] = box_y [ box_ptcnt ] !Variablen-Array in Parameter-Array zurückschreiben

Auf den Fehler dürfte es allerdings keinen Einfluss haben, ob man eine .csv-Datei liest!
Das lesen der Datei sollte auch in jedem Fall im Parameter-Script erfolgen, und nur nach Klick auf einen Button:
IF GLOB_UI_BUTTON_ID = XXX THEN
...!Lesen csv-datei
ENDIF

Danke für die Antwort.

Selbst wenn ich zuerst die Variable und anschließend den Parameter hochzähle werden 2 neue Punkte generiert.
Die Datei, welche eingelesen wird, ist immer die gleiche darum ist sie nicht mit einem Button aufgerufen sondern ist im Skript verankert (filename = "..."). Wenn ich diese Zeile jedoch lösche und die Datei nicht gelesen wird verschwindet der Fehler mit den Buttons..

Die Datei wird bei jedem Script-Durchlauf gelesen????

Wozu soll das gut sein, ausser das dadurch die Performance extrem abnimmt?
Bei jedem Ziehen an einem Griff wird das Parameter-Script durchlaufen, und damit auch die Datei eingelesen????

Dieses Konzept solltest Du überdenken!

Unabhängig davon:
Wenn 2 Punkte erzeugt werden, wird diese Stelle scheinbar zweimal durchlaufen! Oder der 2. Punkt wird an anderer Stelle erzeugt, z.B. durch das Einlesen der *.csv-Datei! Das solltest Du untersuchen!!

Ohne das gesamte SmartPart (alle Scripte) zu sehen, kann man dazu nichts weiter sagen...

Die Datei bei jedem Durchlauf zu lesen hat den Vorteil, dass ich die Tabelle erweitern und ergänzen kann (um z.B. einen Typen). Der SmartPart liest dann die neuen Typen automatisch ein und ich muss das Script nicht mehr angreifen.
Von der Performance merkt man nichts da die Tabelle nicht all zu groß ist..

Danke für die Hilfe, ich hab den Fehler gefunden - die Stelle wurde tatsächlich zweimal durchlaufen!
Schönen Tag noch.