![]() |
Delphi-Version: XE2
Generics-Typparameter einer TObjectlist herausfinden
Hallo,
ich versuche mich gerade an Generics und RTTI um das mal zu begreifen, stehe aber grade auf dem Schlauch :? : Am Ende möchte ich erreichen, daß ich den Inhalt eine beliebigen TObjectlist<TIrgendwas> z.B. in ein Stringgrid übertrage oder entsprechende Einträge zur Laufzeit hinzufüge. Dazu müßte ich aber den Typparameter (??) der Objectlist wissen. Wie bekommt man zur Laufzeit raus, ob die Objectlist mit <Tirgendwas> oder z.B. mit <TwasAnderes> erstellt wurde? Danke Frank |
AW: Generics-Typparameter einer TObjectlist herausfinden
Um es Kurz zu machen.
Das brauchst du nicht rausbekommen, da die Generics ein großes Problem mit der Vererbung haben. TObjectList<T> ist erstmal kein Nachfahre von TObjectList. Diese Klassen sind nicht kompatibel zueinander, weder TObjectList<T> mit TObjectList, noch TObjectList<Ta> mit TObjectList<Tb>. Da du diese also nicht über eine Schnittstelle auslesen kannst, gibt es auch fast keinen wirklichen Grund den Typ rauszubekommen, da man von dem generischen Typen nicht sicher feststellen kann, ob das überhault eine TObjectList<> ist. Ansonsten gab es vor wenigen Jahren schonmal eine Frage dazu ![]() Du wirst dich also mühevoll durch die RTTI quälen. Einfach ist es, wenn du
Delphi-Quellcode:
var
L: TObjectList<TEdit>; begin T = TypeInfo(L.Items[i]); |
AW: Generics-Typparameter einer TObjectlist herausfinden
Meinst du vielleicht sowas?
Delphi-Quellcode:
unit Unit33;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Generics.Collections, TypInfo, Vcl.Grids; type TMyTestStringGridHelper = class helper for TStringGrid public procedure DisplayList<T: class>(AList: TObjectList<T>); end; TTest = class(TObject) private FValue: Integer; procedure SetValue(const Value: Integer); public constructor Create(const AValue: Integer); function ToString: string; override; property Value: Integer read FValue write SetValue; end; TForm33 = class(TForm) StringGrid1: TStringGrid; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form33: TForm33; implementation {$R *.dfm} procedure TForm33.FormCreate(Sender: TObject); var a: TObjectList<TTest>; i: Integer; begin a := TObjectList<TTest>.Create(True); try for i := 0 to 10 do a.Add(TTest.Create(i)); StringGrid1.DisplayList<TTest>(a); finally a.Free; end; end; { TMyTestStringGridHelper } procedure TMyTestStringGridHelper.DisplayList<T>(AList: TObjectList<T>); var i: Integer; begin RowCount := AList.Count; for i := 0 to AList.Count - 1 do Cells[0, i] := AList[i].ToString; end; { TTest } function TTest.ToString: string; begin Result := IntToStr(FValue); end; constructor TTest.Create(const AValue: Integer); begin FValue := AValue; end; procedure TTest.SetValue(const Value: Integer); begin FValue := Value; end; end. |
AW: Generics-Typparameter einer TObjectlist herausfinden
ok, Danke euch beiden :-).
Das bringt mich beides vom Verständnis erstmal weiter.Ich muß mir das nochmal in Ruhe durch den Kopf gehen lassen. Gruß Frank |
AW: Generics-Typparameter einer TObjectlist herausfinden
In Spring gibt's dazu die Eigenschaft ElementType auf IEnumerable.
In DSharp hats in der Reflection Unit einige Hilfsfunktionen für generische RTTI. Mit denen kann man den generischen Typnamen auflösen und darüber den Typ von T herausfinden (funktioniert über Stringoperationen und RTTI). |
AW: Generics-Typparameter einer TObjectlist herausfinden
Über den Namen könnte man es so, ohne Probleme auflösen, aber nur, wenn der Typ eindeutig ist.
z.B. selbstdefinierte Typen/Records, welche einen Typenbezeichner haben, den es hunderte Male in der EXE gibt, haben da ein Problemchen. |
AW: Generics-Typparameter einer TObjectlist herausfinden
Zitat:
|
AW: Generics-Typparameter einer TObjectlist herausfinden
Gut, ich hatte jetzt nicht nochmal nachgesehn, aber mir war halt so, als wenn die Unit nicht mit drin stand.
Wenn doch, dann sieht es besser natürlich aus. |
AW: Generics-Typparameter einer TObjectlist herausfinden
Hallo,
Die letzten Beiträge habe ich noch nicht ganz verstanden :oops:, das muß ich mir nochmal in Ruhe durchdenken. Mir war das mit dem Syntax nicht ganz klar: mir hat das
Delphi-Quellcode:
gefehlt.
procedure DisplayList<T: class>(AList: TObjectList<T>);
Habe erstmal was funktionierendes mit Hilfe von anderen DP-Threads: Testcode:
Delphi-Quellcode:
Es würde jetzt das machen, was ich später will -> eine flexible Editiermöglichkeit für eine Liste, ohne das Grid selber aufbauen zu müssen.
procedure TForm1.Proc_InsGridUebertragenDP<T>(AList: TObjectList<T>);
Var prop: TRttiProperty; proparr:TArray<TRttiProperty>; value: TValue; Context: TRttiContext; obj:Tobject; io,ip,acol:integer; begin StringGrid1.RowCount:=max(2, AList.Count); //Überschriften StringGrid1.ColCount:=Length(Context.GetType(system.TypeInfo(T)).GetProperties); acol:=0; for prop in Context.GetType(system.TypeInfo(T)).GetProperties do begin StringGrid1.Cells[acol,0]:=prop.Name; inc(acol); end; //Inhalt for io := 0 to AList.Count-1 do begin obj:=AList[io]; proparr:=Context.GetType(obj.ClassType).GetProperties; for ip:=low(proparr) to high(proparr) do begin prop:=proparr[ip]; Value:=prop.GetValue(obj); case Prop.PropertyType.TypeKind of tkInteger: begin Proc_Info(prop.name+'"Integer"'+value.ToString); StringGrid1.Cells[ip,io+1]:=inttostr(Value.AsInteger); end; tkFloat: begin Proc_Info(prop.name+'"Float"'+value.ToString); StringGrid1.Cells[ip,io+1]:=FloatToStr(Value.AsExtended); end; tkString,tkUstring: begin Proc_Info(prop.name+'"String"'+value.ToString); StringGrid1.Cells[ip,io+1]:=value.AsString; end; else showmessage('unbekannt'); end; end; end; end; Auslesen würde ja auch gehen, da hat mir bei
Delphi-Quellcode:
ein anderer Thread mit dem ,constuctor geholfen.
procedure Proc_AusDemGridLesen<T: class, constructor>(AList: TObjectList<T>)
Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 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