TFPGObjectList befüllen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

TFPGObjectList befüllen

Beitrag von Socke »

Wie kann man verschiedene von TFPGObjectList spezialisierte Listen mit Objekten befüllen?

Ich möchte einer Prozedur eine Klasse und eine spezialisierte Liste übergeben; die Prozedur erstellt Objekte der Klasse und fügt sie in der Liste ein.

Mein Versuch sieht in etwa so aus:

Code: Alles auswählen

program t;
 
procedure x(cls: TClass; list: TFPSList);
var
  o: TObject;
begin
  o := cls.Create;
  list.Add(o);
end;
 
type
  tl = specialize TFPGObjectList<TPersistent>;
 
var
  l: tl;
begin
  l := tl.Create;
  x(TPersistent, l);
end.
Hintergrund: Generische Klassen sind keine eigentlichen Klassen (d.h. es gibt zur Laufzeit keine Klasse TFPGObjectList); beim Spezialisieren werden jeweils individuelle distinkte Klassen erstellt.

TFPGObjectList scheidet daher als Oberklasse aus; der nächste Vorfahr ist also TFPSList. Verwende ich diese wie im Beispiel Oben, wird in der Liste jedoch Datenmüll abgelegt; ich komme nicht mehr an die Objekte heran.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10904
Registriert: Mo 11. Sep 2006, 19:01

Re: TFPGObjectList befüllen

Beitrag von theo »

Ich glaube das überspannt den Bogen.
Kannst ja mal auf der fpc-devel Mailing List fragen.

Sowas geht gerade noch, aber ob das hilfreich ist, kann ich nicht entscheiden.

Code: Alles auswählen

procedure x(cls: TClass; list: TObject; LTyp:integer);
var
  o: TObject;
begin
  o := cls.Create;
  case LTyp of 0: tl(list).Add(TPersistent(o));
  end;
end;
................
var
  l: tl;
begin
  l := tl.Create;
  x(TButton, l, 0);
end.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TFPGObjectList befüllen

Beitrag von Socke »

Hier die Lösung: Man muss eine Adresse übergeben, wo die Adresse des Objektes abgelegt ist.

Code: Alles auswählen

program Project1;
 
{$mode objfpc}
 
uses
  fgl;
 
type
  tml = specialize TFPGObjectList<TObject>;
 
var
  o: tml;
  x: TObject;
begin
  o := tml.Create(False);
 
  Writeln('The object:                         ', PtrUInt(o));
 
  o.Add(o); 
  x := o.Items[0];
  Writeln('Object from list:                   ', PtrUInt(x));
 
  TFPSList(o).Add(o);
  x := o.Items[1];
  Writeln('TFPSList Add Object:                ', PtrUInt(x));
 
  TFPSList(o).Add(@o);
  x := o.Items[2];
  Writeln('TFPSList Add Address of object var: ', PtrUInt(x));
 
  o.Free;
  readln;
end.
Beispielausgabe:

Code: Alles auswählen

The object:                         22377760
Object from list:                   22377760
TFPSList Add Object:                4284416
TFPSList Add Address of object var: 22377760
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten