Форум: "Основная";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
Внизforward declaration для процедурных типов Найти похожие ветки
← →
guav © (2006-10-11 17:22) [0]Существуют предварительные объявления для классов, интерфейсов и процедур.
А существует ли для процедурного типа ?
Конкретно, я хочу, чтобы следующее объявление работало:type
TSaveCallback = procedure({всякие парамеры...} ; Sub: TSaveProc) of object;
TSaveProc = procedure(Proc: TSaveCallback) of object;
PS: Знаю, что можно через interface выкрутится, но интересует есть ли сабж в принципе.
← →
Джо © (2006-10-11 17:34) [1]Может я и подзабыл синтаксис, но вроде ж директива forward предназначена исключительно для объявления процедур и функций, а не для объявления типов?
← →
clickmaker © (2006-10-11 17:34) [2]а может логику упростить? как-то запутано...
← →
guav © (2006-10-11 17:39) [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:50) [4]Ну, изврат, конечно, но можно и так:
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 18:04) [5]> [4] Джо © (11.10.06 17:50)
Тоже вариант.
Упрростить удалось только так:var
SvPrc: TSaveProc;
Sp: PSaveProc;
begin
SvPrc := SaveProc;
Sp := @TMethod(SvPrc);
SaveCallback(Sp);
end;
Кстати, уровень косвенности в этом случае будет меньше чем в [3] или таким же ?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.05 c