Macro :Datalink Codeblock mit Class VAR ?

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
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

Macro :Datalink Codeblock mit Class VAR ?

Beitrag von AUGE_OHR »

hi,

Code: Alles auswählen

LOCAL i
LOCAL oColumn
PRIVATE aTage := MakeTage()    // 2-Dim Array
PRIVATE nRecno := 1

   FOR i = 1 TO 6
      oColumn := XbpColumn():new( oBrowse,,,,PRES_PARAM )
      oColumn:drawMode := XBP_DRAW_OWNER

      bBlock        := "{|| aTage[nRecno,"+STR(i,3)+"] }"
      oColumn:dataLink := &bBlock

      oBrowse:addColumn( oColumn )
   NEXT
das funktioniert soweit.

Wenn ich aber nun Class VAR verwende

Code: Alles auswählen

CLASS OWbrowse FROM XbpBrowse
EXPORTED:
      VAR aTage, nRecno
...
      METHOD makeCol()
ENDCLASS

METHOD OWbrowse:makeCol()
LOCAL i
LOCAL oColumn
*LOCAL bBlock
PRIVATE bBlock

   ::aTage := MakeTage()    // 2-Dim Array

   FOR i = 1 TO 6
     oColumn := XbpColumn():new( ::XbpBrowse,,,,PRES_PARAM )
      oColumn:drawMode := XBP_DRAW_OWNER

*     bBlock        := "{|| ::aTage[::nRecno,"+STR(i,3)+"] }"
      bBlock        := "{|| ::aTage["+STR(::nRecno)+","+STR(i,3)+"] }"

      oColumn:dataLink := &bBlock
      ::XbpBrowse:addColumn( oColumn )
   NEXT
knallt es nun immer ... der "String" für den Codeblock stimmt nicht :(
jemand eine Idee wie ich den "String" zusammen stellen sollte ?
gruss by OHR
Jimmy
Christian
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 44
Registriert: Mi, 18. Jul 2007 15:05

Re: Macro :Datalink Codeblock mit Class VAR ?

Beitrag von Christian »

Hallo Jimmy,

was für eine Fehlermeldung bringt denn Xbase++ und wo?

Code: Alles auswählen

bBlock        := "{|| ::aTage[::nRecno,"+STR(i,3)+"] }"
oColumn:dataLink := &bBlock
sollt eigentlich wie gewünscht funktionieren.
Der Codeblock der dabei entsteht müsste etwa so aussehen:

Code: Alles auswählen

bBlock        := {|| ::aTage[::nRecno, 1] }    // für die 1. Spalte
Zu deinem 2. Versuch:

Code: Alles auswählen

bBlock        := "{|| ::aTage["+STR(::nRecno)+","+STR(i,3)+"] }"
das dürfte meiner Meinung nach nicht funktionieren, da ::nRecno schon bei Erstellung des Codeblock ausgewertet wird und dementsprechen immer den gleichen Wert besitzt

Code: Alles auswählen

bBlock        := {|| ::aTage[1,1] }
einen Absturz könnte ich mir nur erklären, wenn ::nRecno an dieser Stelle nicht Numerisch ist

mfg
Christian
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Macro :Datalink Codeblock mit Class VAR ?

Beitrag von Tom »

RecNo und aTage sind iVars Deiner Browse-Klasse, aber der Datalink wird vom Column-Objekt ausgewertet. Es müsste im Codeblock also:

::XbpBrowse:Recno bzw. ::XbpBrowse:aTage

heißen.
Herzlich,
Tom
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: Macro :Datalink Codeblock mit Class VAR ?

Beitrag von AUGE_OHR »

Tom hat geschrieben:RecNo und aTage sind iVars Deiner Browse-Klasse, aber der Datalink wird vom Column-Objekt ausgewertet. Es müsste im Codeblock also:
::XbpBrowse:Recno bzw. ::XbpBrowse:aTage
heißen.
damit kommt dann der Error SELF ...
---------------------------
Xbase++ Fehlermeldung
---------------------------
Fehler BASE/2000
Beschreibung : Unbekannte Variable
Operation : SELF
Thread ID : 1
Aufgerufen von (B)OWBROWSE:MAKECOL(0)
Aufgerufen von _BLOCK2STRING(1441)
Aufgerufen von XBPCOLUMN:CREATE(290)
Aufgerufen von XBPBROWSE:INSCOLUMN(868)
Aufgerufen von XBPBROWSE:ADDCOLUMN(689)
Aufgerufen von OWBROWSE:MAKECOL(302)
Aufgerufen von MAIN(43)
---------------------------
Wiederholen Abbrechen
---------------------------
ich schaffe es nicht ein SELF "in" einem String per Macro zum "funktionsfähigen" Codeblock für einen :Datalink umzuwandeln.
gruss by OHR
Jimmy
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: Macro :Datalink Codeblock mit Class VAR ?

Beitrag von AUGE_OHR »

hi,

so hier die Demo.
CALBRO.ZIP
(3.19 KiB) 390-mal heruntergeladen
Im Calbro.xpj steht
COMPILE_FLAGS = -q -w /DMAKEERROR
damit ist der Programm Teil in der

Code: Alles auswählen

#IFDEF MAKEERROR
// hier mit Macro
#ELSE
// hier "manuell"
#ENDIF
gemeint
gruss by OHR
Jimmy
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: Macro :Datalink Codeblock mit Class VAR ?

Beitrag von AUGE_OHR »

hi,

wenn man nicht /DMAKEERROR verwendet läuft das Ownerdraw Demo selbstverständlich mit dem 2-Dim Array.

dazu eine "allgemeine" Frage : Wenn ich zum "Bottom" komme und mit dem Cursor "runter" gehe erreiche ich :hitBottom.

im Demo "scrollt" er aber hoch und ich stehe dann in der (optisch) "vorletzten" Zeile.
Das Array ist aber nur 7x5 und die "letzte" (leere) Zeile wäre dann 7x6 ?

jemand eine Idee für ein Workaround ?
gruss by OHR
Jimmy
JUAMPA2
Rookie
Rookie
Beiträge: 3
Registriert: Do, 14. Jul 2011 22:26

Re: Macro :Datalink Codeblock mit Class VAR ?

Beitrag von JUAMPA2 »

Hi. I had the same problem and found a "dirty" solution: create the codeblock for :datalink with a function, sending as parameters the object (self) and the array pos, like follows:

in method:
oCol:datalink:=MakeClassBlock(self,nI)

and the function:

FUNCTION MakeClassBlock(oObj,nPos)
RETU {|| oObj:aTage[oObj:nRecno,nPos] }

the nPos and SELF (oObj) are visible, as DETACHED LOCALS

I hope it helps you, I just tested and it seems to work.
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: Macro :Datalink Codeblock mit Class VAR ?

Beitrag von AUGE_OHR »

JUAMPA2 hat geschrieben:Hi. I had the same problem and found a "dirty" solution: create the codeblock for :datalink with a function, sending as parameters the object (self) and the array pos, like follows:

in method:
oCol:datalink:=MakeClassBlock(self,nI)

and the function:

FUNCTION MakeClassBlock(oObj,nPos)
RETU {|| oObj:aTage[oObj:nRecno,nPos] }

the nPos and SELF (oObj) are visible, as DETACHED LOCALS
hm ... this i have to try.
thx for the Tip
gruss by OHR
Jimmy
Antworten