Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  3 918

•  TDictionary Custom Sort  6 024

•  Fast Watermark Sources  5 816

•  3D Designer  8 631

•  Sik Screen Capture  6 148

•  Patch Maker  6 586

•  Айболит (remote control)  6 575

•  ListBox Drag & Drop  5 436

•  Доска для игры Реверси  95 345

•  Графические эффекты  6 791

•  Рисование по маске  5 957

•  Перетаскивание изображений  4 961

•  Canvas Drawing  5 339

•  Рисование Луны  5 063

•  Поворот изображения  4 604

•  Рисование стержней  3 263

•  Paint on Shape  2 504

•  Генератор кроссвордов  3 393

•  Головоломка Paletto  2 697

•  Теорема Монжа об окружностях  3 490

•  Пазл Numbrix  2 292

•  Заборы и коммивояжеры  2 979

•  Игра HIP  1 942

•  Игра Go (Го)  1 857

•  Симулятор лифта  2 202

•  Программа укладки плитки  1 925

•  Генератор лабиринта  2 366

•  Проверка числового ввода  2 052

•  HEX View  2 373

•  Физический маятник  2 009

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Процедурные типы



Основное назначение процедурных типов - дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям.

Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя, например:

type
  Proc1 = procedure(a, b, с: Real; var d: Real);
  Proc2 = procedure(var a, b);
  РгосЗ = procedure;
  Func1 = function: string;
  Func2 = function(var s: string): Real;

Как видно из приведенных примеров, существует два процедурных типа: тип-процедура и тип-функция.

В следующий программе иллюстрируется механизм передачи процедур в качестве фактических параметров вызова. Программа выводит на экран таблицу двух функций: sin1 (х) = (sin(x) + 1) * Ехр(-х) и cosi(x) = (Cos(x) + 1) * Ехр(-х) . Вычисление и печать значений этих функций реализуются в процедуре printFunc, которой в качестве параметров передается количество np вычислений функции в диапазоне х от 0 до 2*3.141592 и имя нужной функции.

function Sinl(X: Real): Real;
begin
  Result := (Sin(X) + 1) * Exp(-X)
end; // Sin 1

function Cosl(X: Real): Real;
begin
  Result := (Cos(X) + 1) * Exp(-X)
end; // Cosi

procedure TfmExample.bbRunClick(Sender: TObject);
type
  // Процедурный тип Procedure PrintFunc(NP: Integer; F; Func);
  Func = function(X: Real): Real;
var
  k: Integer;
  X: Real;
begin
  for k := 0 to NP do
  begin
    X := k * 2 * pi / NP;
    mmOutput.Lines.Add(FloatToStrF(X, ffExponent, 10, 2) + #9#9+
     FloatToStrF(F(X), ffExponent, 10, 2));
  end;
end; // PrintFunc

begin // bbRunClick
  nmiOutput.Lines.Add(#9'Функция SINI:');
  PrintFunc(10, Sini);
  mmOutput.Lines.Add(#9'Функция COSI:');
  PrintFunc(10, Cosi);
end;

Обратите внимание: передаваемые подпрограммы не могут быть локальными, т. е. процедурами или функциями, объявленными внутри другой подпрограммы. Вот почему описание подпрогра^.' sini и cosi размещаются вне обработчика bbRunciick, но выше не." по тексту модуля. Замечу, что символ #9 - это символ табуляции. который вставляется в формируемые строки для разделения колонок с цифрами.

В программе могут быть объявлены переменные процедурных типов, например,так:

var
  p1: Proc1;
  fl, f2: Func2;
  ар: array[1..N] of Proc1;

Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы.








Copyright © 2004-2025 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте