Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Interface casten (https://www.delphipraxis.net/109997-interface-casten.html)

Oracle 11. Mär 2008 11:57


Interface casten
 
Ich habe folgendes Konstrukt:
Eine Klasse namens TMessung die das Interface IMessKnoten implementiert.
Ich brauche das Interface, für eine Virtual Tree View.


Delphi-Quellcode:
TMessung = class(TInterfacedObject, IMessKnoten);
Ich weise den Knoten in meinem TreeView über Data die Daten zu die sich hinter ihnen verbirgen. Also beispielsweise eine Instanz vom Typ TMessung. Dies muss ich aber über das Interface machen. Was soweit kein Problem ist. Aber wie bekomme ich in folgender Situation wieder ein Objekt vom Typ TMessung:

Delphi-Quellcode:
var
Messknoten: IMessKnoten;
begin
  Data:= VST.GetNodeData(Node);
  Messknoten := Data.Fobject;
  // Jetzt soll Messknoten nach TMessung gecastet werden.
Wenn ich beim Debuggen Messknoten in die Liste der überwachten Ausdrücke ziehe steht bei Wert sogar da : TMessung(....).
Aber ein Cast ist mir trotzdem bisher nicht gelungen.

Vielen Dank euch schon mal im Vorraus.

kuzco 11. Mär 2008 12:24

Re: Interface casten
 
hi oracle

ja... das wollte ich auch einmal machen ;-)... und habe hier in der DP danach gesucht. ich weiss nicht mehr genau welcher Beitrag es war, aber der Beitrag hat mich auf jedenfall dazu bewogen eine andere Lösung zu nehmen und zwar einerseits immer mit Objekten zu arbeiten oder immer nur mit Interfaces zu arbeiten ohne das herumgecaste.

So und falls du dich noch nicht umentschieden hast, wäre das eine möglichkeit die vielleicht ein Versuch wert wäre ;-):

und zwar indem du im Interface eine funktion definierst, welches den Typ TMessung zurückgibt:

Delphi-Quellcode:
TMessung = class;

IMessKnoten = interface
   function GetMessung: TMessung;
end;

TMessung = class(TInterfacedObject, IMessKnoten)
public
   function GetMessung: TMessung;
end;

...

function TMessung.GetMessung: TMEssung;
begin
  Result := Self;
end;
ich bin mir nicht sicher ob das wirklich funktioniert. evtl gibt es auch probleme mit dem Referenzierungszähler oder wie man das auch nennt. :gruebel:

Greets
kuzco

Oracle 11. Mär 2008 14:19

Re: Interface casten
 
Das Interface wird noch von anderen Objekten implementiert. Diese müssten dann auch die Funktion GetMessung implementieren.
Weiss nicht ob das so schön wäre.
Aber ich habe eine andere Lösung gefunden. Ich lasse mir den Index des Knotens geben, und hole mir anhand dieses Indizes die Messung aus meines Messungliste. Aber trotzdem vielen Dank. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:14 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