Сохранить массив методов

Сохранить массив методов
Дата: 22.06.2009 15:14:51
Привествую.

Вопросик.

Мне нужно передать и сохранить именованый массивчик ссылок на методы (т.е. массив пар "Имя=ссылка на метод") - как в TStrings только хранить надо ссылки на методы. Методы одного типа в массиве (даже не представляю как можно замутить еще и разного типа )

Я уже разобрался как сохранить один (не именованый само собой...) метод...


Мдя.... Объясню на примере...

Счас вот что есть

type
// Объявим прототип метода
  TSomeMethod = function (Key: integer): string;


type
 // некий класс
 TSomeClass = class
  private
    FSomeMethod: TSomeMethod;
  public
    constructor Create (ASomeMethod: TSomeMethod);
 end;

..
constructor Create (ASomeMethod: TSomeMethod)
begin
  FSomeMethod  := ASomeMethod; 
end;



Все ок все работает... но теперь дело усложнилось и мне нужно хранить именованый словарь методов (чтобы по заданному имени - вызвать нужный метод из массива)... В C# есть генерик Dictionary<(Of <(TKey, TValue>)>), который может хранить ссылки на делегатов.

Я пробовал через TStringList - он могет хранить TObject... но не придумал как преобразвать TSomeMethod в TObject.....


Есть ли в дельфи что-то что может помочь ?...



PS. В самом худшем случае можно хранить два массива - один string и один TSomeMethod - и синхронно работать с ними... можно но если только нету чего то удобней....
Barmaley57
Дата: 22.06.2009 15:24:56
Насколько я помню прототип метода это что-то вроде:
  type
    TSomeMethod = function (Key: integer): string of object;

Для TStringList попробуй так AddObject('бла-бла',@FSomeMethod);
Re: Сохранить массив методов
Дата: 22.06.2009 15:34:23
ну там of object да конечно... поторопился



В общем не прокатило....

Ругается что "Variable required"...



пробовал и так:

var
P: Pointer;
begin
FStr := TStringList.Create;
P := @SomeFunction; << все равно тут ругается с той же месагой.
FStr.AddObject('SomeName',P);
Barmaley57
Дата: 22.06.2009 15:40:37
var FSomeMethod:TSomeMethod; // of object
...
  FSomeMethod:=SomeFunction;
  with TStringList.Create do AddObject('123',@FSomeMethod);
Barmaley57
Дата: 22.06.2009 15:41:34
Попробую угадать следующий вопрос: "не могу вынуть из StringList'a" или типа того :)
Угадал
Дата: 22.06.2009 16:04:04
Ты угадал со следующим вопросом )



так

var
  df: TSomeProc;
  sdf:  TSomeProc;
begin
  FStr  :=  TStringList.Create;
  FStr.AddObject('sdf',@df);

  sdf:= ^FStr.Objects[FStr.IndexOf('sdf')];

не прокатывает.... а как надо ?
RENaissance
Дата: 22.06.2009 16:07:43

Может так?
sdf:= TSomeProc(FStr.Objects[FStr.IndexOf('sdf')]);

Posted via ActualForum NNTP Server 1.4

Barmaley57
Дата: 22.06.2009 16:11:45
Если перешел с C/C++, то рекомендую все-таки почитать про указатели в delphi и про всё сопутствующее. В си с этим делом полегче :)

А так на вскидку что-то типа:
var M:TMethod;
  M.Code:=FStr.Objects[FStr.IndexOf('sdf')];
  sdf:=TSomeProc(M);
Barmaley57
Дата: 22.06.2009 16:13:41
P.S. ссылки на методы занимают 8 байт, а TObject - 4. Отсюда и танцы...
Спасибо
Дата: 22.06.2009 16:26:06
Через M:TMethod; получилось....


Крутотень !


Спасибо )