Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2009, 09:27   #1
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию Передача процедуры в процедуру через Pointer.

Возник такой вопрос:
есть процедура высокоточного таймера:
Код:
function timeSetEvent(uDelay, uResolution: UINT; lpTimeProc: Pointer; dwUser: DWORD; fuEvent: UINT): UINT; stdcall; external 'winmm.dll';
При этом параметры такие:
Цитата:
Здесь uDelay — необходимый период срабатывания таймера (в мс); uResolution — разрешение таймера (значение 0 означает, что события срабатывания таймера будут возникать с максимально возможной частотой; в целях снижения нагрузки на систему вы можете увеличить это значение); lpTimeProc — адрес процедуры обратного вызова; dwUser — произвольное число, которое передается процедуре обратного вызова и которым программист может распоряжаться по своему усмотрению; fuEvent — параметр, управляющий периодичностью возникновения события таймера: TIME_ONESHOT (0) — событие возникает только один раз через uDelay миллисекунд; TIME_PERIODIC (1) — события возникают периодически каждые uDelay мс.
Получается что процедура передается в процедуру как Pointer (lpTimeProc )
Как мне сделать чтоб я мог аналогичным образом передать Pointer указатель на процедуру в свою процедуру, а потом запускать ее при надобности? (надеюсь понятно объяснил ).
Вадим Буренков вне форума Ответить с цитированием
Старый 13.09.2009, 11:42   #2
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Вот такие варианты:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TProc = procedure;
  TProcWithParams = procedure(params: array of const);

var
  Form1: TForm1;

implementation

{$R *.dfm}

// процедура без параметров

procedure Proc;
begin
  ShowMessage('Proc is called!');
end;

procedure MainProc1(ProcPtr: Pointer);
begin
  // просто так вызвать указатель не получилось, его нужно привести к типу процедуры, как сделано в MainProc3
  //ProcPtr^;
end;

procedure MainProc2(Proc: TProc);
begin
  Proc;
end;

procedure MainProc3(ProcPtr: Pointer);
begin
  TProc(ProcPtr);
end;

// процедура с параметрами

procedure ProcWithParams(params: array of const);
begin
  ShowMessage(Format('Params: p1=%d, p2=%d, p3=%s', params));
end;

procedure MainProc4(ProcWithParams: TProcWithParams; params: array of const);
begin
  ProcWithParams(params);
end;

procedure MainProc5(ProcWithParamsPtr: Pointer; params: array of const);
begin
  TProcWithParams(ProcWithParamsPtr)(params);
end;

// вызов процедур

procedure TForm1.Button1Click(Sender: TObject);
begin
  MainProc1(@Proc); // не работает
  MainProc2(Proc);
  MainProc3(@Proc);

  MainProc4(ProcWithParams, [1, 2, '123']);
  MainProc5(@ProcWithParams, [5, 67, 'qweqwe']);
end;

end.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".

Последний раз редактировалось Daramant; 13.09.2009 в 11:47.
Daramant вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Матрица через процедуры jorjinho10 Паскаль, Turbo Pascal, PascalABC.NET 0 01.05.2009 08:57
как выделить память для указателя (pointer), и сюда же, записать : integer, потом через 4 байта, boolean? bigxman Общие вопросы Delphi 1 02.02.2009 21:17
передача массива в процедуру Gash Общие вопросы Delphi 1 01.02.2009 00:30
передача данных через idtcpclient BioS Работа с сетью в Delphi 0 20.02.2007 11:04