Описание |
Ключевое слово 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;
|
|
Примечания |
Такие типы подпрограмм в действительности яявляются указателями и на код и на части данных метода.
|
|
Похожие команды |
Class Начинает объявление типа объектного класса
Function Определяет подпрограмму, которая возвращает значение
Procedure Определяет подпрограмму, которая не возвращает значение
TObject Тип базового класса, который является предком для всех других классов
| |
|
Пример кода : Доступ к объектному методу непосредственно и косвенно |
// Полный код Модуля. // ----------------------------------------------------------- // Вы должны поместить этот код в модуль с именем 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.
|
Обращение к имени непосредственно = Brian
Обращение к имени косвенно = Brian
|
|