Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Typprüfung bei TTreeNode.Data (https://www.delphipraxis.net/57256-typpruefung-bei-ttreenode-data.html)

-NIP- 17. Nov 2005 22:16


Typprüfung bei TTreeNode.Data
 
Also: Mein Problem ist: Dem Pointer TTreeNode.Data können verschiedene Typen zugeweist werden.
im OnChange meines TTreeView versuche ich zu prüfen, on es ein bestimmter Typ ist, um dann speziell auf den typen zu reagieren. Also eine if then Abfrage.
Wie führe ich eine Typprüfung bei einem Pointer aus?


Das hier kompiliert er zwar klaglos, aber führt die Anweisung nicht aus:
Delphi-Quellcode:
procedure TGLForm.ObjectsTreeTVChange(Sender: TObject; Node: TTreeNode);
begin
  if Node.Data = TS3DGroup then
  showmessage('Group');
end;
Irgendwo hab ich gelesen das Typprüfung mit "is" geht, aber da ist mein Compiler anderer Meinung. Das hier akzeptiert er nicht:
Delphi-Quellcode:
procedure TGLForm.ObjectsTreeTVChange(Sender: TObject; Node: TTreeNode);
begin
  if Node.Data is TS3DGroup then
  showmessage('Group');
end;
Nochmal ist eure Hilfe gefragt ;)

(Warscheinlich steh ich auf dem Schlauch, aber ich probiere und suche jetzt schon eine Stunde)

himitsu 17. Nov 2005 22:27

Re: Typprüfung bei TTreeNode.Data
 
Das kannst du gleich mal wieder vergessen, denn der Typ von Data ist und bleibt immer POINTER, egal was du da reinpackst. :zwinker:

Wenn, dann mußt du dir schon selber irgendwie die nötigen Daten(Typenkennung) mitgeben.
z.B. eine Signatur innerhalb Daten.


Delphi-Quellcode:
Type TS2DGroup = Record
    Typ: Byte;
    ... {eigene Daten}
  End;
  TS3DGroup = Record
    Typ: Byte;
    ... {eigene Daten}
  End;


if PByte(Node.Data)^ = 3 then {is TS3DGroup}

if PS3DGroup(Node.Data)^.Typ = 3 then {is TS3DGroup}
Du mußt hierbei aber auch selber dafür sorgen, daß die richtige Signatur im Record vorhanden ist ... also du mußt demnach selber z.B. die 3 für TS3DGroup in Typ eintragen.

xaromz 18. Nov 2005 09:23

Re: Typprüfung bei TTreeNode.Data
 
Hallo,

wenn Du sicher bist, dass in Data immer ein Objekt steht, dann kannst Du das auch enfach casten:
Delphi-Quellcode:
procedure TGLForm.ObjectsTreeTVChange(Sender: TObject; Node: TTreeNode);
begin
  if TObject(Node.Data) is TS3DGroup then
  showmessage('Group');
end;
Der Grund ist einfach: Typprüfung mit is funktioniert nur mit Klassen, nicht mit Primitives (Integer, Byte, Pointer...).

Gruß
xaromz

-NIP- 18. Nov 2005 15:45

Re: Typprüfung bei TTreeNode.Data
 
Cool, danke, es klappt ;) .

Es ist sicher, dass Data immer auf etwas zeigt, also brauche ich nicht mehr.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz