Програмування на delphi

Додавання дужок при виклику процедур і функцій без параметрів вже давно не є новинкою в Delphi, проте, ця можливість мало відома. Цю можливість гідно оцінять ті програмісти, яким доводиться працювати на двох мовах (C ++ і Delphi), так як їм не потрібно буде постійно пам'ятати про різницю в синтаксисі при виклику процедур і функцій в різних мовах. У Delphi обидва варіанти, наведені нижче, вважаються коректними.

Вперше концепція перевантаження процедур і функцій була реалізована в Delphi4. Вона дозволяє мати кілька різних процедур і функцій з однаковими іменами, але з різними списками параметрів. Такі процедури і функції повинні бути описані із застосуванням директиви overload.


При виклику процедури Test, Delphi сама вирішить, яку з трьох процедур необхідно виконати, в залежності від переданого їй параметра. Але потрібно відзначити, що це не найбезпечніша можливість мови. Застосування перевантажуються процедур і функцій може стати невичерпним джерелом важковловимих помилок в програмі. Тому користуйтеся цією можливістю обережно.

Pascal дозволяє передавати параметри в функції і процедури або за значенням, або за посиланням. Рухаючись параметр може мати будь-який вбудований або призначений для користувача тип або бути відкритим масивом. Параметр також може бути константою, якщо його значення в процедурі або функції не змінюється.

Передача параметрів за значенням

Цей режим передачі параметрів застосовується за умовчанням. Якщо параметр передається за значенням, створюється локальна копія даної змінної, яка і надається для обробки в процедуру або функцію. Подивіться на наступний приклад:


При виклику зазначеної процедури буде створена копія передається їй як параметр рядка s, з якої і буде працювати процедура Test. При цьому всі внесені в рядок зміни жодним чином не позначаться на вихідної змінної s.

Однак це не відноситься до об'єктів. Наприклад, якщо в функцію передається змінна (а точніше екземпляр об'єкта) TStringList, то в даному випадку відбудеться передача за посиланням (навіть якщо це не зазначено явно).

Передача параметрів за посиланням

Pascal дозволяє також передавати параметри в функції або процедури по посиланню - такі параметри називаються параметрами-змінними. Передача параметра за посиланням означає, що функція або процедура зможе змінити отримані значення параметрів. Для передачі параметрів по посиланню використовується ключове слово var. поміщається в список параметрів викликається процедури або функції.

Передача параметрів констант


Передача відкритих масивів

Відкритий масив параметрів дозволяє передавати в функцію або процедуру різну кількість параметрів. Як параметри можна передати або відкритий масив елементів однакового типу, або масиви констант різного типу. У наведеному нижче прикладі оголошується функція, якою як параметр повинен передаватися відкритий масив цілих чисел.


У відкритому масиві можна передавати змінні, константи або вирази з констант. Нижче наведено приклад, який демонструє виклик функції AddEmUp з передачею їй кількох різних елементів.


Для отримання інформації про фактично переданому масиві параметрів в функції або процедури можуть використовуватися функції High, Low і SizeOf. Для ілюстрації їх використання нижче наведений текст функції AddEmUp, яка повертає суму всіх переданих їй елементів масиву A.


Викликати оголошену вище функцію можна, наприклад, за допомогою такого оператора:


При передачі функції або процедури масиву констант всі передані параметри компілятор неявно конвертує в тип TVarRec. Тип даних TVarRec оголошений в модулі System наступним чином:


Поле VType визначає тип містяться в даному екземплярі записи TVarRec даних і може приймати одне з нижче наведених значень.


Оскільки масив констант здатний передавати дані різних типів, це може викликати певні труднощі при створенні обробної отримані параметри функції або процедури. Як приклад роботи з таким масивом розглянемо реалізацію процедури WhatHaveIGot, яка переглядає елементи отриманого масиву параметрів і виводить їх тип.


Повернуться до стандартних значень


У другому випадку можна задати тільки значення параметра s, а для параметра i використовувати значення, встановлене за замовчуванням:


При використанні значенні параметрів за замовчуванням слід пам'ятати про декілька наведених нижче правилах.
  • Параметри, що мають значення за замовчуванням, повинні розташовуватися в кінці списку параметрів. Параметр без значення за замовчуванням не повинен зустрічатися в списку після параметра, що має значення за замовчуванням.
  • Значення за замовчуванням можуть присвоюватися тільки параметрам звичайних типів, вказівниками або безлічам.
  • Значення за замовчуванням може передаватися тільки за значенням або з модифікатором const. Воно не може бути посиланням або Нетипізовані параметром.
Одним з важливих переваг застосування значень параметрів за замовчуванням є простота розширення функціональних можливостей вже наявних процедур і функції з дотриманням забезпечення сумісності. Припустимо, на ринок програмних продуктів була випущена програма, ключовою ланкою якої є функція додавання двох цілих величин:

Директива забороняє виклик функцій як процедур (з ігноруванням повертається результату). За замовчуванням цей режим включений (). Так ось, запам'ятайте, використання змінної Result неприпустимо при скинутий прапорці опції Extended Syntax, розташованому у вкладці Compiler діалогового вікна Project Options, або при вказівці директиви компілятора.

У кожній функції мови Objecl Pascal існує локальна змінна з ім'ям Result, призначена для розміщення значення, що повертається. Крім того, повернути значення з функції можна також шляхом присвоєння значення змінної, що має те ж ім'я, що і дана функція. Це стандартний синтаксис мови Pascal, що зберігся від його попередніх версій. При використанні в тілі функції змінної з її ім'ям не забувайте, що існують великі відмінності в обробці цього імені - все залежить від того, де вона розташована - в лівій частині оператора присвоєння або ж в будь-якому іншому місці тексту функції. Якщо ім'я функції зазначено в лівій частині оператора присвоєння, то передбачається, що призначається повертається функцією значення. У всіх інших випадках передбачається, що здійснюється рекурсивний виклик цієї функції.