Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > аналог FindComponent для процедур


Автор: Pseex 5.7.2009, 18:04
Есть такая ситуция в коде:
Код

процедура1;
процедура2;
процедура3;


ничего страшного, просто поочерёдный запуск ПОЧТИ одинаковых процедур, однако, если таких процедур будет всё больше и больше и отличаться буду только одним входным параметром i:integer то:

Код

for i := 1 to n do
 begin
  процедура(i);
 end;


Но, касяк в том, что нужно вызывать не всегда в чередующейся последовательности, а, например, только процедуры 1-5-6-37,а затем 65-6-14 и в других вариациях....Сразу вспоминается аналог FindComponent для динамических компонентов, но есть ли подобный для процедур? 

Что хотелось бы в итоге:
Код

 FindProcedura('процедура'+i); // FindProcedura(string):запуск на выполнение процедуры с таким именем 


Ну и как другой вариант: преобразовать процедуры в функции, вынести в отдельный dll присвоив каждой по индексу...

Автор: jsa 6.7.2009, 07:48
FindMethod

Автор: Guedda 6.7.2009, 10:22
через
Код

type
  TYourProcedure = procedure(i : Integer);

Автор: RomanEEP 6.7.2009, 13:51
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

  TIntMethod = procedure(Data: Integer) of object;

  TProcObject = class(TObject)
  public
    procedure ExecProc(Index: Integer; Data: Integer);
  published
    procedure P1(Data: Integer);
    procedure P2(Data: Integer);
    procedure P3(Data: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Proc: TProcObject;
  k: Integer;
begin
  Proc := TProcObject.Create;
  for k := 1 to 4 do
    Proc.ExecProc(k, $FFFF);
  Proc.Free;
end;

{ TProcObject }

procedure TProcObject.ExecProc(Index, Data: Integer);
var
  Method: TMethod;
  MethodName: string;
begin
  MethodName := Format('P%d', [Index]);
  Method.Code := MethodAddress(MethodName);
  if Method.Code = nil then
    raise Exception.Create(Format('Method %s is not defined in class %s',
      [MethodName, ClassName]));
  Method.Data := Self;
  TIntMethod(Method)(Data);
end;

procedure TProcObject.P1(Data: Integer);
begin
  ShowMessage('1');
end;

procedure TProcObject.P2(Data: Integer);
begin
  ShowMessage('2');
end;

procedure TProcObject.P3(Data: Integer);
begin
  ShowMessage('3');
end;

end.

Автор: Bose 7.7.2009, 13:15
А ещё можно сделать константный массив этих процедур и дёргать нужные по индексу.

Автор: Pseex 11.7.2009, 17:46
спасибо
RomanEEP, работает)

Автор: Christoph 11.7.2009, 22:40
Цитата(jsa @  6.7.2009,  07:48 Найти цитируемый пост)
FindMethod


Это че такое? я искал, но такого в справке не увидел

Добавлено позже
Цитата(jsa @  6.7.2009,  07:48 Найти цитируемый пост)
FindMethod


Это че такое? я искал, но такого в справке не увидел

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)