LOCALs in Codeblocks - ich steh grad auf dem Schlauch

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

Moderator: Moderatoren

Antworten
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

LOCALs in Codeblocks - ich steh grad auf dem Schlauch

Beitrag von brandelh »

Hi,

ich möchte dieses Konstrukt flexibler gestallten:

Code: Alles auswählen

   
bCollBlock     := {|oService,n| AADD(aInfos,{ n,;
     oService:getProperty("AdapterType"),;
     oService:getProperty("Caption"),;
     oService:getProperty("Description"),;
     oService:getProperty("DeviceID"),;
     oService:getProperty("Index"),;
     oService:getProperty("Name"),;
     oService:getProperty("PhysicalAdapter") })}
das habe ich daraus gemacht und der String wird auch sauber aufgebaut, aber aInfos (local) gibt es darin natürlich nicht mehr.
Normalerweise würde ich es als Parameter des Codeblocks aufnehmen, aber der Aufbau ist festgelegt:

Code: Alles auswählen

oRange := oSheet:Range( "A1:C5" ) 
bBlock := { |oElem, n| /*... oElem benutzen*/ } 
ComEvalCollection( oRange, bBlock )  // oRange ist erster Parameter von bBlock => oElem und n ist der automatische Parameter wie bei aEval
mein erster Test ...

Code: Alles auswählen

   aInfos := {}
   nMaxI  := len(aMSIitemList)
   cCollBlock := "{|oService,n| AADD(aInfos,{ n, "

   for nI := 1 to nMaxI
       cCollBlock += "oService:getProperty('"+aMSIitemList[nI]+"')"
       if nI < nMaxI
          cCollBlock += ", "
       else
          cCollBlock += " })} "
       endif

   next

   ? "cCollBlock = ",cCollBlock
   bCollBlock := &(cCollBlock)
dann habe ich das probiert:

Code: Alles auswählen

   cCollBlock := "{|oService,n,aInfos| AADD(aInfos,{ n, "
aber aInfos bleibt leer, hat von euch jemand eine Idee ?

Mit PRIVATE funktioniert es und ich werde es wohl so machen müssen :cry:
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: LOCALs in Codeblocks - ich steh grad auf dem Schlauch

Beitrag von georg »

Hallo, Hubert -


wenn Du den Codeblock direkt (also über {|...| ...}) und nicht über einen String, der dann mittels &(...) umgewandelt wird, erzeugst, dann ist Zugriff auf aInfos eigentlich möglich.

Probleme gibt es z.B. in Schleifen mit der Zählvariablen, wenn diese im Codeblock mit dem jeweiligen Wert bei Erzeugung des Codeblocks referenziert werden soll. Oder wenn der Codeblock (wie gerade geschrieben) über einen Text-String erzeugt wird, da dies erst zur Laufzeit passiert und dann LOCALs/STATICs über ihren Namen nicht mehr ansprechbar sind.

In einem solchen Fall rufe ich eine Function auf, der ich die betreffenden Werte übergebe und erzeuge in der Function dann den Codeblock, den ich zurückgebe. Aber: immer über {|...| ...} und nicht über den Text-String-Umweg.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Antworten