Главная страница
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.48 MB
Время: 0.029 c
15-1162162008
Maxim Suvorov
2006-10-30 01:46
2006.11.19
Алгоритм решения полинома высокой степени >100?


2-1162308301
daser
2006-10-31 18:25
2006.11.19
Что неправильно в строке?


5-1143034527
tytus
2006-03-22 16:35
2006.11.19
Как установить свойство Caption?


1-1160046544
WebSqlNeederr
2006-10-05 15:09
2006.11.19
Как обрабатывать текст в Exel?


3-1158580205
AW
2006-09-18 15:50
2006.11.19
создание приложения в Delphi для FireBird