self in aeval [erledigt]

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1915
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 12 Mal
Danksagung erhalten: 28 Mal

self in aeval [erledigt]

Beitrag 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?
Zuletzt geändert von Werner_Bayern am Mo, 01. Mär 2021 13:40, insgesamt 1-mal geändert.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15492
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 30 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: self in aeval

Beitrag 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 ...
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1915
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 12 Mal
Danksagung erhalten: 28 Mal

Re: self in aeval

Beitrag von Werner_Bayern »

Servus Hubert,

siehe Eingangspost und Betreff :wink:
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15492
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 30 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: self in aeval

Beitrag 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
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1915
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 12 Mal
Danksagung erhalten: 28 Mal

Re: self in aeval

Beitrag 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.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15492
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 30 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: self in aeval

Beitrag von brandelh »

Ich sehe da zwar keine Klassen ... aber wie gesagt war nur mein Tipp auf die Fehlermeldung ... du kannst machen was du willst ;-)
Gruß
Hubert
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2763
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 4 Mal
Danksagung erhalten: 11 Mal
Kontaktdaten:

Re: self in aeval

Beitrag 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).
Viele Grüße
Wolfgang
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15492
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 30 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: self in aeval

Beitrag 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
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1915
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 12 Mal
Danksagung erhalten: 28 Mal

Re: self in aeval

Beitrag 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?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Marcus Herz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 465
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 17 Mal
Danksagung erhalten: 71 Mal
Kontaktdaten:

Re: self in aeval

Beitrag 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
Gruß Marcus

Es gibt keine Grenzen, aber du kannst welche ziehen.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1915
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 12 Mal
Danksagung erhalten: 28 Mal

Re: self in aeval

Beitrag von Werner_Bayern »

Servus Marcus,

danke, kannte ich noch nicht!

Aber Du und die Hilfe zu :eval erklären mein "Problem".
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15492
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 30 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: self in aeval [erledigt]

Beitrag 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.
Gruß
Hubert
Antworten