Seite 1 von 1

CLASS ... FROM XbpDialog, XbpBrowse

Verfasst: Di, 22. Nov 2022 12:04
von georg
Guten Morgen,


aktuell habe ich Probleme mit der o.a. Konstellation.

Code: Alles auswählen

CLASS LogWin FROM XbpDialog, XbpBrowse
   EXPORTED:
   ...
   METHOD init
   METHOD create
   METHOD destroy
   METHOD hide
   METHOD show

ENDCLASS

METHOD LogWin:init(oParent, oOwner, aPos, aSize, aPP, lShow)
   self:lRatioActive := .F.
   self:cFileName := ""

   self:oParent  := oParent
   self:oOwner   := oOwner

   self:aPosDia  := aPos
   self:aSizeDia := aSize
   self:aPP      := aPP
   self:lShow    := lShow

RETURN (Self)

METHOD LogWin:create(oParent, oOwner, aPos, aSize, aPP, lShow)
   ...

   self:XbpDialog:new(self:oParent, self:oOwner, self:aPosDia, self:aSizeDia, self:aPP, self:lShow)
   self:XbpDialog:create(self:oParent, self:oOwner, self:aPosDia, self:aSizeDia, self:aPP, self:lShow)
Die self:XbpDialog:new() Anweisung wird ohne Fehler ausgeführt, die self:XbpDialog:create() Anweisung erzeugt diesen Fehler:

Code: Alles auswählen

oError:args         :
          -> VALTYPE: O CLASS: LogWin
          -> VALTYPE: O CLASS: XbpIWindow
          -> VALTYPE: O CLASS: XbpIWindow
          -> VALTYPE: A VALUE: {2304, 1296}
          -> VALTYPE: A VALUE: {768, 432}
          -> VALTYPE: U VALUE: NIL
          -> VALTYPE: L VALUE: .T.
oError:canDefault   : N
oError:canRetry     : N
oError:canSubstitute: J
oError:cargo        : NIL
oError:description  : Falscher Datentyp fr Member-Variable
oError:filename     : 
oError:genCode      :         29
oError:operation    : Status
Leite ich die Klasse (testweise) nur von XbpDialog ab, ändert sich der Fehler:

Code: Alles auswählen

oError:args         :
          -> VALTYPE: O CLASS: LogWin
          -> VALTYPE: O CLASS: XbpIWindow
          -> VALTYPE: O CLASS: XbpIWindow
          -> VALTYPE: A VALUE: {2304, 1296}
          -> VALTYPE: A VALUE: {768, 432}
          -> VALTYPE: U VALUE: NIL
          -> VALTYPE: L VALUE: .T.
oError:canDefault   : N
oError:canRetry     : N
oError:canSubstitute: J
oError:cargo        : NIL
oError:description  : Falscher Datentyp fr Member-Variable
oError:filename     : 
oError:genCode      :         29
oError:operation    : Status
Was mache ich falsch?

Re: CLASS ... FROM XbpDialog, XbpBrowse

Verfasst: Di, 22. Nov 2022 12:18
von Tom
Musst Du in der Init-Methode nicht auch die Objekte der Basisklassen initialisieren?

Re: CLASS ... FROM XbpDialog, XbpBrowse

Verfasst: Di, 22. Nov 2022 17:01
von georg
Hallo, Tom -

m.E. nicht.

Wenn ich das

Code: Alles auswählen

self:XbpDialog:new(self:oParent, self:oOwner, self:aPosDia, self:aSizeDia, self:aPP, self:lShow)
in den :init der Klasse verlagere, gibt es einen XppFatal.log:

Code: Alles auswählen

FATAL ERROR LOG
Stack Overflow
SYS Thread-ID: 1412
Module: EH
Error Codes: EH: 12 Sub: 0(0) OS: 0 XPP: 16
Call Stack of Thread 1 (920):
SHOWLOG(9)
(B)GENERATEMENU@0001(37)
MAIN(21)
Call Stack of GUI Thread (1124):
Call Stack of Thread 3 (1412):
@LOGWIN@I@INIT(27)    <=== self:XbpDialog:new(self:oParent, self:oOwner, self:aPosDia, self:aSizeDia, self:aPP, self:lShow)
@LOGWIN@I@INIT(38)
@LOGWIN@I@INIT(38)
@LOGWIN@I@INIT(38)
@LOGWIN@I@INIT(38)
etc. pp.
Der new() auf self:XbpDialog ruft den :init der Klasse LogWin auf.

Re: CLASS ... FROM XbpDialog, XbpBrowse

Verfasst: Di, 22. Nov 2022 17:06
von Marcus Herz

Code: Alles auswählen

oelf:XbpDialog:init(self:oParent, self:oOwner, self:aPosDia, self:aSizeDia, self:aPP, self:lShow)
es muss das INIT nicht NEW der Superklassen aufgerufen werden

Re: CLASS ... FROM XbpDialog, XbpBrowse

Verfasst: Di, 22. Nov 2022 17:08
von Tom
Kein :New(), sondern ein Init(). Wenn ich eine Klasse von einem oder mehren XbParts ableite, führe ich im Init() der abgeleiteten Klasse ein Init() der Superklassen durch, sonst bekommen die Objekte ja nur das, was ich dort veranstalte. Aber möglicherweise verstehe ich Dein Modell auch falsch.

Code: Alles auswählen

CLASS MeineBox FROM XbpComboBox
...

INLINE Method Init(oParent, oOwner, aPos ...)
::XbpComboBox:Init(oParent, oOwner, aPos ...) 
usw.

Re: CLASS ... FROM XbpDialog, XbpBrowse

Verfasst: Di, 22. Nov 2022 18:28
von Marcus Herz
Mir ist das Konstrukt auch nicht klar. Der Browser ist normalerweise ein Child des Dialoges. Hier werden ja keyboard und handleevent (und andere Methoden) nur an xbpDialog (weil als erste Superklasse gelistet) weitergeleitet. Wie soll denn der Browser sein Handleevent bekommen?

Re: CLASS ... FROM XbpDialog, XbpBrowse

Verfasst: Di, 22. Nov 2022 21:37
von georg
Guten Abend,


vielen Dank Euch beiden - ja, :init() muss anstelle von :new() verwendet werden.

Re: CLASS ... FROM XbpDialog, XbpBrowse

Verfasst: Mi, 23. Nov 2022 7:29
von Tom
Mein Reden von Anfang an. In aus XbParts abgeleiteten Klassen muss es ein implizites Init() auf die Superklassenobjekte geben.