Seite 1 von 1

Codeblock zur Laufzeit erstellen

Verfasst: Fr, 18. Aug 2017 13:42
von Jan
Hallo,

ich möchte den :action eines XbpPushButtons mit einem zur Laufzeit generierten Codeblock belegen. das ging in der bisherigen Version vollkommen reibungslos. Da habe ich aber auch nur zwei Werte übergeben. das sah dann so aus:

Code: Alles auswählen

&("{|| meineFunktion(" + cWert1 + "," + ;
                     "'" + oSleDatum:editBuffer() + "')}")
Jetzt soll da aber noch ein dritter Parameter übergeben werden - oDlg. Natürlich nicht als String, sondern als Parameter. Und da steh ich jetzt ein wenig auf dem Schlauch. Wie muß ich den einbauen?

Jan

Re: Codeblock zur Laufzeit erstellen

Verfasst: Fr, 18. Aug 2017 15:32
von DelUser01
erweitere Dein PushButton um eine exported Var, z.B. PAR3,
weise dem entprechenden PushButton dann vor Ausführung das oDialog zu ( oPB:PAR3 := oDialog ),
dann kannst Du im Pushbutton drauf zugreifen ::PAR3.

Oder mache es mit einer MEMVAR?

Re: Codeblock zur Laufzeit erstellen

Verfasst: Fr, 18. Aug 2017 16:42
von brandelh
Keine memvar ... Ich hab die Hilfe nicht verfügbar, aber wird dem codeBlock nicht auch 3 Parameter beim auslösen übergeben ?
&("{|p1,p2,oXbp|..."

Die vars kannst du nutzen.
Wenn nicht, dann eval nutzen und Parameter schieben

Re: Codeblock zur Laufzeit erstellen

Verfasst: Fr, 18. Aug 2017 16:48
von georg
Hallo, Jan -


der Codeblock sieht "normal" (also Compilezeit) so aus:

Code: Alles auswählen

{|oXbp| MeineFunction(cWert, bWert, oXbp)}
Du musst also in der Definition den Namen des Parameters zwischen die Pipe-Zeichen setzen, und den Parameter mit seinem Namen an die entsprechende Stelle im Aufruf, schon passt es.

Re: Codeblock zur Laufzeit erstellen

Verfasst: Fr, 18. Aug 2017 16:54
von georg
Hallo, Hubert -


den meisten Codeblöcken in den Callback-Slots werden drei Parameter übergeben, aber einer eigenen Funktionen kannst Du soviele Parameter übergeben, wie Du Lust hast, zu verwenden.

Re: Codeblock zur Laufzeit erstellen

Verfasst: Fr, 18. Aug 2017 17:31
von brandelh
Klar, ich meinte nur, dass falls die übergeben werden man die nutzen kann, ansonsten muss man sie unterschieben. Wobei Jan einen codeblock zur Laufzeit aus einem String erzeugen muss. Am smartphone bekomme ich mein Beispiel nicht besser hin.

Re: Codeblock zur Laufzeit erstellen

Verfasst: Fr, 18. Aug 2017 19:26
von georg
Hallo, Hubert -


naja, Jan und seine Beschreibungen ...

Code: Alles auswählen

&("{|| meineFunktion(" + cWert1 + "," + ;
                     "'" + oSleDatum:editBuffer() + "', " + oDlg + ")}")
das könnte so passen. Warum er aber nicht

Code: Alles auswählen

oButton:activate := {|| meineFunktion(cWert1, oSLEDatum:editBuffer, oDlg)}
verwendet, ist mir nicht klar, denn an der Stelle, wo er den Codeblock per Hand erstellt, kann er ja auf die Variablen zugreifen, also sollte es auch mit einem zur Compile-Zeit generierten Codeblock gehen.

Mal "hören", was er schreibt.

Re: Codeblock zur Laufzeit erstellen

Verfasst: Fr, 18. Aug 2017 19:36
von Jan
Georg,

das ist ganz einfach. Ich erstelle da einen ganzen Schwung von Buttons in vorher ungekannter Menge. Und die müssen alle einen individuellen :action haben. Daher mache ich das so. Für Verbesserunsgvorschläge bin ich natürlich immer zu haben. Aber testen kann ich all das hier erst wieder am Montag. Das ist nicht mein eigenes Projekt, sondern beim Kunden.

Jan

Re: Codeblock zur Laufzeit erstellen

Verfasst: Fr, 18. Aug 2017 19:37
von brandelh
Am smartphone kann ich das nicht wirklich beurteilen ... einfach zu kleiner Bildschirm

Re: Codeblock zur Laufzeit erstellen

Verfasst: Fr, 18. Aug 2017 19:43
von georg
Hallo, Jan -


klar, ich schliesse von meiner Programmiertechnik auf die anderer :D

In dem von Dir beschriebenen Fall besteht natürlich die Gefahr, dass die Variablen, die Du in den Codeblock einbindest, unterschiedliche Werte zu unterschiedlichen Zeiten haben. Dann macht es Sinn, ihren Wert zum entsprechenden Zeitpunkt "einzufrieren", indem Du ihren Inhalt im Codeblock einbindest.

Falls der Dialog immer auf das gleiche Objekt geht, kannst Du es wie im ersten Beispiel (Abwandlung Deines Beispiels) machen.

Re: Codeblock zur Laufzeit erstellen

Verfasst: Sa, 19. Aug 2017 20:32
von AUGE_OHR
hi,

ich habe leider noch nicht ganz verstanden was das Problem sein soll weitere Parameter zu nutzen ?

wenn man in einer Schleife XbParts zusammenbaut benutze ich lieber detached Local welche in der Function zusammengebaut werden.

Code: Alles auswählen

   ::activate := MakeCodeBlock("MyFunc",a,b,c,d,e,f, ...)
das hat nun den Vorteil das ich den String in der Function in einer Test App besser debuggen kann.

Code: Alles auswählen

PROCEDURE MAIN
   ? MakeCodeBlock("MyFunc","Hallo",123456789,DATE(), .T.)
   WAIT
RETURN

FUNCTION MakeCodeBlock()
LOCAL nCount := PCOUNT()
LOCAL i, xValue
LOCAL cString

   FOR i := 1 TO nCount
      // Aktion
      xValue := PValue(i)
      IF i = 1
         cString := "{|| "+xValue+"( "
         LOOP
      ENDIF
      DO CASE
         CASE VALTYPE(xValue) = "C" ; cString += "'"+xValue+"'"
         CASE VALTYPE(xValue) = "N" ; cString += STR(xValue)
         CASE VALTYPE(xValue) = "D" ; cString += "'"+DTOC(xValue)+"'"
         CASE VALTYPE(xValue) = "L" ; cString += IF(xValue,'.T.','.F.')
      ENDCASE
      IF i <> nCount
         cString += ","
      ENDIF

   NEXT
   cString += ") }"

RETURN &(cString)