![]() |
TList und Typenumwalndlung
Hallo zusammen,
ich habe ein Problem mit TList. Dies ist der erste Versuch, etwas mit Pointern zu arbeiten, aber ich bekomme immer eine Fehler bei TKeywordStats.Get. Ich kann den Pointer nicht zurück in den Type TStats konvertieren 1. Versuch result:=@FKeywordlist[Index]; 2. Versuch result:=TStats(@FKeywordlist[Index]); Danke für die Hilfe!
Delphi-Quellcode:
unit CLStats;
interface uses Classes; type TStats = record Keyword : String; Count: Shortint; end;//Type type TKeywordStats= class (TComponent) private FKeywordlist:TList; function Get(Index: Integer): TStats; procedure Put(Index: Integer; const Value: TStats); public constructor Create(AOwner: TComponent);override; destructor destroy;override; function add(Item:TStats):integer; function count :integer; property KeywordStats[Index: Integer]: TStats read Get write Put; end; implementation constructor TKeywordStats.create; begin; FKeywordlist:=TList.Create; inherited; end; destructor TKeywordStats.destroy; begin; FKeywordlist.Destroy; inherited destroy; end; function TKeywordStats.Add(Item: TStats): Integer; begin Result:=FKeywordlist.add(@Item); end; function TKeywordStats.count: Integer; begin Result:=FKeywordlist.count; end; function TKeywordStats.Get(Index: Integer):TStats; var p:TStats; begin result:=FKeywordlist[Index]; end; procedure TKeywordStats.Put(Index: Integer; const Value: TStats); begin FKeywordlist[Index]:=@Value; end; end. |
Re: TList und Typenumwalndlung
Eigentlich müsste das funktionieren:
Delphi-Quellcode:
Alternativ:
function TKeywordStats.Get(Index: Integer):TStats;
var p:TStats; begin p := inherited Items[Index]; result:=p^; end;
Delphi-Quellcode:
Aber noch was zu deiner Add-Methode:
type TPStats = ^TStats;
... function TKeywordStats.Get(Index: Integer):TStats; var p:TStats; begin result:= TPStats(inherited Items[Index]); end; Du solltest nicht mit dem @-Operator arbeiten. Wenn man deiner Add-Methode ein Element übergibt, das z.B. nur als lokale Variable innerhalb der aufrufenden Prozedur existiert, zeigt dein pointer in der Liste anschließend ins Datennirwana. Erzeug lieber mit New einen neuen Zeiger, von dem weißt du dann garantiert, dass er auf eine "gültige" Speicheradresse verweist. |
Re: TList und Typenumwalndlung
Hi,
also erstmal muss ich ja mal fragen, warum machst du das mit Pointern? Hat doch eigentlich keine wirklich großartigen Vorteile (wie immer nur subjektive Meinung eines mittlerweile OOP-Freunds). Aber was tigermann33 gepostet hat, dürfte wohl leider nicht funktionieren, deine Klasse leitet doch nur TComponent ab, nicht TList. Jedenfalls muss dein Zugriff etwas äquivalenter zur Hilfe sein
Delphi-Quellcode:
Gruß Der Unwissende
function TKeywordStats.Get(Index: Integer):TStats;
begin result := self.FKeywordlist.Items[Index]; end; |
Re: TList und Typenumwalndlung
:oops: Ups, vollkommen übersehen. Dann geht aber das hier:
Delphi-Quellcode:
@Unwissender:
type TPStats = ^TStats;
... function TKeywordStats.Get(Index: Integer):TStats; var p:TStats; begin result:= TPStats(FKeywordList.Items[Index])^; end; Das dürfte eigentlich nicht gehen, wegen Typinkompatibilität. FKeywordList.Items[i] ist nämlich vom Typ pointer. |
Re: TList und Typenumwalndlung
Danke für die Hilfe tigerman33 und Der_Unwissende.
@Der_Unwissende Ich wollte einfach mal mit Pointern arbeiten. Wie ungefähr würdest du es machen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:50 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