1 type Name = Function header of Object; 2 type Name = Procedure header of Object;
Ключевое слово Object имеет одно принципиальное использование - чтобы квалифицировать функцию или тип данных процедуры, позволяя ему обратиться к эквивалентному объектному методу. Устаревшее его использование (не показан в вышестоящем синтаксисе), использовалось, чтобы создать объект (теперь мы используем конструктор класса). Переменные функции и типы процедуры могут использоваться как указатели к функциям и процедурам с теми же самыми параметрами и конфигурацией возвращаемого значения (сигнатура). Например: function AddUp(a, b : Integer) : Integer; ... type TFunc = function(a, b : Integer) : Integer; var func : TFunc; c : Integer; begin func := AddUp; c := func(12, 34); // Вызывает функцию AddUp end; Со спецификатором Of Object, тип подпрограммы должен быть установлен на указатель метода в объекте. Например: type TMyClass = class public procedure StoreName(name : string); end; TProc = procedure(name : string) of object; var proc : TProc; myClass : TMyClass; begin myClass := TMyClass.Create; proc := myClass.StoreName; proc('My name'); // Вызывает myClass.StoreName end;
|
// Полный код Модуля. // ----------------------------------------------------------- // Вы должны поместить этот код в модуль с именем Unit1 и с формой // названную Form1, которая имеет событие OnCreate названное FormCreate. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type // Определение простого класса TSimple = class private name : string; public function GetName : string; constructor Create(name : string); end; // Сам класс формы TForm1 = class(TForm) procedure FormCreate(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} // Создание простого объекта constructor TSimple.Create(name: string); begin // Сохранение переданной строки self.name := name; end; // Возвращение простого имени function TSimple.GetName: string; begin Result := name; end; // Главная линия кода procedure TForm1.FormCreate(Sender: TObject); type TNameFunc = Function : string of Object; var simple : TSimple; nameFunc : TNameFunc; begin // Созданиеп простого объекта simple := TSimple.Create('Brian'); // Показ имени объекта ShowMessage('Обращение к имени непосредственно = '+simple.GetName); // Теперь обращаемся к этому методу косвенно nameFunc := simple.GetName; // Показ имени объекта ShowMessage('Обращение к имени косвенно = '+nameFunc); end; end.
|