![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
forward declaration для процедурных типов
guav © (2006-10-11 17:22:00)Существуют предварительные объявления для классов, интерфейсов и процедур.
А существует ли для процедурного типа ?
Конкретно, я хочу, чтобы следующее объявление работало:
type
TSaveCallback = procedure({всякие парамеры...} ; Sub: TSaveProc) of object;
TSaveProc = procedure(Proc: TSaveCallback) of object;
PS: Знаю, что можно через interface выкрутится, но интересует есть ли сабж в принципе.
GuAV (2006-10-11 18:04:00) [1]> [4] Джо © (11.10.06 17:50)
Тоже вариант.
Упрростить удалось только так:
var
SvPrc: TSaveProc;
Sp: PSaveProc;
begin
SvPrc := SaveProc;
Sp := @TMethod(SvPrc);
SaveCallback(Sp);
end;
Кстати, уровень косвенности в этом случае будет меньше чем в [3] или таким же ?
Джо (2006-10-11 17:50:00) [2]Ну, изврат, конечно, но можно и так:
PSaveProc = ^TSaveProc;
TSaveCallback = procedure (Sub: PSaveProc) of object;
TSaveProc = procedure (Proc: TSaveCallback) of object;
Использовать примерно так (пишу начерно, наверняка можно упростить):
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure SaveProc (Proc: TSaveCallback);
procedure SaveCallback (Sub: PSaveProc);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
SvPrc: TSaveProc;
Sp: Pointer;
begin
SvPrc := SaveProc;
Sp := @TMethod(SvPrc).Code;
SaveCallback(Sp);
end;
procedure TForm1.SaveCallback(Sub: PSaveProc);
begin
Sub^ (SaveCallback);
end;
procedure TForm1.SaveProc(Proc: TSaveCallback);
begin
ShowMessage ('SaveProc');
end;
:0)
guav (2006-10-11 17:39:00) [3]> [1] Джо © (11.10.06 17:34)
Директивы для типов нет, но само объявление - есть. Пример:
type
ISaveCallback = interface;
TSaveProc = procedure(Intf: ISaveCallback) of object;
ISaveCallback = interface
procedure SaveObject({...;} Sub: TSaveProc);
end;
> [2] clickmaker © (11.10.06 17:34)
Может быть. Но пока неочевидно как.
Джо (2006-10-11 17:34:00) [4]Может я и подзабыл синтаксис, но вроде ж директива forward предназначена исключительно для объявления процедур и функций, а не для объявления типов?
clickmaker (2006-10-11 17:34:00) [5]а может логику упростить? как-то запутано...