DCPUSHBUTTONXP in Schleife erstellen - Schleifenzählerabfrage

Moderator: Moderatoren

Antworten
Benutzeravatar
uwe.24
UDF-Programmierer
UDF-Programmierer
Beiträge: 50
Registriert: Di, 01. Aug 2006 15:47
Wohnort: Osnabrück

DCPUSHBUTTONXP in Schleife erstellen - Schleifenzählerabfrage

Beitrag von uwe.24 »

Hallo.

Ich möchte Pushbuttons in einer Schleife erstellen.
Dabei sollte der Schleifenzähler im ACTION Codeblock verarbeitet werden.
Das klappt aber nicht
Hier im Bsp. ist len(aDVRTemp21) = 4 .
In der Funktion wird beim Abfragen für x immer 5 angezeigt.

Was muss ich anders machen?

Code: Alles auswählen

for nI = 1 to len(aDVRTemp21)
      @  3 + nI,80 DCPUSHBUTTONXP CAPTION aDVRTemp21[nI] SIZE 15,1 ACTION {||DVRUeber1(nI, aDVRTemp21)}
   next

Code: Alles auswählen

static func DVRUeber1(x,aDVRTemp21)
   _1 = x
return NIL
mfG
Uwe aus OS
Uwe aus OS
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 15824
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 36 Mal
Danksagung erhalten: 26 Mal
Kontaktdaten:

Re: DCPUSHBUTTONXP in Schleife erstellen - Schleifenzählerabfrage

Beitrag von Martin Altmann »

Moin Uwe,
war schon häufiger Thema hier. Gibt mittlerweile auch ein Wiki-Eintrag von Georg dazu :arrow: https://wiki.xbaseentwickler.de/index.p ... hed_Locals

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
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8643
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 33 Mal
Danksagung erhalten: 126 Mal
Kontaktdaten:

Re: DCPUSHBUTTONXP in Schleife erstellen - Schleifenzählerabfrage

Beitrag von Tom »

Code: Alles auswählen

@  3 + nI,80 DCPUSHBUTTONXP CAPTION aDVRTemp21[nI] SIZE 15,1 ACTION &("{||DVRUeber1("+LTrim(Str(nI))+", aDVRTemp21)}")
Nachteil: Die Funktion "DVRUeber1" darf dann nicht STATIC sein, aDVRTemp21 darf nicht LOCAL sein.
Herzlich,
Tom
Benutzeravatar
uwe.24
UDF-Programmierer
UDF-Programmierer
Beiträge: 50
Registriert: Di, 01. Aug 2006 15:47
Wohnort: Osnabrück

Re: DCPUSHBUTTONXP in Schleife erstellen - Schleifenzählerabfrage

Beitrag von uwe.24 »

Hallo Martin.

Danke für den Hinweis.
Ich hätte nicht gewusst, wie das Beispiel aus dem Wiki auf meinen Fall umzuwandeln gewesen wäre.

Hallo Tom.

So klappt es prima.
Danke.

mfG
Uwe aus OS
Uwe aus OS
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8643
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 33 Mal
Danksagung erhalten: 126 Mal
Kontaktdaten:

Re: DCPUSHBUTTONXP in Schleife erstellen - Schleifenzählerabfrage

Beitrag von Tom »

Hallo, Uwe.

Freut mich!

Das ist allerdings quick and dirty, und es hat Nachteile. PRIVATEs kosten etwas Performance und können negative Auswirkungen haben, wenn sie in mehreren Funktionen verwendet werden, wenn diese einander aufrufen, auch indirekt. Außerdem werden Syntaxfehler in Codeblöcken, die man auf diese Weise baut, erst zur Laufzeit gefunden. Schlimmstenfalls liefert man Syntaxfehler aus.

Bei "detached locals" löst man Variablen aus ihrem direkten Kontext. Georgs Beispiel im Wiki ist sehr anschaulich. Wenn man den Funktionsaufruf direkt in der Schleife verwendet, wird er erst evaluiert, wenn der Eintrag im Menü evaluiert wird, und da steht der Zähler dann schon auf einem ganz anderen Wert (und für alle so erzeugten Menüeinträge auf dem gleichen!). Lagert man ihn allerdings seinerseits in eine Funktion um und verwendet ihr Ergebnis, hat man die Variablen aus der Schleife gelöst und sozusagen in die Starre der Auswertung gezwungen. Das ist sehr viel eleganter, hat Performancevorteile (vom Overhead der zusätzlich benötigten Funktion abgesehen) und führt auch nicht erst zur Laufzeit zu Syntaxfehlermeldungen.
Herzlich,
Tom
Benutzeravatar
uwe.24
UDF-Programmierer
UDF-Programmierer
Beiträge: 50
Registriert: Di, 01. Aug 2006 15:47
Wohnort: Osnabrück

Re: DCPUSHBUTTONXP in Schleife erstellen - Schleifenzählerabfrage

Beitrag von uwe.24 »

Hallo Tom
Hallo Martin

Ich habe es doch nochmal anders versucht:

Code: Alles auswählen

   for nI = 1 to len(aDVRTemp21)
      DVRPushButton(nI,@Getlist)
   next

Code: Alles auswählen

func DVRPushButton(nTemp2,Getlist)
      @  3 + nTemp2,100 DCPUSHBUTTONXP CAPTION aDVRTemp21[nTemp2] SIZE 15,1 COLOR GRA_CLR_BLACK,DC_LAWNGREEN ACTION {||DVRUeber1(nTemp2),DC_GETREFRESH(Getlist)}
return NIL
So ist das nach euren Hinweisen dann wohl besser und es klappt.

Vielen Dank.

Uwe aus OS
Uwe aus OS
Antworten