Карта сайтаСсылкиКонтакты

Функции и процедуры

PDF Печать
Статьи

Краткий обзор как использовать различные типы процедур и функций Delphi, указателей на функции и процедуры, методы и указатели методов, анонимные методы.

Автономные процедуры

Более или менее все 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.


 

Добавить комментарий


Защитный код
Обновить