Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.19;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.031 c
2-1162269085
Wood
2006-10-31 07:31
2006.11.19
Excel, автоподбор высоты строки.


2-1162736465
Student2007
2006-11-05 17:21
2006.11.19
Убрать границы после использования Rectagle


15-1162000406
ProV
2006-10-28 05:53
2006.11.19
Можно ли изменить параметр FVisible в привате класса другого юнит


15-1162362340
Виджет
2006-11-01 09:25
2006.11.19
Апгрейд


1-1160398467
CDfdfgf
2006-10-09 16:54
2006.11.19
Tms "xlsadapter" - что это?