Tak przy okazji to może podam rozwiązanie dla Free Pascala (a dokładnie dla Lazarusa); Do tej pory nie korzystałem z generyków - Delphi7 ich nie wspierało, a przez ostatnie kilka lat pisania dla FPC jakoś nie potrzebowałem ich używać;
Popatrzyłem trochę do dokumentacji i manuali Free Pascala i... składnia jest zupełnie inna niż w przypadku obecnego standardu Delphi; Ale to dotyczy tylko deklaracji typu - w dalszej części użycie listy jest takie samo jak w Delphi;
Poniżej podaję przykład robiący to samo co pokazał @kAzek, tyle że w Lazarusie:
uses
{..}, FGL, {..};
type
generic TEditsList<TEdit> = specialize TFPGObjectList<TEdit>;
type
TForm1 = class(TForm)
btnGenerate: TButton;
seEditsCount: TSpinEdit;
procedure btnGenerateClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FEditsList: TEditsList;
private
procedure OwnEditKeyPress(Sender: TObject; var Key: Char);
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FEditsList := TEditsList.Create();
end;
procedure TForm1.btnGenerateClick(Sender: TObject);
var
edtNew: TEdit;
intEditIdx: Integer;
begin
FEditsList.Clear();
for intEditIdx := 0 to seEditsCount.Value - 1 do
begin
edtNew := TEdit.Create(Self);
edtNew.Parent := Self;
edtNew.OnKeyPress := @OwnEditKeyPress;
edtNew.Width := 100;
edtNew.Height := 21;
edtNew.Left := 16;
edtNew.Top := 50 + intEditIdx * 25;
edtNew.Text := Format('Edit no %d', [intEditIdx]);
FEditsList.Add(edtNew);
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FEditsList.Free();
end;
procedure TForm1.OwnEditKeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['A' .. 'Z']) then
Key := #0;
end;
end.
Wszystko działa - pola edycyjne tworzą się prawidłowo, nowe zdarzenie filtruje poprawnie wprowadzane znaki; Czyli wszystko działa tak jak należy; Muszę się w końcu więcej pobawić tymi generykami.