<div dir="ltr"><div class="gmail_extra"><div class="gmail_extra">Here are a few tests ...</div><div class="gmail_extra"><br></div><div class="gmail_extra">Test 1 works:</div><div class="gmail_extra"><br></div><div class="gmail_extra">function Swap<T>(var A, B: T): T;</div><div class="gmail_extra">var</div><div class="gmail_extra">  C: T;</div><div class="gmail_extra">begin</div><div class="gmail_extra">  C := A;</div><div class="gmail_extra">  A := B;</div><div class="gmail_extra">  B := C;</div><div class="gmail_extra">end; </div><div class="gmail_extra"><br></div><div class="gmail_extra">Example 1 usage:</div><div class="gmail_extra"><br></div><div class="gmail_extra">Swap<Integer>(I, J); // J now holds I value, I value holds J</div><div class="gmail_extra"><br></div><div class="gmail_extra">Test 2 works but with notes:</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">function Find<T>: T;</div><div class="gmail_extra">var</div><div class="gmail_extra">  I: Integer;</div><div class="gmail_extra">begin</div><div class="gmail_extra">  for I := 0 to Form1.ComponentCount - 1 do</div><div class="gmail_extra"><span style="white-space:pre">    </span>if Form1.Components[I].InheritsFrom(T) then</div><div class="gmail_extra"><span style="white-space:pre">      </span>Exit(T(Form1.Components[I]));</div><div class="gmail_extra">  Result := nil;</div><div class="gmail_extra">end;</div><div class="gmail_extra"><br></div><div class="gmail_extra">Example 2 usage:</div><div class="gmail_extra"><br></div><div class="gmail_extra">Find<TShape>.Brush.Color := clRed;<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Notes:</div><div class="gmail_extra"><br></div><div class="gmail_extra">Cannot use 'as' or 'is' operators. I had to use</div><div class="gmail_extra"><br></div><div class="gmail_extra">  if Form1.Components[I].InheritsFrom(T) then<br></div><div class="gmail_extra"><span style="white-space:pre">      </span>Exit(T(Form1.Components[I]));</div><div class="gmail_extra"><br></div><div class="gmail_extra">Instead of</div><div class="gmail_extra"><br></div><div class="gmail_extra">  if Form1.Components[I] is T then<br></div><div class="gmail_extra"><div class="gmail_extra"><span style="white-space:pre">      </span>Exit(Form1.Components[I] as T);</div><div><br></div></div><div class="gmail_extra"><div class="gmail_extra">I could not use this as a method, for example:</div><div class="gmail_extra"><br></div><div class="gmail_extra">function TForm1.Find<T>: T;</div><div class="gmail_extra"><br></div><div class="gmail_extra">Question:</div><div class="gmail_extra"><br></div><div class="gmail_extra">Will it be possible to use type constraints?</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra"><div class="gmail_extra">function TForm1.Find<T: TComponent>: T;</div><div class="gmail_extra">or</div><div><div class="gmail_extra">function Find<T: TComponent>: T;</div></div><div class="gmail_extra"><br></div><div class="gmail_extra">Test 3 does not work:</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">function Compare<T>(constref A, B: T): Integer;</div><div class="gmail_extra">begin</div><div class="gmail_extra">  if A > B then</div><div class="gmail_extra">    Result := 1</div><div class="gmail_extra"><span style="white-space:pre">  </span>else if B > A then</div><div class="gmail_extra"><span style="white-space:pre">    </span>Result := -1</div><div class="gmail_extra">  else</div><div class="gmail_extra">    Result := 0;</div><div class="gmail_extra">end;</div><div class="gmail_extra">    </div><div class="gmail_extra">procedure Test3;   </div></div><div class="gmail_extra"><div class="gmail_extra"><div class="gmail_extra">var</div><div class="gmail_extra">  Items: TArrayList<Single>; // See Codebot.System</div><div class="gmail_extra">begin<br></div><div class="gmail_extra">  Randomize;<br></div><div class="gmail_extra">  Items.Push(Random * 100);</div><div class="gmail_extra">  Items.Push(Random * 100);</div><div class="gmail_extra">  Items.Push(Random * 100);</div><div class="gmail_extra">  Items.Push(Random * 100);</div><div class="gmail_extra">  // compile fails below</div><div class="gmail_extra">  Items.Sort(soDescend, @Compare<Single>); // cannot take address of Compare<Single></div><div class="gmail_extra">end;</div><div><br></div></div></div></div></div></div></div></div></div>