Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TList und Typenumwalndlung (https://www.delphipraxis.net/57246-tlist-und-typenumwalndlung.html)

ozz 17. Nov 2005 19:21


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.

tigerman33 17. Nov 2005 20:31

Re: TList und Typenumwalndlung
 
Eigentlich müsste das funktionieren:
Delphi-Quellcode:
function TKeywordStats.Get(Index: Integer):TStats;
var p:TStats;
begin
  p := inherited Items[Index];
  result:=p^;
end;
Alternativ:
Delphi-Quellcode:
type TPStats = ^TStats;

...

function TKeywordStats.Get(Index: Integer):TStats;
var p:TStats;
begin
  result:= TPStats(inherited Items[Index]);
end;
Aber noch was zu deiner Add-Methode:

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.

Der_Unwissende 17. Nov 2005 20:36

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:
function TKeywordStats.Get(Index: Integer):TStats;
begin
   result := self.FKeywordlist.Items[Index];
end;
Gruß Der Unwissende

tigerman33 17. Nov 2005 20:48

Re: TList und Typenumwalndlung
 
:oops: Ups, vollkommen übersehen. Dann geht aber das hier:

Delphi-Quellcode:
type TPStats = ^TStats;

...

function TKeywordStats.Get(Index: Integer):TStats;
var p:TStats;
begin
  result:= TPStats(FKeywordList.Items[Index])^;
end;
@Unwissender:
Das dürfte eigentlich nicht gehen, wegen Typinkompatibilität. FKeywordList.Items[i] ist nämlich vom Typ pointer.

ozz 18. Nov 2005 06:27

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 15:10 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