ich spiele seit einigen Tagen mit Generics herum, und bin angemessen angetan von dem was sie mir bieten. Irgendwann kam ich auf die wilde Idee, ein Generic einer Variable zuweisen zu wollen, bzw. eine Funktion zu haben die ein Generic zurückgibt. Die Motivation kam eigentlich aus dem Debugging, erst einmal habe ich an hundert Stellen den ItemIndex der RadioGroup mittels case ausgewertet und dann die jeweils selektierte Liste angesprochen, dann dachte ich, wär doch nett, wenn ich dafür eine Property oder Funktion einsetzen könnte, die das an einer Stelle abfackelt und mir die richtige Liste in die Hand gibt. Ich habe dann dieses kleine Testprogramm zusammengenagelt:
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
ComCtrls, FGL;
type
TFPGListString = specialize TFPGList<ShortString>;
TFPGListStringOne = class(TFPGListString);
TFPGListStringTwo = class(TFPGListString);
var
FPGListStringOne : TFPGListStringOne;
FPGListStringTwo : TFPGListStringTwo;
[....]
procedure TForm1.DumpList(const AList:TFPGListString);
var
S:ShortString;
begin
Memo1.Lines.Clear;
for S in AList do
Memo1.Lines.Add(S);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
S: ShortString;
begin
S := DateTimeToStr(Now());
CurrentList.Add(S);
DumpList(CurrentList);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FPGListStringOne := TFPGListStringOne.Create;
FPGListStringOne.add('One');
FPGListStringTwo := TFPGListStringTwo.Create;
FPGListStringTwo.add('Two');
end;
[...]
procedure TForm1.RadioGroup1SelectionChanged(Sender: TObject);
begin
DumpList(CurrentList);
end;
function TForm1.CurrentList: TFPGListString;
begin
case RadioGroup1.ItemIndex of
0: result := FPGListStringOne;
1: result := FPGListStringTwo;
end;
end;
Habe ich mich da innerhalb der Specs von Geenerics bewegt, oder bin ich gerade dabei, fürchterlich aufs Glatteis zu gehen?
Thnx, Armin.