![]() |
Type eines Pointers ermitteln
Grüß Gott :)
Ich erbitte Hilfe von euch zum Thema Pointer und dessen dahinterliegende Datenstruktur. In einem Treeview verknüpfe ich über den Node.Data-Pointer Daten mit Knoten. Die Daten selbst sind Records unterschiedlichen Typs. Besteht für mich die Möglichkeit, durch den Zugriff auf den Pointer später noch herauszufinden, welcher Record-Typ hinter dem Pointer liegt? Wenn ja, wie? |
Re: Type eines Pointers ermitteln
Record -> Nein
Klasse/Objektinstanz -> Ja (Mittels is-Operator/Classname). Außer du hast eine "Basisstruktur" so das die ersten 4 Bytes einen Kenner mitliefern. |
Re: Type eines Pointers ermitteln
Hm, sehr schade. Dann muss ich die Sache noch mal umstricken und es wie
![]() Dankeschön :) |
Re: Type eines Pointers ermitteln
Nein. Ein Pointer traegt keine Typinformation. Es ist einfach eine adresse. Ein Record traegt auch keine Typinformation. Es ist einfach ein Speicherbereich.
In der Source steht natuerlich der Typ. Der Compiler laesst bei der Kompilation aber alle Typinformation weg. Die wird ja nur gebraucht den richtigen Code zu generieren. |
Re: Type eines Pointers ermitteln
Es gibt Möglichkeiten dafür, aber generell betrachtet ist ein Zeiger ein untypisierter Datentyp, er zteigt eben nur auf Irgendwas.
Eine Lösung wurde oben schon angesprochen. Du machst deine Records teilweise zueinander kompatibel. Zb. indem als allererstes Datenfeld zb. ein Zeiger "Type" einfügst, bei all deinen Records. Zb. so
Delphi-Quellcode:
Eine andere Lösung ist es die Allozierung der Records für jeden Recordtypen in unterschiedliche Speicherbereich zu machen. Zb. sotype PBaseRecord = ^TBaseRecord; TBaseRecord = packed record Typ: PTypeInfo; end; TMyRecord1 = packed record Typ: PTypeInfo; Daten: ab hier; end; TMyRecord2 = packed record Typ: PTypeInfo; Daten ab hier; end; procedure Test; var Rec1, Rec2: PBaseRecord; begin Rec1 := New(TMyRcord1); Rec1.Typ := TypeInfo(TMyRecord1); Rec1.Data := XYZ; Rec2 := New(TMyRecord2); Rec2.Typ := TypeInfo(TMyRecord2); if Rec1.Typ <> Rec2.Typ then ShowMessage('Records unterschieldich'); if Rec1.Typ = TypeInfo(TMyRecord1) then ShowMessage(Record1 ist TMyRecord1'); ShowMessage(Rec1.Typ.Name); end;
Delphi-Quellcode:
Du kannst dann über die Addresse des Zeigers ermitteln von welchem Typ er ist.
var
Rec1: array of TMyRecord1; // globaler Datenspeicher Rec2: array of TMyRecord2; procedure Test; var r1: Pointer; begin SetLength(Rec1, Length(Rec1) +1); r1 := @Rec1[High(Rec1)]; if PChar(r1) >= @rec1[0] and PChar(r1) <= @rec1[High(Rec1)]) then ShowMessage('Pointer r1 stammt aus array Rec1'); end; ABER ! Was ist ein TObject im vergleich zu einem Record ? Ein TObject ist ein Record bei dem der Compiler uns sinnvolle Instrumente in die Hand gibt um typisiert und polymorph Daten zu verwalten. Polymorph ist das Stichwort, denn das ist es was du brauchst. Ergo: die richtige Lösung ist es von deinen manuell allozierten Records wegzugehen und Klassen zu benutzen. Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz