Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / указатель на процедуру - нужны комментарии / 3 сообщений из 3, страница 1 из 1
19.08.2003, 14:56
    #32240449
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на процедуру - нужны комментарии
На практике пока никогда не требовалось работать с указателями на процедуры (функции), но вот разбираясь с примером из ODAC Threads, натолкнулся на код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
type
  TMethod = procedure (Self: pointer);
  TEndMethod = procedure (Self: pointer; Result: boolean);

  PMethodDesc = ^TMethodDesc;
  TMethodDesc = record
    ObjectPtr :pointer;
    Method    :pointer;
    EndMethod :pointer;
    hWindow   :HWND;
  end;

procedure ThreadProc(MethodDesc: PMethodDesc); stdcall;
begin
  try
    TMethod(MethodDesc^.Method)(MethodDesc.ObjectPtr);
    PostMessage(MethodDesc.hWindow, WM_ENDTHREAD, DWORD(MethodDesc),  0 );
  except
    on E:Exception do begin
      PostMessage(MethodDesc.hWindow, WM_EXCEPTTHREAD, DWORD(MethodDesc),
        DWORD(E));
      ExitThread( 0 );
    end;
  end;
end;


Меня поставила в тупик строка
TMethod(MethodDesc^.Method)(MethodDesc.ObjectPtr);
Немного подумав, я осознал, что здесь просто вызывается процедура, на которую указывает указатель Method, для чего этот указатель приводится к типу TMethod, а в качестве параметра передаётся некий указатель на объект ObjectPtr. Мне показалась странной такая запись, более подходящей была бы:
TMethod(MethodDesc^.Method(MethodDesc.ObjectPtr));
Но не тут-то было, при такой записи юнит вообще не компилируется!
Подскажите, где я заблуждаюсь.
...
Рейтинг: 0 / 0
19.08.2003, 16:25
    #32240606
Дмитрий Мыльников
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на процедуру - нужны комментарии
:)
Что такое TMetod? Это процедурный тип. То есть, если бы вы объявили перменную этого типа, то это была бы процедура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
type
    TMethod = procedure(Self:pointer);

var Porc1:TMetod;

....

procedure RealProc(Self:pointer);
begin
....
end;

....
  Proc1:=RealProc;
....
  Proc1(ObjPtr);
....


Теперь смотрим, что делает запись TMethod(MethodDesc^.Method). Она преобразует MethodDesc^.Method к типу TMethod, то есть указывает компилятору на то, какие дальше будут у процедуры параметры. А вторые скобки (MethodDesc.ObjectPtr), это собственно параметр, передаваемый внутрь процедуры.

В общем, всё в модуле написано правильно, но выглядит, пока не разберёшся, действительно странно. :)
...
Рейтинг: 0 / 0
19.08.2003, 17:34
    #32240724
Guilty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
указатель на процедуру - нужны комментарии
Господи, когда же я стану более внимателен!!
Конечно же указатель надо сначала привести к типу TMethod (указатель на процедуру), а потом уже передавать параметр процедуре, а в строке
TMethod(MethodDesc^.Method(MethodDesc.ObjectPtr));
я пытался передать параметр какому-то указателю, а потом привести это к TMethod! Глупость какая..
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / указатель на процедуру - нужны комментарии / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]