Problem mit :isDerivedFrom()

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

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

Problem mit :isDerivedFrom()

Beitrag 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
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: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag 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
: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: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag 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
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: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von Martin Altmann »

Nein, ist leider nicht abgefangen.

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
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag 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
: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: Problem mit :isDerivedFrom()

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag 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
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: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag 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
: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
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag 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.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag 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
: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
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag 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)).
Herzlich,
Tom
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Problem mit :isDerivedFrom()

Beitrag von georg »

und vielleicht mal mit :className() schauen, welche Klasse es ist, falls es ein Objekt ist.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag 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.
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag 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?
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag 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
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten