AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Generics in Record

Ein Thema von Björn Ole · begonnen am 2. Sep 2010 · letzter Beitrag vom 2. Sep 2010
Antwort Antwort
Benutzerbild von Björn Ole
Björn Ole

Registriert seit: 11. Jul 2008
166 Beiträge
 
Delphi XE Professional
 
#1

Generics in Record

  Alt 2. Sep 2010, 13:44
Hi,

ich beschäftige mich gerade etwas näher mit Generics und stehe vor einem Problem. Folgende Testklasse:
Delphi-Quellcode:
TRecObj<T> = class
type
  PRec = ^TRec;
  TRec = record
    ID: integer;
    Data: T;
  end;
private
  FRec: PRec;
public
  constructor Create(ID: integer; Data: T);
  destructor Destroy; reintroduce;
end;


constructor TRecObj<T>.Create(ID: integer; Data: T);
begin
  inherited Create;
  New(FRec);
  FRec.ID := ID;
  FRec.Data := Data; // schmeißt AV
end;

destructor TRecObj<T>.Destroy;
begin
  Dispose(FRec);
  inherited Destroy;
end;


myObj := TRecObj<string>.Create(-17, 'Hallo');
Das Record mag in diesem Beispiel nicht viel Sinn machen; ich möchte aber ein eigenes Listenobjekt programmieren, bei dem jedes Element aus so einem Record besteht.

Wenn ich mir jetzt ein neues TRecObj erstelle, bekomm ich eine AV (Read of address FFFFFFFB) bei der Zuweisung von Data. Benutze ich hier die Generics falsch? Warum funktioniert das so nicht?


Danke, Björn
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Generics in Record

  Alt 2. Sep 2010, 13:47
Warum legst du einen Zeiger auf die Struktur ab und nicht die Struktur selber?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Björn Ole
Björn Ole

Registriert seit: 11. Jul 2008
166 Beiträge
 
Delphi XE Professional
 
#3

AW: Generics in Record

  Alt 2. Sep 2010, 14:48
In der Testklasse von oben funktioniert es, aber warum nicht mit einem Zeiger und New()?

Ich glaub ich hatte das Problem zu weit vereinfacht.
Wie kann ich das nun auf meine Liste anwenden?

Ausschnitt:
Delphi-Quellcode:
TMyList<T> = class
  type
    PRec = ^TRec;
    TRec = record
      ID: integer
      Data: T;
      Next: PRec;
    end;
  private
    FCount: integer;
    FFirst: PRec;
    FLast: PRec;
    {...}
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Generics in Record

  Alt 2. Sep 2010, 14:55
Versuch es mal mit Klassen. So scheint es zu gehen

Delphi-Quellcode:
unit GTU;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

TRecObj<T> = class
type
  //PRec = ^TRec;
  TRec = class
    ID: integer;
    Data: T;
  end;
private
  FRec: TRec;
public
  constructor Create(ID: integer; Data: T);
  destructor Destroy; reintroduce;
end;

var
  Form1: TForm1;
  myObj: TRecObj<string>;

implementation

{$R *.dfm}

constructor TRecObj<T>.Create(ID: integer; Data: T);
begin
  inherited Create;
  FRec := TRec.Create;
  FRec.ID := ID;
  FRec.Data := Data; // schmeißt AV
end;

destructor TRecObj<T>.Destroy;
begin
  FRec.Destroy;
  inherited Destroy;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    myObj := TRecObj<string>.Create(-17, 'Hallo');
    Caption := myObj.FRec.Data;
end;

end.
Markus Kinzler

Geändert von mkinzler ( 2. Sep 2010 um 15:00 Uhr)
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Generics in Record

  Alt 2. Sep 2010, 15:45
Hallo Björn,

versuche es einmal mit diesem Ansatz:
Delphi-Quellcode:
uses
  Generics.Collections;

type
  TRecord<T> = record
    ID: Integer;
    Data: T;
    constructor Init (const aID: Integer; const aData: T);
  end;

  TRecordList<T> = class (TList<TRecord<T>>)
    procedure AddItem (const aID: Integer; const aData: T);
  end;

constructor TRecord<T>.Init(const aID: Integer; const aData: T);
begin
  ID := aID;
  Data := aData;
end;

procedure TRecordList<T>.AddItem(const aID: Integer; const aData: T);
var
  R: TRecord<T>;
begin
  R.Init (aID, aData);
  Add(R);
end;

// Anwendung

var
  MyList: TRecordList<string>;
begin
  MyList := TRecordList<string>.Create;
  try
    MyList.AddItem (42, 'Hallo Welt');
    MyList.AddItem (0, 'EOF');
    ShowMessage (MyList[0].Data);
  finally
    MyList.Free;
  end;
end;
Oder habe ich etwas an deiner Problemstellung übersehen?

Falls die ID eine eindeutige Kennung des Records sein sollte, wäre vielleicht ein Blick auf TDictionary<TKey,TValue> sinnvoll.

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von Björn Ole
Björn Ole

Registriert seit: 11. Jul 2008
166 Beiträge
 
Delphi XE Professional
 
#6

AW: Generics in Record

  Alt 2. Sep 2010, 16:41
Danke für eure Tipps.

Habe es jetzt so gelöst:
Delphi-Quellcode:
type
  TItem<T> = class
  private
    FID: integer
    FData: T;
    FNext: TItem<T>;
  public
    constructor Create(AID: integer; AData: T);
    property ID: integer read FID;
    property Data: T read FData;
    property Next: TItem<T> read FNext write FNext;
  end;

  TItemList<T> = class
  type
    TListItem = TItem<T>;
  private
    FFirst: TListItem;
    FLast: TListItem;
    {...}
Damit kann ich bequem weiterarbeiten.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 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