Seite 1 von 1

Problem mit :isDerivedFrom()

Verfasst: Mo, 25. Jul 2016 20:09
von Jan
Hallo,

gerade bekomme ich von einem Kunden einen Fehler rein.
Xbase++ Version : 10
Betriebssystem :Windows 10 10.00 Build 10586
------------------------------------------------------------------------------
oError:args :
-> VALTYPE: L VALUE:.F.
-> VALTYPE: C VALUE:XbpTabPage
oError:canDefault : .F.
oError:canRetry : .F.
oError:canSubstitute: .T.
oError:cargo : NIL
oError:description : Empfõnger der Nachrichten ist kein Objekt
oError:filename :
oError:genCode : 38
oError:operation : isDerivedFrom
oError:osCode : 0
oError:severity : 2
oError:subCode : 2266
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
Was ich da mache ist:

Code: Alles auswählen

IF MEMVAR->oTab1 <> NIL
   IF MEMVAR->oTab1:isDerivedFrom("XbpTabPage")  // <= Da passiert der Fehler
Ansich war ich der Meinung, das ein Objekt, das nicht NIL ist, immer per :isDerivedFrom() abgefragt werden kann. Offensichtlich aber nicht.

Das Einzige, was mir in dem Zusammenhang auffällt, ist, das ich hier entgegen meinen sonstigen Gewohnheiten die oTab1 zwar deklariert, aber nicht initialisiert habe. Da habe ich nur ein PUBLIC oTab stehen, das := NIL fehlt mir da. Sollte ja aber wohl keinen Unterschied machen?

Mich irritiert dabei auch, daß die Fehlermeldung zwei Parameter angibt. Ich aber nur einen Übergebe, und die Methode auch garnicht mehr hat.

Jan

Re: Problem mit :isDerivedFrom()

Verfasst: Mo, 25. Jul 2016 20:42
von Martin Altmann
Moin Jan,
kann es sein, dass Deine Klasse (noch) nicht :create()d ist?
Was liefert valtype( MEMVAR->oTab1 )?
Stelle doch mal dein Konstrukt um wie folgt:

Code: Alles auswählen

IF ValType( MEMVAR->oTab1 ) == "O"
   IF MEMVAR->oTab1:isDerivedFrom("XbpTabPage")
Viele Grüße,
Martin

Re: Problem mit :isDerivedFrom()

Verfasst: Mo, 25. Jul 2016 20:51
von Jan
Hallo Martin,

nein, oTab ist entweder NIL oder komplett erstellt. Was anderes geht da nicht.

ValType() wäre natürlich auch eine Idee. Muß ich mal testen. Das Problem ist, daß das eigentlich immer läuft. Warum in diesem einen speziellen Fall nicht ist mir unbekannt. Ich war einfach nur der Meinung gewesen, daß ich da mit der Abfrage auf <> NIL alle Eventualitäten abgefangen hatte.

Jan

Re: Problem mit :isDerivedFrom()

Verfasst: Mo, 25. Jul 2016 20:54
von Martin Altmann
Nein, ist leider nicht abgefangen.

Viele Grüße,
Martin

Re: Problem mit :isDerivedFrom()

Verfasst: Mo, 25. Jul 2016 21:00
von Martin Altmann
Abgesehen davon ist undefined <> NIL!

Code: Alles auswählen

procedure main()
local bla
? "bla == NIL"
? ( bla == NIL )
? "valtype( bla )"
? valtype( bla  )
return
Liefert folgende Ausgabe:

Code: Alles auswählen

bla == NIL
J
valtype( bla )
U
Viele Grüße,
Martin

Re: Problem mit :isDerivedFrom()

Verfasst: Di, 26. Jul 2016 3:09
von AUGE_OHR
Jan hat geschrieben:oError:description : Empfänger der Nachrichten ist kein Objekt
wie Martin schon schrieb sollte man VALTYPE(oTab1) überprüfen denn das ist das Empfänger Objekt welches in der Fehlermeldung NIL ist.

Re: Problem mit :isDerivedFrom()

Verfasst: Di, 26. Jul 2016 6:09
von Jan
Jimmy,

das ist ja nzwischen schon klar.

Allerdings ist das Objekt nicht NIL. Wäre das so, dann wäre das ja von der Zeile davor abgefangen worden.

Jan

Re: Problem mit :isDerivedFrom()

Verfasst: Di, 26. Jul 2016 6:31
von Martin Altmann
Jan,
warum das so ist, habe ich dir ja gezeigt.
Wenn nichts zugewiesen ist, ist es Undefined und nicht NIL.

Viele Grüße,
Martin

Re: Problem mit :isDerivedFrom()

Verfasst: Di, 26. Jul 2016 7:26
von brandelh
Eine Variable ist immer NIL wenn ihr nichts zugewiesen wurde und valtype() gibt dann "U" zurück.
Handbuch hat geschrieben: Datentypen und Rückgabewerte von Valtype()

Rückgabewert Datentyp

A Array
B Codeblock
C Zeichenkette
D Datumswert
L Logischer Wert
M Memo-Feld
N Numerischer Wert
O Objekt
U NIL
aber eine Variable # NIL muss kein Objekt sein.

Ich habe jetzt nicht probiert ob :IsDerivedFrom() ein create() braucht, aber offensichtlich ist bei der Objektzuweisung etwas schief gegangen
oder danach in einem anderen Programmteil (MEMVAR !) etwas anderes zugewiesen worden. "Normal" passiert das nicht, aber in dem Moment muss wohl was gefehlt haben.

Re: Problem mit :isDerivedFrom()

Verfasst: Di, 26. Jul 2016 7:29
von Martin Altmann
War gestern doch schon zu spät - habe das Posting oben korrigiert!
Eine undefinierte Variable ist immer NIL - also wäre das egal, ob Du auf NIL prüfst oder auf ValType == "U"!
Deine Variable hat zu dem Zeitpunkt kein erzeugtes Objekt als Referenz - insofern gibt es kein :IsDerivedFrom()!
Ich bleibe dabei: Dein Objekt ist zu dem Zeitpunkt nicht angelegt oder die Variable enthält einen anderen Datentypen!!

Viele Grüße,
Martin

Edit: Hubert war schneller

Re: Problem mit :isDerivedFrom()

Verfasst: Di, 26. Jul 2016 11:12
von Tom
IsDerivedFrom() funktioniert direkt nach dem New():

Code: Alles auswählen

LOCAL o
? ValType(o) // NIL
o := XbpTabpage():New()
? ValType(o) // O
? o:IsDerivedFrom('test') // .F.
Also ist Dein MEMVAR->oTab1 nicht NIL, aber auch kein Objekt - und erst recht keine Tabpage, in welchem Zustand auch immer. Hol Dir doch einfach an der fraglichen Stelle mal den ValType() von "MEMVAR-oTab1" und den Inhalt (? Var2Char(MEMVAR->oTab1)).

Re: Problem mit :isDerivedFrom()

Verfasst: Di, 26. Jul 2016 18:43
von georg
und vielleicht mal mit :className() schauen, welche Klasse es ist, falls es ein Objekt ist.

Re: Problem mit :isDerivedFrom()

Verfasst: Mi, 27. Jul 2016 7:08
von brandelh
wobei :isderivedFrom() in der Klasse "Abstract() - Abstrakte Klasse mit einer einheitlichen Schnittstelle für andere Klassen"
definiert ist und somit in allen Objekten die auf Xbase++ Klassen basieren verfügbar sein müsste.

Re: Problem mit :isDerivedFrom()

Verfasst: So, 02. Okt 2016 23:42
von UliTs
Oben in der Fehlermeldung steht
  • -> VALTYPE: L VALUE:.F.
    -> VALTYPE: C VALUE:XbpTabPage
Also ist oTab1=.F.
Du arbeitest ja in diesem Fall noch mit Public-Variablen. Diese werden genauso wie Private-Variablen mit .F. automatisch vorbesetzt. Deshalb vermute ich, dass Du oTab1 noch keinen Wert (Klassenobjekt) zugewiesen hast.

Bei Klassenvariablen ist der erste Parameter in der Fehlermeldung immer der Wert der Klassenvariablen (oh, hoffentlich richtig/verständlich ausgedrückt :? :color: ).

Kannst Du meine Vermutungen bestätigen?

Re: Problem mit :isDerivedFrom()

Verfasst: Mo, 03. Okt 2016 7:02
von Jan
Hallo Uli,

so ganz kann ich Dir da leider nicht folgen.

Mit den Public-Vermutungen hast Du erstmal Recht. Ja, das sind PUBLICs. Die ich inzwischen direkt beim Programmstart mit NIL belege - ich weise Variablen bei der Erzeugung immer einen Initialwert zu, der zu der Notation passt. Egal ob das PUBLIC oder LOCAL sind. Warum ich das hier verpennt habe mag Altlast gewesen sein.

Das Verwirrende ist - es gibt in der Reihe 10 Tabs. Hier geht es um den ersten. Der garantiert und immer sofort beim Start mit einer XbpTabPage belegt wird. Das klappt ja auch immer und grundsätzlich bei allen Kunden. Bis auf dieses eine Mal.

Und ich habe den Fehler später noch einmal bekommen von einem Kunden. Mit der Version, wo oich die PUBLIC bereits auf NIL setze. Ganz super!

Jan

Re: Problem mit :isDerivedFrom()

Verfasst: Mo, 03. Okt 2016 16:19
von UliTs
Hallo Jan,

ja, solche Fehler sind blöd. Und nicht immer ist man selbst dran schuld 8) .
Aber dein letzter Satz ist interessant. Wenn Du die Fehlermeldung noch hast, müsste da als Wert nicht mehr .F. sondern NIL für den ersten Parameter sein. War das der Fall?

Uli

Re: Problem mit :isDerivedFrom()

Verfasst: Mo, 03. Okt 2016 16:48
von Jan
Hallo Uli,

das ist es ja. Da ist garantiert die PUBLIC auf NIL gesetzt, und trotzdem ist da immer noch ein .F. in der Fehlermeldung.

Jan