Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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]

а может логику упростить? как-то запутано...


Наверх

Титульная страница Поиск, карта сайта Написать письмо