Класс объектов-действий

Рейтинг: 0Ответов: 2Опубликовано: 08.07.2011

Привет. Вопрос такой: видел несколько раз в объекте присвоение ссылки на функцию, вот интересно стало. Допустим, мне надо сделать класс TMyAction, в котором есть несколько параметров и ссылка на процедуру. Как сие организовать?

[...]
type TMyAction = class(TObject)
  Param1: string;
  Param2: string;
  Param3: string;
  procedure Action; (* тут явно что-то должно быть *)

var MyAction1, MyAction2: TMyAction;

procedure someFunc;
procedure someFunc2;
[...]
begin
[...]
MyAction1.Action := @someFunc;
MyAction2.Action := @someFunc2;
end.

Вот как-то так) Что это возможно, я знаю, наблюдал. Вопрос - где в этом куске чего дописать?

UPD идеально вот такое использование

if (act = 'go') then
  with MyAction1 do begin
    Param1 := var1;
    Param2 := var2;
    Action := goProcedure;
    end;
  • доступ к параметрам из процедур.

Ответы

▲ 2

Если имеется ввиду механизм событий, то:

TMyEvent = procedure(const Param1, Param2: string) of object;
TMyAction = class(TObject)
public
  FParam1: string;
  FParam2: string;
  FParam3: string;
  FAction1: TNotifyEvent; // Можно прикрутить стандартный обработчик procedure(Sender: TObject)
  FAction2: TMyEvent; // Свой формат обработчкчика procedure(const Param1, Param2: string)
end;

В коде, для запуска, нужно будет проверить назначен обработчик или нет:

if Assigned(FAction2) then
begin
  FAction2("123", "234");
end;
▲ 1

Почти угадал

  TMyAction = class(TObject)
  Param1: string;
  Param2: string;
  Param3: string;
  Action: procedure (Sender:TObject)

Приблизительно так должен выглядеть класс

procedure someFunc (Sender:TObject);
begin
end;
procedure someFunc2 (Sender:TObject);
begin
end;

[...]
begin
[...]
MyAction1.Action := someFunc;
MyAction2.Action := someFunc2;
end.

Вот приблизительно так выглядит общий принцип.