OOP

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
littlea1991
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 27
Registriert: Fr, 03. Aug 2018 7:17

OOP

Beitrag von littlea1991 »

Guten Morgen Liebe Forenmitglieder,

ich bin gerade dabei zu verstehen wie genau Objektorientierte Programmierung in Xbase++ abläuft. Ich weiß das ich mit Objekt1 := Klasse1:New() eine Objekt der Klasse kreieren kann. Allerdings schlägt der Aufruf fehl, wenn ich den Code nur ausführen will innerhalb eines XbPPushButton Activates.

Ich habe eine Klasse in einer PRG Datei:

Code: Alles auswählen

CLASS Primzahl
   EXPORTED:
      METHOD init
ENDCLASS


METHOD init()

MsgBox("test")

Return self

und würde gerne auf den Code meiner Klasse innerhalb einer anderen Klasse in deren Methoden darauf zugreifen.

Code: Alles auswählen


******************************************************************************
METHOD NewForm:create( oParent, oOwner, aPos, aSize, aPP, lVisible )

   * Methode der Superklasse rufen
   ::_NewForm:create( oParent, oOwner, aPos, aSize, aPP, lVisible )

   oPrimZahl := Primzahl():New()
   oPrimZahl:init()  //<-- Hier funktioniert der aufruf

   ::ende:activate  := {|| ::anfangsBereich:clear(), ::endBereich:clear(), ::ausgabeFeld:clear()} //XbPushButton Event
   ::start:activate :={||  oPrimZahl:init() } // <-- Hier kommt der Fehler (XbpPushButton Event)
   * Formular anzeigen
   ::show()


RETURN self

im unteren Versuch den gleichen Befehl aufzurufen, kommt die Fehlermeldung: "Member-Variable ist für dieses Objekt unbekannt"

während weiter Oben der aufruf ganz Normal funktioniert. Ich kenne es normalerweise in Java, das wenn ich ein Objekt einer Klasse kreiere, ich danach den vollen Zugriff auf die Methoden der Klasse habe. Habe ich da was falsch verstanden? Würde man das in Xbase anders implementieren?
Ich habe mir überlegt auch eine dritte Testklasse zu schreiben mit einer Main Methode die die Objekte Klasse NewForm (Kreiert vom Form Designer Class Code) und der Klasse Primzahl kreiert und ihre Methoden aufruft.
Die Klassen sind alle in einzelnen *.PRGs abgespeichert worden.

Vielen lieben Dank im vorraus für eure Antworten!

Gruß

Ali
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16488
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: OOP

Beitrag von Martin Altmann »

Moin,
ein :new() ruft das :init() implizit auf.
Du solltest in deiner Primzahlklasse die Methode zum Ausgeben deiner MsgBox anders nennen.

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.
littlea1991
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 27
Registriert: Fr, 03. Aug 2018 7:17

Re: OOP

Beitrag von littlea1991 »

ah Danke für den Hinweis! Ich habe jetzt die Methode anders genannt, weißt du vielleicht warum der Fehler "Member-Variable ist für dieses Objekt unbekannt" weiter unten im ::Start:Activate{} Block auftaucht? Ich rufe den gleichen Code weiter oben auf und er funktioniert ganz gut, dazwischen wird ja nichts am Objekt verändert. Oder rufe ich es einfach falsch auf im Activate{} Block?

Gruß

Ali
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16488
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: OOP

Beitrag von Martin Altmann »

Moin,
es geht bei der Fehlermeldung um deine private oPrimzahl - die ist zum Zeitpunkt des :create() deiner NewForm bekannt. Aber nur dann! Du belegst dort einen :activate-Slot, der erst „schießt“, wenn das entsprechende Event eintritt (Klick auf den Button). Dort ist deine private aber nicht mehr bekannt.
Du solltest also in der Klasse eine Membervar erzeugen (z.B. oPrimzahl) und diese dann benutzen (also ::oPrimzahl)

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: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: OOP

Beitrag von AUGE_OHR »

moin,
littlea1991 hat geschrieben: Mo, 13. Aug 2018 8:37

Code: Alles auswählen

METHOD NewForm:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
   ::start:activate :={||  oPrimZahl:init() } // <-- Hier kommt der Fehler (XbpPushButton Event)
in ::Start:activate gibst du dein Prim-Zahlen Modul ein was ausgeführt werden soll ( o:MachMal() ).
ich nehme an das ::anfangsBereich und ::endBereich die Werte für den Ablauf enthalten soll
bei ::AusgabeFeld gehe ich davon aus das es deine Listbox() sei die du mit Werten füllen willst

Code: Alles auswählen

   ::start:activate :={|| oPrimZahl:MachMal(::anfangsBereich,::endBereich,::ausgabeFeld) } 

CLASS Primzahl
   EXPORTED:
      METHOD init
      METHOD MachMal()
ENDCLASS

METHOD Primzahl:MachMal(oAnfangsBereich,oEndBereich,oAusgabeFeld)
LOCAL nStart := VAL(oAnfangsBereich:Getdata() )
LOCAL nEnde  := VAL(oEndBereich:Getdata()     )
   // hier dein Prim-Zahlen Code
   ...
  
   // Listbox() füttern
   oAusgabeFeld:AddItem(cText) 
Return self
in einem SLE wird mit o:GetData() "gelesen = GET" ( o:SetData() ist zum "setzten = SAY" )
da man IMMER ein String erhält mit man ihn noch mit VAL() in eine Nummer umwandeln
gruss by OHR
Jimmy
littlea1991
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 27
Registriert: Fr, 03. Aug 2018 7:17

Re: OOP

Beitrag von littlea1991 »

super! Das hat jetzt auch so geklappt! Was ich sehr interessant finde ist das eine Klasse auch von mehreren anderen Erben kann. (somit kann man ganz ohne Interfaces arbeiten, wie man die von Java so kennt) Vielen Dank noch einmal für eure Hilfe!

Gruß

Ali
Antworten