Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Generic function  (Прочитано 18098 раз)
0 Пользователей и 1 Гость смотрят эту тему.
NeferSky
Постоялец

ua
Offline Offline
Бессмертный


« : 31-08-2020 09:41 » new

Добрый день.
Затеял небывалое - кастинг процедур на дженерике.

Код:
Код:
unit Unit4;

interface

uses
  Vcl.Forms, System.Classes, System.Generics.Collections;

type
  TForm4 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    fNotifyEvent: TNotifyEvent;
    function CastMethod<T>(P: Pointer): T;
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure DataModuleOnEvent(Sender: TObject);
begin
//
end;

{ TForm4 }

function TForm4.CastMethod<T>(P: Pointer): T;
var
  M: TMethod;
begin
  M.Data := nil;
  M.Code := P;
  Result := T(M);
end;

procedure TForm4.FormCreate(Sender: TObject);
begin
  fNotifyEvent := CastMethod<TNotifyEvent>(@DataModuleOnEvent);
end;

end.

Проблема в том, что при компиляции ругается на Invalid typecast в функции кастинга, в строке Result := T(M). Причем, если убрать оттуда дженерик и указывать приведение к тому же TNotifyEvent - то все хорошо:
Код:
function TForm4.CastMethod(P: Pointer): TNotifyEvent;
var
  M: TMethod;
begin
  M.Data := nil;
  M.Code := P;
  Result := TNotifyEvent(M);
end;

Вопрос: Что я делаю не так? Я, вообще, законными вещами занимаюсь?

Добавлено через 12 минут и 39 секунд:
А, ну я понял... Если передаваемый тип будет не процедурным, то, действительно, получится лажа вида Result := String(M).
Тогда получается, вопрос звучит по-другому: как-то можно указать, что <T> должен быть именно процедурным? Попробовал заменить T на TProc = reference to procedure - то же самое...
« Последнее редактирование: 31-08-2020 09:53 от NeferSky » Записан

Не тронь налаженный механизм, и он тебя не подведет.
Делать надо хорошо, а плохо - само получится.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines