- •Программирование на языке Delphi.
- •1. Краткий экскурс в историю
- •1.1. Языки программирования
- •1.2. Объектно-ориентированное программирование
- •1.3. Визуальное программирование
- •1.4. Среда программирования Delphi
- •1.5. Технология Java
- •1.6. Среда программирования Kylix
- •1.7. Технология .Net
- •... И опять среда Delphi
- •2. Основы языка Delphi
- •2.1. Алфавит
- •2.1.1. Буквы
- •2.1.2. Числа
- •2.1.3. Слова-идентификаторы
- •2.1.4. Комментарии
- •2.2. Типы данных
- •2.2.1. Понятие типа данных
- •2.2.2. Простые типы данных
- •Целочисленные типы данных
- •Вещественные типы данных
- •Временной тип данных
- •Символьные типы данных
- •Булевские типы данных
- •Определение новых типов данных
- •Перечисляемые типы данных
- •Интервальные типы данных
- •2.3. Данные
- •2.3.1. Константы
- •2.3.2. Переменные
- •2.4. Операции
- •2.4.1. Выражения
- •2.4.2. Арифметические операции
- •2.4.3. Операции отношения
- •2.4.4. Булевские операции
- •2.4.5. Операции с битами (эта часть пока не нужна)
- •2.4.6. Очередность выполнения операций
- •2.5. Строки
- •2.5.1. Строковые значения
- •2.5.2. Строковые переменные
- •2.5.3. Операции над строками
- •2.5.4. Стандартные процедуры и функции для работы со строками
- •2.6. Операторы
- •2.6.1. Общие положения
- •2.6.2. Простые операторы
- •Оператор присваивания
- •Оператор вызова процедуры
- •Пустой оператор
- •Оператор безусловного перехода
- •2.6.3. Структурированные операторы
- •Составной оператор
- •Оператор ветвления if
- •Оператор множественного выбора case
- •Оператор повтора for
- •Оператор повтора repeat
- •Оператор повтора while
- •2.6.4. Прямая передача управления в операторах повтора
- •2.7. Подпрограммы
- •2.7.1. Общие положения
- •2.7.2. Объявление процедур и функций
- •Список формальных параметров
- •Локальные объявления
- •Тип возвращаемого значения
- •Соглашения о вызове подпрограмм
- •2.7.3. Вызов процедур и функций
- •2.7.4. Перегрузка процедур и функций
- •2.7.5. Рекурсивные подпрограммы
- •2.7.6. Упреждающее объявление процедур и функций
- •2.7.7. Процедурные типы данных
- •2.7.8. Стандартные процедуры и функции
- •2.8. Структура программных единиц
- •2.8.1. Структура файла проекта
- •Заголовок программы
- •Подключение модулей
- •Программный блок
- •2.8.2. Структура модуля
- •2.8.3. Стандартные модули языка Delphi
- •2.8.4. Область действия идентификаторов
- •2.9. Массивы
- •2.9.1. Статические массивы
- •2.9.2. Работа с массивами
- •2.9.3. Массивы в параметрах процедур и функций
- •2.9.4. Уплотнение структурных данных в памяти
- •2.9.5. Динамические массивы
- •2.10. Множества
- •2.10.1. Объявление множества
- •2.10.2. Операции над множествами
- •2.10.3. Стандартные процедуры для работы с множествами
- •2.11. Записи
- •2.11.1. Объявление записи
- •2.11.2. Операции над записями
- •2.11.3. Записи с вариантами
- •2.12. Файлы
- •2.12.1. Понятие файла
- •2.12.2. Работа с файлами
- •2.12.3. Стандартные подпрограммы управления файлами
- •2.13. Переменные с непостоянным типом значений
- •2.13.1. Тип данных Variant
- •2.13.2. Значения переменных с типом Variant
- •2.13.3. Variant в выражениях
- •2.13.4. Преобразование вариантов к другим типам данных
- •2.13.5. Подпрограммы для работы с вариантами
- •2.13.6. Вариантные массивы
- •2.14. Указатели
- •2.14.1. Понятие указателя
- •2.14.2. Стандартные указательные типы
- •2.14.3. Динамическое распределение памяти
- •2.14.4. Операции над указателями
- •2.14.5. Процедуры GetMem и FreeMem
- •2.15. Представление строк в памяти
- •2.16. Нуль-терминированные строки
- •2.17.1. Встроенный ассемблер
- •2.17.2. Подключение внешних подпрограмм
- •Delphi 6 в подлиннике
- •Часть I. Введение в delphi 6
- •Глава 1. Среда Delphi 6
- •Глава 2. Язык Object Pascal
- •Глава 3. Использование визуальных компонентов
- •Глава 4. Форма - главный компонент приложения
- •Глава 20. Реляционный способ доступа к данным
- •Глава 21. Работа с отчетами
- •Глава 22. Инструментальные средства
- •Часть V. Удаленные базы данных
- •Глава 23. Введение в работу с удаленными базами данных
- •Глава 24. Работа с удаленными базами данных
- •Глава 25. Инструментальные средства для
- •Глава 26. Трехуровневые приложения
- •Часть VI. Публикация баз данных в интернете
- •Глава 27. Введение в технологии публикаций
- •Глава 28. Web-приложения, серверы и интерфейсы
- •Глава 29. Публикация баз данных средствами Delphi
2.16. Нуль-терминированные строки
Кроме стандартных строк ShortString и AnsiString, в языке Delphi поддерживаются нуль-терминированные строки языка C, используемые процедурами и функциями Windows. Нуль-терминированная строка представляет собой индексированный от нуля массив ASCII-символов, заканчивающийся нулевым символом #0. Для поддержки нуль-терминированных строк в языке Delphi введены три указательных типа данных:
type PAnsiChar = ^AnsiChar; PWideChar = ^WideChar; PChar = PAnsiChar; |
Типы PAnsiChar и PWideChar являются фундаментальными и на самом деле используются редко. PChar — это обобщенный тип данных, в основном именно он используется для описания нуль-терминированных строк.
Ниже приведены примеры объявления нуль-терминированных строк в виде типизированных констант и переменных:
const S1: PChar = 'Object Pascal'; // #0 дописывается автоматически S2: array[0..12] of Char = 'Delphi/Kylix'; // #0 дописывается автоматически var S3: PChar; |
Переменные типа PChar являются указателями, а не настоящими строками. Поэтому, если переменной типа PChar присвоить значение другой переменной такого же типа, то в результате получится два указателя на одну и ту же строку, а не две копии исходной строки. Например, в результате оператора
S3 := S1; |
переменная S3 получит адрес уже существующей строки 'Object Pascal'.
Для удобной работы с нуль-терминированными строками в языке Delphi предусмотрена директива $EXTENDEDSYNTAX. Если она включена (ON), то появляются следующие дополнительные возможности:
массив символов, в котором нижний индекс равен 0, совместим с типом PChar;
строковые константы совместимы с типом PChar.
указатели типа PChar могут участвовать в операциях сложения и вычитания с целыми числами; допустимо также вычитание (но не сложение!) указателей.
В режиме расширенного синтаксиса допустимы, например, следующие операторы:
S3 := S2; // S3 указывает на строку 'Delphi/Kylix' S3 := S1 + 7; // S3 указывает на подстроку 'Pascal' |
В языке Delphi существует богатый набор процедур и функций для работы с нуль-терминированными строками (см. справочник по среде Delphi).
2.17. Delphi + ассемблер (эта часть пока не нужна)
В процессе разработки программы вы можете неожиданно обнаружить, что описанных выше средств языка Delphi для решения некоторых насущных проблем явно недостаточно. Например, организация критичных по времени вычислений требует использования ассемблера. Кроме того, часто возникает необходимость включить в программу на языке Delphi откомпилированные ранее процедуры и функции, написанные на ассемблере. Разработчики языка учли эти проблемы и дали программисту необходимые средства их решения.
2.17.1. Встроенный ассемблер
Пользователю предоставляется возможность делать вставки на встроенном ассемблере в исходный текст на языке Delphi.
К встроенному ассемблеру можно обратиться с помощью зарезервированного слова asm, за которым следуют команды ассемблера и слово end:
asm <оператор ассемблера> ... <оператор ассемблера> end; |
На одной строке можно поместить несколько операторов ассемблера, разделенных двоеточием. Если каждый оператор размещен на отдельной строке, двоеточие не ставится.
В языке Delphi имеется возможность не только делать ассемблерные вставки, но писать процедуры и функции полностью на ассемблере. В этом случае тело подпрограммы ограничивается словами asm и end (а не begin и end), между которыми помещаются инструкции ассемблера. Перед словом asm могут располагаться объявления локальных констант, типов, и переменных. Например, вот как могут быть реализованы функции вычисления минимального и максимального значения из двух целых чисел:
function Min(A, B: Integer): Integer; register; asm CMP EDX, EAX JGE @@1 MOV EAX, EDX @@1: end;
function Max(A, B: Integer): Integer; register; asm CMP EDX, EAX JLE @@1 MOV EAX, EDX @@1: end; |
Обращение к этим функциям имеет привычный вид:
Writeln(Min(10, 20)); Writeln(Max(10, 20)); |