"local" Array -> o:Datalink ? [erledigt]

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

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

"local" Array -> o:Datalink ? [erledigt]

Beitrag von AUGE_OHR »

hi,

in einem XbpQuickbrowse(), welches auf ein Array zugreift, will ich einen Satz ( Row ) editieren.

Code: Alles auswählen

oQB:itemSelected := {| aRowCol, uNIL, oSelf | oQB:EditRec(aRowCol) }
nun habe ich eine FUNCTION wo ich den Codeblock zusammenbaue.

Code: Alles auswählen

   FOR i := 1 TO nCount
      ...
      oSLE:dataLink := MakeBlock( aData ,i)


FUNCTION MakeBlock( aData ,i)
LOCAL bBlock := "{|x| IIf(x==NIL, aData["+LTRIM(STR(i))+"],aData["+LTRIM(STR(i))+"] := x ) }"
RETURN &bblock
trotz der "detached local" muss ich das Array als

Code: Alles auswählen

PRIVATE aData    := ::DataArray[aRowCol[1]]
deklarieren ... wieso :?:
Zuletzt geändert von AUGE_OHR am So, 15. Nov 2015 21:17, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
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:

Re: "local" Array -> o:Datalink ?

Beitrag von brandelh »

weil die in der Funktion den Codeblock als Text bauen und dort aData als Name drinsteht

Code: Alles auswählen

LOCAL bBlock := "{|x| IIf(x==NIL, aData["+LTRIM(STR(i))+"],aData["+LTRIM(STR(i))+"] := x ) }"
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: "local" Array -> o:Datalink ?

Beitrag von AUGE_OHR »

brandelh hat geschrieben:weil die in der Funktion den Codeblock als Text bauen und dort aData als Name drinsteht

Code: Alles auswählen

LOCAL bBlock := "{|x| IIf(x==NIL, aData["+LTRIM(STR(i))+"],aData["+LTRIM(STR(i))+"] := x ) }"
YUP ... und wie mache ich es ohne PRIVATE bei einem Array :?:
wenn es eine "normale" Variabel oder ein FIELD wäre dann ist es kein Problem ...

es geht um das Beispiel c:\ALASKA\XPPW32\Source\samples\basics\QBrowse\QBROWSE1.PRG

Code: Alles auswählen

   // diese Zeile einfügen
   oBrowse:itemSelected := {| aRowCol, uNIL, oSelf | EditRec(aRowCol,aArray) }


PROCEDURE EditRec(aRowCol,aDir)
LOCAL nRow  := aRowCol[1]
LOCAL nCol  := aRowCol[2]

PRIVATE aData := aDir[nRow]  // Zeile mit 10 Elementen
...
   FOR i := 1 TO nCount
      oSLE := XbpSLE():new(oStatic,,{50,nStep}, {nWide,26})
      // hier den String mit den Array Elementen zusammenbauen
      bBlock := "{|| ...}"
      oSLE:dataLink := &(bBlock)
      oSLE:tabstop := .T.
      oSLE:create()
      oSLE:Setdata()
      AADD(::aEdit,oSLE)
      nStep -= 30
   NEXT
gruss by OHR
Jimmy
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: "local" Array -> o:Datalink ?

Beitrag von georg »

Hallo, Jimmy -


warum erzeugst Du den Codeblock nicht direkt?

Code: Alles auswählen

FUNCTION MakeBlock( aData ,i)
LOCAL bBlock := {|x| IIf(x==NIL, aData[i],aData[i] := x ) }
RETURN bblock
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: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: "local" Array -> o:Datalink ?

Beitrag von AUGE_OHR »

georg hat geschrieben:warum erzeugst Du den Codeblock nicht direkt?
hm ... das hatte ich auch versucht ...
habe aber wohl die falsch Syntax benutzt denn jetzt funktioniert es :blob8:

Code: Alles auswählen

STATIC FUNCTION MakeBlock(aData,i)
LOCAL bBlock
// so nicht
// bBlock := "{|x| IIf( x==NIL, aData["+STR(i)+"],aData["+STR(i)+"] := x ) }"

   DO CASE
      CASE VALTYPE(aData[i]) = "C" 
         bBlock := {|x| IIf(PCOUNT()==0,           aData[i]         , aData[i] :=      x             ) }
      CASE VALTYPE(aData[i]) = "N" 
         bBlock := {|x| IIf(PCOUNT()==0, Transform(aData[i],   '@N'), aData[i] :=  Val(x)            ) }
      CASE VALTYPE(aData[i]) = "D" 
         bBlock := {|x| IIf(PCOUNT()==0,      DtoC(aData[i])        , aData[i] := CtoD(x)            ) }
      CASE VALTYPE(aData[i]) = "L" 
         bBlock := {|x| IIf(PCOUNT()==0,        IF(aData[i],"Y","N"), aData[i] :=   IF(x="N",.F.,.T.)) }
   ENDCASE

RETURN bblock
gruss by OHR
Jimmy
Antworten