Klassen und Variablen

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14659
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Klassen und Variablen

Beitrag von Jan »

Als Fortsetzung der Unterweisungen auf unserem XUG-Treffen vor 1 Woche eine Frage von einem Klassen-Dummy 8)

Ich habe eine recht umfangreiche Klasse bekommen. Der Programmierer hat dabei mit den internen Variablen sehr stark mit PRIVATEs gearbeitet. Einige davon kann ich locker in LOCALs umwandeln. Andere nicht. Kann ich diese einfach als VARs in die Klasse einbauen? Z. B. als PROTECTED? Die sind wirklich nur für intern, von außen sollen die nicht sichtbar und manipulierbar sein.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15699
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 69 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Klassen und Variablen

Beitrag von brandelh »

Hallo Jan,

wenn eine Variable ausschließlich in einer Methode benutzt werden soll, dann nimm LOCAL, ansonsten nimm PROTECTED dann passt das.
EXPORTED wird dann nötig, wenn du z.B. aus einem Code-Block oder von außen auf eine iVar zugreifen musst. Allerdings soll man eigentlich keine EXPORTED iVars verwenden, sondern nur PROTECTED und dann mit Access / Assign / oder normalen Methoden den Zugriff regeln (Kapselung)
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14659
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Klassen und Variablen

Beitrag von Jan »

Nun habe ich damit aber ein Problem: Ich habe angefangen, die ganzen PRIVATs in VARs umzubauen. Sauarbeit, aber ich finde dabei auch stapelweise andere Fehler (und für den Code habe ich auch noch Geld gelassen :? )

Aber ich bekomme dauernd Laufzeitfehler (Unbekannte Variable) wenn ich soetwas machen möchte:

Code: Alles auswählen

cWasAuchImmer := ::cVar
Warum? Ich habe der ::cVar einen Wert zugewiesen. Ich kann im Debugger sehen, daß der durch die Zuweisungszeile durchgelaufen ist. Den Wert von ::cVar selber sehe ich leider nicht.

Was ist mein Fehler dabei?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Re: Klassen und Variablen

Beitrag von Lewi »

Aus Deiner Zeile Code läßt sich der Fehler nicht erkennen. ;-)

Folgende Fehlerursachen sind aufgrund der Fehlermeldung möglich.
::cVar ist:

- ist als hidden oder Protected definiert ( in der eigenen Klasse oder in der Super-Klasse)
- es handelt sich um eine Access Assign Mehode ( wie z.B: ::caption bei xbpStatic)
- die Member-Variable gibt es überhaupt nicht

Gruß, Olaf
Zuletzt geändert von Lewi am Fr, 28. Nov 2008 18:05, insgesamt 3-mal geändert.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12911
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Klassen und Variablen

Beitrag von AUGE_OHR »

hi,
Jan hat geschrieben: Aber ich bekomme dauernd Laufzeitfehler (Unbekannte Variable) wenn ich soetwas machen möchte:

Code: Alles auswählen

cWasAuchImmer := ::cVar
Warum? Ich habe der ::cVar einen Wert zugewiesen. Ich kann im Debugger sehen, daß der durch die Zuweisungszeile durchgelaufen ist. Den Wert von ::cVar selber sehe ich leider nicht.
die Frage ist "wo" du die Zuweisung machst und wie deine Class "from" aussieht.
oft hilft es wenn man erst nach dem :create() die Variabeln "belegt".

wenn du paar Zeile Code posten könntest ...
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14659
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Klassen und Variablen

Beitrag von Jan »

Hallo Olaf, Hallo Jimmy,

also: Die cVar ist PROTECTED. Das hatte ich ja oben schon angefragt, soll ja lt. Hubert das richtige sein. Und vor der geposteten Zeile war die Zuweisung des Wertes an cVar. Ich hab das mit dem Debugger extra verfolgt.

Code posten ist etwas schwierig. Zum Einen ist der echt ellenlang, und ich müsste das ellenlange posten, damit der Sinn erscheint. Und zum Anderen geht das nicht, weil der Code nicht öffentlich ist (wie gesagt, ich hab dafür bezahlt, und der Besitzer möchte das nicht so unters Volk bringen)

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14659
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Klassen und Variablen

Beitrag von Jan »

OK, super, ich glaub, ich hab den Fehler gefunden. Manchmal muß es einen einfach mal blitzartig überrollen.

Der Programmierer hatte das alles ja als PRIVATE deklariert. Da das alles in einer prg ist, funktioniert das dann auch. Nun habe ich das auf PROTECTED VARs umgestellt. Geht auch. Aber natürlich nur, solange das in der Klasse aufgerufen wird. :? Der ruft da aber eine STATIC FUNCTION auf, ohne die Variable zu übergeben! Klar, daß die Variable da unbekannt ist :banghead:

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Re: Klassen und Variablen

Beitrag von Lewi »

Wenn Sie protected ist, dann kann auf die Membervarieble nur innerhalb der einzelnen Klassen-Methoden zugegriffen werden. Von "außen" ist die Variable nicht sichtbar. Wird eine Variable protected in einer Superklasse definiert, ist sie auch nicht bei den von der Super-Klasse abgeleiteten Klassen sichtbar.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16543
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 114 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Klassen und Variablen

Beitrag von Martin Altmann »

Yup.
Was Jan vielleicht nehmen wollte, ist HIDDEN - vermute ich mal...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12911
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Klassen und Variablen

Beitrag von AUGE_OHR »

hi,
Jan hat geschrieben: Der ruft da aber eine STATIC FUNCTION auf, ohne die Variable zu übergeben! Klar, daß die Variable da unbekannt ist :banghead:
Tja wenn der Editor dir nicht alles anzeigt ...
Hast du in VX Crtl-Shift-R zum "austauschen" der Variablen benutzt ?
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14659
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Klassen und Variablen

Beitrag von Jan »

Jimmy,

STRG-R. Und nein, nicht nur. Manchmal auch von Hand. Ich hab einfach die 2.500 Zeilen Code durchgearbeitet, und irgendwann lief bei den dutzenden von deklarierten PRIVATES die Konzentration aus dem Ruder. Und ich hab einfach ohne groß nachzusehen durchgeändert. Bin einfach durch die FUNCTIONS durchgerauscht, ohne das zu merken.

Martin,

wo genau liegt denn der Unterschied zwischen PROTECTED und HIDDEN, speziell in diesem Fall?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16543
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 114 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Klassen und Variablen

Beitrag von Martin Altmann »

Jan,
das hatte ich am Samstag erklärt [-X 8)
Hat aber weniger was mit diesem Fall zu tun!
HIDDEN: Methoden/Vars sind nur innerhalb der Klasse und Instanzen sichtbar.
PROTECTED: Methoden/Vars sind nur inneralb der Klasse sichtbar.
In beiden Fällen kann nicht von aussen drauf zugegriffen werden!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14659
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Klassen und Variablen

Beitrag von Jan »

Martin,

immer diese Vorwürfe! Sei nachsichtig mit mir, immerhin wollt Ihr mich doch zum Klassendenken bekehren. Also Geduld!

Der feine Unterschied zwischen PROTECTED und HIDDEN war mir halt leider so spät abends nach unserer Firmenweihnachtsfeier nicht mehr so ganz geläufig. Ich denke aber, daß PROTECTED hier für mich die richtige(re) Lösung sein wird.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15699
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 69 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Klassen und Variablen

Beitrag von brandelh »

Hallo Jan,
JAN hat geschrieben: Z. B. als PROTECTED? Die sind wirklich nur für intern, von außen sollen die nicht sichtbar und manipulierbar sein.
ganz oben habe ich geschrieben, dass alles was außerhalb benötigt wird auch exported (nicht empfohlen) oder per Access/Assign Methode (diese exported) zur Verfügung gestellt werden muss !

Bei der Syntax:

::MyVar - geht nur in einer Methode dieser Klasse, da :: == SELF !

Von außen:

MyClassVar:MyVar -> MyClassVar könnte z.B. als Parameter übergeben worden sein !

PS:

ich wollte es am Anfang nicht schreiben, aber wenn du den Quellcode auch noch gekauft hast:

Ein Programmierer, der Klassen und PRIVATE mischt ... :banghead:
Gruß
Hubert
Antworten