Функции и процедуры
Автономные процедуры
Более или менее все RTL процедуры - так называемые "автономные" процедуры. Они объявлены на уровне модулей и чтобы вызвать такую процедуру, Вы должны знать, где она объявлена (имя модуля и список параметров для передачи).
Пример - процедура ShowMessage, объявленная в модуле dialogs.pas, вот ее объявление:
procedure ShowMessage(const Msg: string);
Чтобы вызвать такую процедуру, Вы просто должны включить имя модуля, где объявлена эта процедура в раздел uses вызывающего модуля. Большинство общих модулей уже перечислено в пункте uses модуля формы, таким образом, Вы не должны вручную добавлять dialogs.pas, чтобы использовать ShowMessage.
Вложенные процедуры
Функции и процедуры иногда содержат другие функции и процедуры в пределах своих блоков:
function DoSomething(S: string) ;
var
X, Y: Integer;
procedure NestedProc(S: string) ;
begin
...
end; // NestedProc
begin
...
NestedProc(S) ;
...
end; // DoSomething
Вышеупомянутые два типа объявления процедур не связаны с классом или объектом.
Методы
Процедуры, которые связаны с классом, называют методами. Большинство методов используют экземпляры класса - объекты. Некоторые методы, называемые методами класса, работают в классах.
Функция Add - метод класса TStringList. Например, метод Add объявляется как:
function Add(const S: string): Integer;
Процедурные типы и указатели процедур
Delphi позволяет обрабатывать подпрограммы (функции и процедуры) как значения, которые могут быть назначены переменным.
Рассмотрим отрывок кода:
type
TDisplayerProc = procedure(const s : string) ;
TIntegerDisplayerFunc = function(
const v : integer; dp : TDisplayerProc) : boolean;
{ ... }
procedure Displayer (const s : string) ;
begin
ShowMessage(s) ;
end;
function DisplayDoubleInteger(
const v : integer; dp : TDisplayerProc) : boolean;
var
r : integer;
begin
r := v + v;
dp(IntToStr(r)) ;
result := r > 0;
end;
{ ....... }
var
dp : TDisplayerProc;
idf : TIntegerDisplayerFunc;
begin
dp := Displayer;
dp('hello') ; // будет "ShowMessage('hello')"
dp('delphi') ; // будет "ShowMessage('delphi')"
idf := DisplayDoubleInteger;
// что будем делать?
if idf(2009, dp) then
ShowMessage('true')
else
ShowMessage('false') ;
end;
В этом коде TDisplayerProc и TIntegerDisplayerFunc - процедурные типы
Переменные dp и idp - указатели процедур. Обратите внимание, что функция DisplayDoubleInteger получает процедурный тип, как второй параметр (TDisplayerProc).
Указатели методов
Подобно указателям процедур, указатели методов ссылаются на методы экземпляра объекта.
TDisplayMethod = procedure(const s : string) of object;
TDeveloper = class
private
fName: string;
fOnNameChanged: TDisplayMethod;
procedure SetName(const Value: string) ;
published
property Name : string read fName write SetName;
property OnNameChanged : TDisplayMethod
read fOnNameChanged write fOnNameChanged;
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject) ;
private
procedure ValueDisplayer(const s : string) ;
end;
{ ... }
procedure TForm1.FormCreate(Sender: TObject) ;
var
d : TDeveloper;
begin
d := TDeveloper.Create;
try
d.OnNameChanged := ValueDisplayer;
d.Name := 'Marko';
d.Name := 'zarko';
finally
d.Free;
end;
end;
procedure TForm1.ValueDisplayer(const s: string) ;
begin
ShowMessage(s) ;
end;
{ TDeveloper }
procedure TDeveloper.SetName(const Value: string) ;
begin
if fName <> Value then
if Assigned(fOnNameChanged) then
fOnNameChanged('old name: ' + fName) ;
fName := Value;
end;
Анонимные методы
Начиная с Delphi 2006, язык Delphi знает также анонимные методы.
Анонимный метод - процедура или функция, которая не связана с ассоциированным именем. Пример анонимных методов: сортировка объекта TList.
Комментарии