MemberVar umbenennen

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

Moderator: Moderatoren

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

Re: MemberVar umbenennen

Beitrag von brandelh »

Das Problem ist schon bekannt, seit es Xbase++ Klassen gibt.
Wenn der Parser besser wäre, würde er zwischen einfachen Kommandos, Variablen (verboten, da Namenskonflikt) und Methoden / Instanzvariablen unterscheiden (die dürften keine Fehlermeldung geben).
Gruß
Hubert
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: MemberVar umbenennen

Beitrag von Tom »

Jimmy, das ist nur noch mehr Blödsinn, mit Verlaub (ich stimme Jans Vermutung zu). Kennst Du Dich mit der JSON-Notation überhaupt aus?

All das ist kein Problem inhaltlicher Art, sondern, wie Hubert gerade ganz richtig schrieb, ein Problem des Syntaxparsers, der da Kommandos nicht von anderen Elementen unterscheiden kann. Mit GetNoIVar kann man das hier gut umgehen. Wenn man JSON in gepaarte Arrays (Name/Inhalt der Instanzvariablen) umschaufelt, muss man ständig nach den Variablen suchen (in Bäumen!) oder sich Positionen merken - die aber wechseln können, sogar innerhalb einer Datenlieferung.

Per Makro könnte man das Problem vermutlich auch umgehen, aber dann dürfte das erzeugte Objekt nicht LOCAL sein.

Und, noch einmal:

Mist.Dings.Next.Murks in JS-Notation wären drei Objekte (Mist, Dings, Next) und ein Irgendwas (Objekt oder andere Variable). Selbst in JS oder VB sind Methoden durch die Parameterklammern erkennbar. In JS werden bei Arrays eckige Klammern verwendet.
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: MemberVar umbenennen

Beitrag von AUGE_OHR »

Jan hat geschrieben: Mo, 02. Jul 2018 8:04 Da das Problem in einem Xbase++-Bug liegt,
JA
Jan hat geschrieben: würde auch Pablos JSON-Klasse scheitern. Die ja auch mit MemberVars arbeitet
NEIN [-X
er arbeitet mit TGXbStack() :!:

es gibt zwar die

Code: Alles auswählen

INLINE METHOD SetNoIVar(k,v)
INLINE METHOD GetNoIVar(k)
aber gehen auf den "Stack" um die Daten direkt auszulesen :!:
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: MemberVar umbenennen

Beitrag von AUGE_OHR »

Tom hat geschrieben: Mo, 02. Jul 2018 10:30 Kennst Du Dich mit der JSON-Notation überhaupt aus?
können wir uns darauf einigen das dass JSON Format (was ich kenne) NICHT das Problem ist !

wenn ich ein Array oder "Stack" wie Pablo nehme und ein externes Format einlese ist es egal was kommt :
String, Num, Date, Blob etc.
der Grund liegt in Windows denn ich habe nur eindeutige Pointer (numerisch) wo ich die Daten ablege.

---

das Alaska DataObject soll das ganze nun mit "Namen" machen und da kommt das "interne" Problem mit KEYWORDs :(

ein "echtes" DataObject hat solche Problem NICHT denn auch dort wäre der "Name" auch nur ein Pointer der zu einem String führt.

---

Code: Alles auswählen

INLINE METHOD SetNoIVar(k,v)
       return ::set_prop( k , v )
       // ---------------------------------------------------------------------------------
INLINE METHOD GetNoIVar(k)
       return ::get_prop( k )
       // ------------------
hier fängt Pablo es ab und leitet es weiter an

Code: Alles auswählen

INLINE SYNC METHOD set_prop( k , v )
       local cnt := nRShift(Len(::m_json_hash),2)
       local dwh := 0
       local pos := @ot4xb:_dwscan_lwstrcrc32(::m_json_hash,cnt,__vstr(k,""),-1,@dwh)
       if pos == -1
          pos := cnt
          ::m_json_hash += __i32(dwh)
          aadd( ::m_json_props , __anew( __vstr(k,"") , v ) )
       else
          ::m_json_props[ pos+1][2] := v
       end
       return NIL
       // ---------------------------------------------------------------------------------
INLINE SYNC METHOD get_prop( k )
       local cnt := nRShift(Len(::m_json_hash),2)
       local dwh := 0
       local pos := @ot4xb:_dwscan_lwstrcrc32(::m_json_hash,cnt,__vstr(k,""),-1,@dwh)
       if pos == -1
          return NIL
       end
       return ::m_json_props[ pos+1][2]
es ist "egal" ob da ein KEYWORD kommt oder nicht :!:

---

es geht mir nicht darum "Recht" zu haben sondern eine Lösung zu finden.

das ist aber oft nur dann zu lösen wenn man sich von der Xbase++ "Beschränkung" löst.
nun baut aber alles auf Windows und deren API auf also muss man dort nach einer Lösung suchen.

ein DataObject, was wohl wie alle XbParts, von der CLASS Abstract() abgeleitet wurde kann also nur eingeschränkt genutzt werden wie alle XbParts :!:
gruss by OHR
Jimmy
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: MemberVar umbenennen

Beitrag von Tom »

Mensch, Jimmy.

Blödsinn, Kapitel III. Mit Verlaub. :wink:

XbParts sind Controls. Ihnen ist gemein, dass sie allesamt von XbpWindow() abgeleitet sind. Das Data Object hat mit Xbase Parts nix zu tun. Abstract() ist die Mutter aller Klassen, die es in Xbase++ gibt, und sie stellt allgemeine Methoden wie ClassDescribe() und ähnliche zur Verfügung - auch dem Data Object. Auch das hat mit Xbase Parts nur insofern zu tun, dass sie auch hiervon abgeleitet sind, aber das gilt, wie gesagt, für alle Klassen in Xbase++. Die Mutterklasse vererbt übrigens auch "GetNoIVar", über die wir hier im Thread das Problem von Jan exakt genauso gelöst haben wie Pablo das in seiner Methode aus Deinem Beispiel macht. GetNoIVar liefert die Instanzvariable (bzw. ihren Inhalt) zurück, wenn diese existiert, ansonsten NIL. Feddisch.
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: MemberVar umbenennen

Beitrag von AUGE_OHR »

XParts sind Controls UND Objecte. Xbase++ DataObject ist ein Object und unter Windows auch ein Control.
aber das ist alles EGAL denn DataObject funktionieren in diesem Fall NICHT wegen KEYWORDs.

Blödsinn ist es wenn ihr über meine Lösungs-Vorschlag redet aber nicht selbst einen Versuch unternehmt :!:

ich zumindest habe KEINE Problem mit KEYWORDS wenn ich die JSON Routine von Pablo nutze !
... vielleicht hab ihr nicht die "richtige" Version oder verwendet die falsch (Xbase++ OOP Syntax).
gruss by OHR
Jimmy
Joern
Rookie
Rookie
Beiträge: 10
Registriert: Di, 19. Jul 2011 9:31
Wohnort: Ebensfeld
Hat sich bedankt: 45 Mal
Danksagung erhalten: 4 Mal

Re: MemberVar umbenennen

Beitrag von Joern »

Hallo zusammen,

ich hatte ein ähnliches Problem mit einer Membervar "FUNCTION"

Ich konnte das durch den Macro-Operator lösen.

Local cFunction := "FUNCTION"

Objekt:&cFunction:

Bei Next habe ich das aber noch nicht probiert.
Gruß
Joern
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: MemberVar umbenennen

Beitrag von Tom »

Hallo, Joern.

Ja, das geht, verblüffenderweise sogar, wenn das DataObject LOCAL ist, aber NICHT, wenn die Variable, die den Variablennamen enthält, LOCAL ist. Dann bekommst Du schon beim Kompilieren Fehler XBT0242 "Macro of LOCAL, STATIC or FIELD variable". Das hier geht auch:

Code: Alles auswählen

? oData:&("Next")
Herzlich,
Tom
Joern
Rookie
Rookie
Beiträge: 10
Registriert: Di, 19. Jul 2011 9:31
Wohnort: Ebensfeld
Hat sich bedankt: 45 Mal
Danksagung erhalten: 4 Mal

Re: MemberVar umbenennen

Beitrag von Joern »

Hallo Tom,

Seltsam.
Mein Datenobjekt ist Public.
Meine Variable Local.

Objekt:&cFunction :="was auch immer"

cFunction ist eine Local Variable mit dem Wert "Function"

Lässt sich bei mir Kompilieren.

Oder ich steh auf dem schlauch und kann dir nicht folgen.
Gruß
Joern
Antworten