Seite 1 von 1

self in aeval [erledigt]

Verfasst: Sa, 27. Feb 2021 23:29
von Werner_Bayern
Servus,

kann mir das einer erklären?

Code: Alles auswählen

aeval(aTabelle, {|cTabelle| cText += Programmpfad() + "pg\pg_dump.exe -w -d " + ::cDB + " -h " + ::cSQL_Server + " -p " + ltrim(str(::nPort)) +;
" -U " + ::cSQL_Benutzer + " -b -C -F c -t " + cTabelle + " > " + cPfad + cTabelle + CRLF})
Fehlermeldung:
Zugriff auf Member-Variable nicht erlaubt
Operation: nPort
Das hier geht:

Code: Alles auswählen

confirmbox(, str(::nPort))
cText += Programmpfad() + "pg\pg_dump.exe -w -d " + ::cDB + " -h " + ::cSQL_Server + " -p " + ltrim(str(::nPort)) +;
" -U " + ::cSQL_Benutzer + " -b -C -F c -t " + aTabelle[1] + " > " + cPfad + aTabelle[1] + CRLF
local oVar := self - und dann oVar anstelle von :: zu verwenden bringt dieselbe Fehlermeldung. Ein confirmbox() im Codeblock von aeval() auf ::cDB geht, auf ltrim(str(::nPort)) nicht!

Das ist doch ein Bug?

Re: self in aeval

Verfasst: So, 28. Feb 2021 11:58
von brandelh
Wenn die Membervariable PROTECT ist kann man auf sie nicht von Außen zugreifen ... auch aus einem Codeblock heraus ist das "von Außen"
am Besten in local umladen oder freigeben ...

Re: self in aeval

Verfasst: So, 28. Feb 2021 14:05
von Werner_Bayern
Servus Hubert,

siehe Eingangspost und Betreff :wink:

Re: self in aeval

Verfasst: So, 28. Feb 2021 14:56
von brandelh
Hi,

genauer lesen ;-)
local oVar := self - und dann oVar anstelle von :: zu verwenden bringt dieselbe Fehlermeldung.
damit wird zwar :: umgangen, aber oVar:nPort versucht immer noch auf die gleiche Klasse von Außen zuzugreifen, entweder dort EXPORTED setzen oder ... den Inhalt umladen !

local nPort := ::nPort ... im Codeblock dann auf die local nPort zugreifen

Re: self in aeval

Verfasst: So, 28. Feb 2021 21:00
von Werner_Bayern
Servus Hubert,

siehe das 2. Codeschnipsel meines Eingangspost - das funktioniert innerhalb der Klasse. Selbstverständlich ist ::nPort exportet. Ich hab das Problem innerhalb aeval.

Re: self in aeval

Verfasst: Mo, 01. Mär 2021 7:09
von brandelh
Ich sehe da zwar keine Klassen ... aber wie gesagt war nur mein Tipp auf die Fehlermeldung ... du kannst machen was du willst ;-)

Re: self in aeval

Verfasst: Mo, 01. Mär 2021 10:12
von Wolfgang Ciriack
Hi Hubert,
dein Hinweis auf "genauer lesen" war gut, kann man zurückgeben. :wink:
Ich war auch auf deine Möglichkeit hinaus, aber das zweite Beispiel im ersten Beitrag (ohne Aeval) zeigt ja, dass der Zugriff auf ::nPort möglich ist (muss also Exported sein).

Re: self in aeval

Verfasst: Mo, 01. Mär 2021 11:38
von brandelh
also ich sehe zwar im Code die Confirmbox und später im Text .... aber...

Ein confirmbox() im Codeblock von aeval() auf ::cDB geht, auf ltrim(str(::nPort)) nicht!

da steht was anderes und ich hab einfach keine Lust weiter zu raten ;-)

Die Fehlermeldung ist eindeutig, eines der genannten Member Vars ist nicht exported, oder SELF wurde überlagert, was auch immer

Re: self in aeval

Verfasst: Mo, 01. Mär 2021 13:09
von Werner_Bayern
Hubert hat Recht!

Code: Alles auswählen

      Protected:
      var oSession READONLY

      var cDBE, cSQL_Benutzer, cSQL_Passwort, nPort, lProtokoll

      Exported:
      var cDB, cSQL_Server, nServer_Version, cUpdate, nDS, nLimit, cBefehl, cSort, nSessionID, cDErweiterung, cEncoding, cLocale, nPID
Aber trotzdem: Ich bin innerhalb der Klasse, sieht man doch am "::" und in einer Methode steht das direkt unterneinander, was ich gepostet habe. Habe das aeval mit einer for-next-Schleife ersetzt, so läuft es.

Da passt was nicht?

Re: self in aeval

Verfasst: Mo, 01. Mär 2021 13:21
von Marcus Herz
ein Eval oeder AEval erzeugt einen Code, welcher als "Funktion" ausgeführt wird, also ausserhalb von Self.
Für Eval gibt es ja die Methode ::eval, welche diese Problem dann nicht mehr hat

Re: self in aeval

Verfasst: Mo, 01. Mär 2021 13:39
von Werner_Bayern
Servus Marcus,

danke, kannte ich noch nicht!

Aber Du und die Hilfe zu :eval erklären mein "Problem".

Re: self in aeval [erledigt]

Verfasst: Mo, 01. Mär 2021 17:56
von brandelh
Da haben wir den Salat ;-)

wenn Du do while oder For next oder irgendwas andres machst, bleibst du in der Methode und alles ist gut.

AEVAL() selbst ist noch kein Problem, aber wenn ein Codeblock ins Spiel kommt, ist das immer ein Zugriff von "außen", genauso als ob du das in eine echte Funktion auslagern würdest.
Ein Codeblock ist eine Funktion ohne eigenen Namen, daher steht der Code in einer anderen Umgebung, aber es ist eine eigene abgeschlossene Funktion.