Хранение объектной процедуры в переменной TObject

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Хранение объектной процедуры в переменной TObject

Сообщение Ichthyander » 16.11.2017 22:12:09

Очень просто, но застопорился.
Хочу сохранить ссылки на обработчики в TStringList.
Не могу что-то слету понять как это сделать?
Код: Выделить всё
function TWebhookAction.GetCommandHandlers(Command: String): TCommandEvent;
var
  i: Integer;
  O: TObject;
begin
  i:=FCommandHandlers.IndexOfName(Command);
  if i>-1 then
    Result:=TCommandEvent(FCommandHandlers.Objects[i])
  else
    Result:=nil;
end; 

И наоборот
Код: Выделить всё
procedure TWebhookAction.SetCommandHandlers(Command: String;
  AValue: TCommandEvent);
var
  i: Integer;
begin
  i:=FCommandHandlers.IndexOfName(Command);
  if i=-1 then
    FCommandHandlers.AddObject(Command, AValue)
  else
    FCommandHandlers.Objects[i]:=AValue;
end;

где TCommandEvent - объектная процедура, то есть типа TCommandEvent = procedure (ASender: TObject; ... ... ...) of object;
Выдает ошибку
Error: Illegal type conversion: "TObject" to "<procedure variable type of procedure(ASender: TObject; ... ... ...) of object;
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Хранение объектной процедуры в переменной TObject

Сообщение zub » 16.11.2017 22:16:13

TObject это просто указатель, а TCommandEvent - это 2 указателя, невыйдет.
Делай массив TMethod`ов и ли сразу TCommandEvent`ов и в нем храни
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Хранение объектной процедуры в переменной TObject

Сообщение Ichthyander » 16.11.2017 22:32:36

Эх, жаль... Что-то уже много кода получится для такой простой задачки... И не изящно, ИМХО. МОжет есть какой-то класс с именованный список процедурными ссылками (как в TStringList) в FPC? или генерик класс. наподобии TFPGList только со строками..?
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Хранение объектной процедуры в переменной TObject

Сообщение zub » 16.11.2017 22:36:55

TMap из fcl-stl, TDictionary из rtl-generics
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Хранение объектной процедуры в переменной TObject

Сообщение Ichthyander » 17.11.2017 00:06:48

Спасибо! На тот случай, если у кого-то встанет такая же задача
Используя модуль ghashmap объявляю классы
Код: Выделить всё
  TStringHash = class
    class function hash(s: String; n: Integer): Integer;
  end;

  generic TStringHashMap<T> = class(specialize THashMap<String,T,TStringHash>) end;

  TCommandHandlersMap = specialize TStringHashMap<TCommandEvent>;

В иоге операторы присваивания и получения проедурной переменной из списка выглядит еще проще
Код: Выделить всё
function TWebhookAction.GetCommandHandlers(const Command: String): TCommandEvent;
begin
  Result:=FCommandHandlers.Items[Command];
end;

procedure TWebhookAction.SetCommandHandlers(const Command: String;
  AValue: TCommandEvent);
begin
  FCommandHandlers.Items[Command]:=AValue;
end;


Добавлено спустя 5 минут 50 секунд:
Функция для создания хеша
Код: Выделить всё
class function TStringHash.hash(s: String; n: Integer): Integer;
var
  c: Char;
begin
  Result := 0;
  for c in s do
    Inc(Result,Ord(c));
  Result := Result mod n;
end;   
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Хранение объектной процедуры в переменной TObject

Сообщение zub » 17.11.2017 10:22:25

TDictionary предпочтительней - быстрее, экономней (по тестам годовалой давности) делфисовместим
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Хранение объектной процедуры в переменной TObject

Сообщение Ichthyander » 17.11.2017 11:03:15

zub писал(а):TDictionary предпочтительней - быстрее, экономней (по тестам годовалой давности) делфисовместим

Последний "плюс" мне "до фонаря", а вот первые два... А если не затруднит можно пример реализациии с TDictionary наподобии указанного выше?

Добавлено спустя 13 минут 56 секунд:
Тут если что https://github.com/Al-Muhandis/brook-te ... action.pas Заодно может у кого другие предложения будут по оптимизации или по структуре...
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14

Рейтинг@Mail.ru