VAR aus Class A in Class B verwenden

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

VAR aus Class A in Class B verwenden

Beitrag von AUGE_OHR »

hi,

angenommen ich habe die Class "A" und die Class "B" als XbParts.

Ich mache also ein XbpDialog und platziere die beiden auf der :DrawingArea.
Aus dem XbpDialog könnte man per :DrawingArea:Childlist() auf die iVAR zugreifen

Code: Alles auswählen

LOCAL aChild := oDlg:DrawingArea:Childlist()
LOCAL cTest

   // lese iVAR aus Class "A"
   cTest := aChild[1]:myVAR

   // schreibe iVAR nach Class "B"
   aChild[2]:otherVAR := cTest
dies funktioniert also wenn ich "oberhalb" der beiden Class "A" und "B" bin, aber wie kann ich
wenn ich "in" der Class "A" bin es hin bekommen das ich "nach B" komme ?

... man könnte ja eine PUBLIC nehmen ...
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: VAR aus Class A in Class B verwenden

Beitrag von brandelh »

PUBLIC ... :color: [-X

Wie sehen die Verhältinsse aus:

Code: Alles auswählen

oDlg:drawingarea:XbpA
oDlg:drawingarea:XbpB
Von XbpA nach XbpB müsste so gehen: XbpA:SetParent():XbpB

die drawingarea ist der Parent von beiden.
Oder man macht getChildbyName() ...

Ich habe im Dialog (oDLG) jeweils eine iVar für jedes Control und spreche das so an:

oDlg:sleNachName

aus einem anderen Control heraus ... ::setParent():setParent():sleNachName

...
Gruß
Hubert
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: VAR aus Class A in Class B verwenden

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: PUBLIC ... :color: [-X
jaja ... deshalb ja die Frage
brandelh hat geschrieben: aus einem anderen Control heraus ... ::setParent():setParent():sleNachName
genau das ::setParent():setParent() ist ja das was ich "fürchte" ...

wenn nun Class "A" und "B" nicht einen gemeinsamen Parent haben ...weil z.b. eine Groupbox um "B"

wenn ich nun eine Class C from ClassA, ClassB machen würde könnte man ja "beide" iVAR
ansprechen ... aber wenn beide iVAR nun ::nProzent heissen ? ... geht das überhaupt ?

Code: Alles auswählen

CLASS AAA FROM XbpBrowse
   EXPORTED:
      METHOD init()
      VAR nProzent
ENDCLASS 
METHOD AAA:init()
   ::nProzent := 0
RETURN self

CLASS BBB FROM XbpSplitbar
   EXPORTED:
      METHOD init()
      VAR nProzent
ENDCLASS 
METHOD BBB:init()
   ::nProzent := 100
RETURN self
das jetzt in einer neuen Class

Code: Alles auswählen

CLASS CCC FROM AAA, BBB

oTest := CCC():new():Create()

? oTest:nProzent
und nun (nicht getestet) ?
gruss by OHR
Jimmy
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: VAR aus Class A in Class B verwenden

Beitrag von Lewi »

Hallo Jimmy,

als Ergebnis gibt es "100".
Warum?

Nun:

1.
CLASS BBB hat eine einene Membervar :nProzent. Die KLasse erbt insofern die MemberVar von Class AAA
als das auf AAA:nProzent zugeriffen werden kann. Die MemberVar BBB:nProzent hat trotz Namensgleicheit
keinen Bezug zu AAA:nProzent

2.
CLAAS CCC hat keine eigene MemberVar :nProzent. Die Klasse erbt also die MemberVar von BBB
Auf die MemberVar auf AAA kann über AAA:nProzent zugergriffen.


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

Re: VAR aus Class A in Class B verwenden

Beitrag von brandelh »

AUGE_OHR hat geschrieben:
brandelh hat geschrieben: aus einem anderen Control heraus ... ::setParent():setParent():sleNachName
genau das ::setParent():setParent() ist ja das was ich "fürchte" ...
wenn nun Class "A" und "B" nicht einen gemeinsamen Parent haben ...weil z.b. eine Groupbox um "B"
Ja, das war immer ein Problem, aber wir wurden erhört:

GetParentForm(oXbp)

sollte immer den Dialog zurückgeben, wenn nun alle Controls dort definiert sind (wie es ja auch der XppFD macht, dann hat man sofort Zugriff, egal wieviele Boxen und Rahmen dazwischen sind.

In älteren Versionen hätte man wohl eine Funktion ähnlich der SetAppWindow() nutzen müssen um sich das aktuelle Fenster zu merken.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: VAR aus Class A in Class B verwenden

Beitrag von brandelh »

AUGE_OHR hat geschrieben:wenn ich nun eine Class C from ClassA, ClassB machen würde könnte man ja "beide" iVAR
ansprechen ... aber wenn beide iVAR nun ::nProzent heissen ? ... geht das überhaupt ?
Zur Auflösung der Werte hat ja Olaf bereits geschrieben, ich dachte bisher es geht um Controls auf einem Dialog !

Wenn du mehrere "freie Objekte" hast, musst du halt irgendwo (AppObject, Stammfenster, Dialogfenster, in einer Funktion ...) - das heißt, je Einzelfall an der besten Position - diese speichern und danach darauf zugreifen. Einmal fürs ganze Programm: AppObject oder in einer Funktion wie z.B. SetAppWindow() ...

Zur Frage "geht das ...":

JEDE Klasse in JEDER Verschachtelungsebene darf gleiche Variablen und Methoden haben.
Natürlich kann es da Nebenwirkungen geben, wenn eine abgeleitete Klasse eine Methode oder iVar mit gleichem Namen neu definiert.

Bei den Variablen kann man das am Besten vergleichen mit der bekannten Situation von PRIVATE und LOCAL Variablen:

Code: Alles auswählen

private cName := "Test"
? MeinUpper(cName) , cName -> TEST Test  // Parameter als Kopie übergeben
? MeinAnders(cName), cName -> TEST TEST // Parameter als Kopie übergeben
...
function MeinUpper(cName)                       // cName als Parameter == LOCAL
    cName :=  upper(cName)                      // LOCAL cName überdeckt PRIVATE cNAME
return cName                  
...
function MeinAnders()                              // kein Parameter übernommen
    cName :=  upper(cName)                           // nur auf PRIVATE cNAME zugegriffen
return cName     
Bisher hätte man natürlich auch eine LOCAL cName und die PRIVATE M->cName gleichzeitig ansprechen können. Ähnlich verhält es sich mit verdeckten iVars und Methoden in Objekten.

::cName -> iVar dieses Objektes == dieser Klasse (wenn implementiert) oder einer früheren.
::MySuperClass:cName -> iVar der Superklasse, z.B. weil ::cName neu definiert wurde.

Fast wie bei C/C++ ;-) es geht fast alles, nur die Ergebnisse entsprechen nicht immer unseren Erwartungen ... :D
Gruß
Hubert
Antworten