Функции и процедуры
Автономные процедуры
Более или менее все 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.
Комментарии