Codeblock zur Laufzeit erstellen

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Codeblock zur Laufzeit erstellen

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
DelUser01

Re: Codeblock zur Laufzeit erstellen

Beitrag 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?
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Codeblock zur Laufzeit erstellen

Beitrag 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
Gruß
Hubert
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: Codeblock zur Laufzeit erstellen

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
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: Codeblock zur Laufzeit erstellen

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Codeblock zur Laufzeit erstellen

Beitrag 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.
Gruß
Hubert
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: Codeblock zur Laufzeit erstellen

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Codeblock zur Laufzeit erstellen

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Codeblock zur Laufzeit erstellen

Beitrag von brandelh »

Am smartphone kann ich das nicht wirklich beurteilen ... einfach zu kleiner Bildschirm
Gruß
Hubert
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: Codeblock zur Laufzeit erstellen

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen 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: Codeblock zur Laufzeit erstellen

Beitrag 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)
gruss by OHR
Jimmy
Antworten