On 22.11.2015 21:29, Anthony Walter wrote:
Test 2 works but with notes:

function Find<T>: T;
var
   I: Integer;
begin
   for I := 0 to Form1.ComponentCount - 1 do
if Form1.Components[I].InheritsFrom(T) then
Exit(T(Form1.Components[I]));
   Result := nil;
end;

Example 2 usage:

Find<TShape>.Brush.Color := clRed;

Notes:

Cannot use 'as' or 'is' operators. I had to use

   if Form1.Components[I].InheritsFrom(T) then
Exit(T(Form1.Components[I]));

Instead of

   if Form1.Components[I] is T then
Exit(Form1.Components[I] as T);

Of course, because T is not an object (though one could argue that everywhere else regarding generics we are much less picky...). Nevertheless since you're in mode Delphi anyway, this wouldn't work in Delphi either.

I could not use this as a method, for example:

function TForm1.Find<T>: T;

Please show the code and the error message, because here it works.

Question:

Will it be possible to use type constraints?

function TForm1.Find<T: TComponent>: T;
or
function Find<T: TComponent>: T;

Already works (and there you can use "as" and "is", though this would already work with a "TObject" or - Delphi compatible - "class" constraint). [Constraints themselves are already part of 3.0.0]

Test 3 does not work:

function Compare<T>(constref A, B: T): Integer;
begin
   if A > B then
     Result := 1
else if B > A then
Result := -1
   else
     Result := 0;
end;
procedure Test3;
var
   Items: TArrayList<Single>; // See Codebot.System
begin
   Randomize;
   Items.Push(Random * 100);
   Items.Push(Random * 100);
   Items.Push(Random * 100);
   Items.Push(Random * 100);
   // compile fails below
   Items.Sort(soDescend, @Compare<Single>); // cannot take address of
Compare<Single>
end;

As mentioned in my announcement this is a limitation I have yet to address.

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to