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

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

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

Ответить
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

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

Сообщение Ichthyander »

Очень просто, но застопорился.
Хочу сохранить ссылки на обработчики в 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;
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

TObject это просто указатель, а TCommandEvent - это 2 указателя, невыйдет.
Делай массив TMethod`ов и ли сразу TCommandEvent`ов и в нем храни
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Эх, жаль... Что-то уже много кода получится для такой простой задачки... И не изящно, ИМХО. МОжет есть какой-то класс с именованный список процедурными ссылками (как в TStringList) в FPC? или генерик класс. наподобии TFPGList только со строками..?
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

TMap из fcl-stl, TDictionary из rtl-generics
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

Спасибо! На тот случай, если у кого-то встанет такая же задача
Используя модуль 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;   
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

TDictionary предпочтительней - быстрее, экономней (по тестам годовалой давности) делфисовместим
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

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

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

Добавлено спустя 13 минут 56 секунд:
Тут если что https://github.com/Al-Muhandis/brook-te ... action.pas Заодно может у кого другие предложения будут по оптимизации или по структуре...
Ответить