Вниз
Скачать: CL | DM;

процедурные типы   Найти похожие ветки 

 
einsam   (2002-08-15 00:56) [0]

Здравствуйте.
Следующий код является ошибочным:
type
TMyProc: procedure (Param: integer);
PMyProc: ^TMyProc;
...
begin
...
PointToProc := @SomeProc;
PointToProc^(1);
...
end;

Ошибка возникает при разыменовывании указателя - неверный
доступ к памяти. А вот почему такое действие нельзя произвести?


 
Юрий Зотов ©   (2002-08-15 01:38) [1]

Произвести можно, но немного иначе.

Процедуры и функции - сами по себе уже указатели. Компилятор трактует @SomeProc и SomeProc как один и тот же адрес, а операция @ здесь нужна лишь для обхода синтаксической неоднозначности - чтобы в неявных случаях подчеркнуть, что надо не вызвать процедуру, а взять ее адрес.

procedure Proc(Param: integer);
begin
ShowMessage(IntToStr(Param))
end;

type
TProc = procedure(Param: integer);

procedure TForm1.Button1Click(Sender: TObject);
var
P: TProc; // а не ^TProc
begin
P := @Proc; // можно и без @
P(1) // без всяких разыменований
end;


 
einsam   (2002-08-15 01:56) [2]

>Юрий Зотов © (15.08.02 01:38)
Здесь я код несколько упростил. В действительности же ситуация несколько иная. Моя процедура получает данный указатель в качестве параметра. Далее происходит этакий Callback-вызов. Можно, конечно, сделать этот параметр обычного процедурного типа (как предлагаете Вы), но хотелось бы учесть ситуацию, когда в параметр процедуру передавать не надо, и вместо нее передается nil. Посему и решил пойти через указатели.
Стоп. А может быть можно спокойно передать nil и при использовании обычного процедурного типа? Вы это имеете ввиду?


 
Юрий Зотов ©   (2002-08-15 02:04) [3]

Почему бы и нет?

Мы же получаем nil, когда GetProcAddress не находит функцию в DLL - и никаких проблем. Но проверять надо с @:

if @Proc <> nil then Proc(...)

Можно даже сделать этот параметр необязательным:

procedure MyEnumProc(..., CallbackProc: TProc = nil);
begin
if @CallbackProc <> nil then CallbackProc(...)
end;


 
einsam   (2002-08-15 02:29) [4]

А вот за это большое спасибо вам.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.01 c
6-85158
AngeL B.
2002-06-14 12:28
2002.08.26
Indy и Proxy


3-84927
КСА
2002-08-06 06:41
2002.08.26
Два одинаковых бланка на одном листе в QReport


1-85002
sammy
2002-08-16 09:33
2002.08.26
---|Ветка была без названия|---


3-84938
Chuvi
2002-08-06 18:15
2002.08.26
Как изменить формат выходной даты из SQL - сервера ??


1-85052
Goblinus
2002-08-14 12:17
2002.08.26
Как узнать, пуст ли буфет обмена или нет?




   Наверх