Konstrukcja "is as" w funkcji generycznej

0

Często używam konstrukcji

 is as 

do kastowania parametru eventów Sender: TObject

 w taki sposób:
```delphi
  if (Sender is TStringGrid) then
        sg := (Sender as TStringGrid)
  else
       Exit;

Chciałem zrobić funkcję której użycie wyglądało by tak:

if not GF<TStringGrid>.TryCastSender( Sender, sgs ) then Exit;

pytanie jak powinno wygląda ciało funkcji, żeby uzyskać taki efekt?

zmajstrowałem coś takiego ale nie idzie skompilować:

class function GenericsFunc<T>.SenderCast( const ASender: TObject; out OCastedSender: T ): boolean;
begin
   result := ASender  is T;
   OCastedSender := T(0);

   if not result then Exit;

  // OCastedSender := T(ASender);
   OCastedSender := ASender as T;
end;

Jakieś pomysły?

0

Jakaś masakra nie kod ale się da choć wielkiego zysku na używaniu tej funkcji nie ma (no chyba ze tego naprawę dużo) . Jak ktoś jest masochistą to proszę bardzo.

uses
  TypInfo;

class function TGenericsFunc<T>.SenderCast(const ASender: TObject; out OCastedSender: T): Boolean;
begin
  result:= ASender is PTypeInfo(TypeInfo(T)).TypeData^.ClassType;
  OCastedSender:= T(nil);
  if not result then Exit;
  PPointer(@OCastedSender)^:= ASender;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Button: TButton;
begin
  if not TGenericsFunc<TButton>.SenderCast(Sender, Button) then Exit;
  ShowMessage(Button.Name);
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1