Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

Problem mit :isDerivedFrom()

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12307
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Problem mit :isDerivedFrom()

Beitrag von Jan » Mo, 25. Jul 2016 20:09

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13594
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von Martin Altmann » Mo, 25. Jul 2016 20:42

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12307
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von Jan » Mo, 25. Jul 2016 20:51

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13594
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von Martin Altmann » Mo, 25. Jul 2016 20:54

Nein, ist leider nicht abgefangen.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13594
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von Martin Altmann » Mo, 25. Jul 2016 21:00

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10579
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: Problem mit :isDerivedFrom()

Beitrag von AUGE_OHR » Di, 26. Jul 2016 3:09

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
Foren-Administrator
Foren-Administrator
Beiträge: 12307
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von Jan » Di, 26. Jul 2016 6:09

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13594
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von Martin Altmann » Di, 26. Jul 2016 6:31

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13768
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von brandelh » Di, 26. Jul 2016 7:26

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: 13594
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von Martin Altmann » Di, 26. Jul 2016 7:29

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 6802
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von Tom » Di, 26. Jul 2016 11:12

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: 1934
Registriert: Fr, 08. Feb 2008 21:29

Re: Problem mit :isDerivedFrom()

Beitrag von georg » Di, 26. Jul 2016 18:43

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

Georg

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13768
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von brandelh » Mi, 27. Jul 2016 7:08

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: 2450
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von UliTs » So, 02. Okt 2016 23:42

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
Foren-Administrator
Foren-Administrator
Beiträge: 12307
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von Jan » Mo, 03. Okt 2016 7:02

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2450
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von UliTs » Mo, 03. Okt 2016 16:19

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
Foren-Administrator
Foren-Administrator
Beiträge: 12307
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Problem mit :isDerivedFrom()

Beitrag von Jan » Mo, 03. Okt 2016 16:48

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Antworten