- •С примерами на Object pascal (72 часа)
- •Введение
- •1.1. Основной принцип структурного программирования
- •1.2. Основные задачи структурного программирования
- •1.3. Основные принципы объектно-ориентированного программирования (ооп)
- •2.1. Алфавит языка pascal. Идентификаторы.
- •2.2. Простые и составные специальные символы, используемые на пк.
- •2.3. Стандартные типы данных. Двоичное представление чисел и дополнительный код.
- •2.4. Особенности работы с некоторыми типами данных
- •2.5. Арифметические операторы.
- •2.6. Логические операторы и операции отношения.
- •2.7. Потеря точности, потеря порядка и переполнение при арифметических операциях.
- •2.8. Структура простейшей программы.
- •2.9. Простейшие операторы языка Object pascal
- •1) Цикл от меньшего к большему значению:
- •2) Цикл от большего к меньшему значению:
- •2.10. Структурные типы данных
- •2.11. Указатели. Динамические переменные. Динамическое выделение и высвобождение памяти
- •2.12. Процедуры и функции. Формальные и фактические параметры. Передача параметров по ссылке, по значению и через указатель.
- •2.13. Локальные и глобальные переменные. Побочный эффект функции. Вложенность процедур и функций. Правила видимости.
- •2.14. Пример на правила видимости и передачи параметров
- •2.15. Рекурсия
- •2.1. Инкапсуляция. Объект. Поля данных и методы объекта
- •3.2 Задание модуль класса (статическая объектная модель)
- •4.10. Создание и уничтожение объектов. Конструкторы и деструкторы.
- •4.11. Наследование. Статические, виртуальные, динамические и абстрактные методы.
- •4.12. Области видимости объектов.
- •4.13. Обработка исключительных ситуаций.
- •4.14. Специальные средства для работы с ms Windows: сообщения.
- •4.15. События и их делегирование. Обработка событий.
- •4.16. Методы класса и указатели на класс.
- •4.17. Дополнительные возможности Object Pascal.
- •5. Визуальное проектирование в среде Delphi.
- •5.8. Создание экранных форм. Инспектор объектов.
- •5.9. Палитра компонентов.
- •6. Интерфейсы и множественное наследование
- •6.1. Общие представления об интерфейсах в Object pascal
- •6.2. Реализация интерфейсов свойством
- •6.3. Различение имен при реализации нескольких интерфейсов
- •5.11. Спецификаторы вызовов процедур и функций
- •5.12. Динамические массивы
- •5.13. Перезагрузка (overloading) методов, процедур и функций
- •5.14. Параметры по умолчанию
- •5.17. Технологии dde и ole
- •5.18. Технология ActiveX
- •5.20. Использование библиотек OpenGl и glu
- •5.21. Создание программистом собственного компонента Литература
5.14. Параметры по умолчанию
Описываются аналогично константам в предыдущих версиях:
Name: Type=value;
При вызове параметры по умолчанию могут быть опущены. Например, если взять заголовок процедуры заполнения массива числом, передаваемым в качестве параметра:
Procedure FillArray(A:array of integer;V:integer=1);
Тогда вызов этой процедуры можно производить так:
FillArray(myArray,1);
Либо, что то же,
FillArray(myArray);
Будьте осторожны и не используйте вызовы overloaded процедур с опущенными значениями по умолчанию, когда число и тип параметров совпадают с одной из других overloaded процедур.
Технология Drag and Drop
Особенности разработки DLL
Работа программ с DLL (Dynamic Link Library) поддерживается операционной системой, а не компилятором какого-либо языка программирования. Они представляют собой универсальный механизм использования в программах библиотек - набора процедур и функций. Разные DLL могут быть написаны на различных языках программирования, что обычно не мешает их использованию в программах, написанных на другом языке программирования.
DLL не в состоянии поставлять в программу переменные, константы и типы. В результате DLL не могут экспортировать в программу объекты – для этого в Object PASCAL используются пакеты. DLL подключаются к программе в момент ее исполнения, т.е. динамически. Значительным преимуществом DLL является то, что если несколько программ используют одну и ту же DLL , в памяти будет лишь один экземпляр разделяемого программами кода. При необходимости DLL могут динамически загружаться и выгружаться из памяти программным путем.
Для создания DLL в Object Pascal введено зарезервированное слово Library, которым должен начинаться текст библиотеки. За словом Library следует ее идентификатор, но в отличие от модуля работа с DLL определяется именем DLL-файла, а не идентификатором, следующим за Library.
Структура текста DLL повторяет структуру обычной программы с тем исключением, что операторы блока реализации в DLL исполняются только один раз в момент загрузки библиотеки в память. Каждое очередное обращение с требованием загрузить библиотеку наращивает на единицу счетчик ссылок, но не приводит к выполнению операторов исполняемой части, что экономит ресурсы компьютера.
Сразу за заголовком списываемой в библиотеке экспортируемой процедуры или функции должно следовать зарезервированное слово Export, которое позволяет DLL- подпрограмме использовать сегмент стека вызвавшей ее программы.
В разделе описаний DLL могут объявляться типы (в том числе и классы), константы и переменные, но они остаются скрытыми от вызывающей программы и могут использоваться только внутри DLL. В разделе описаний помимо стандартных для обычной программы объявлений используется специальный раздел объявления экспортируемых подпрограмм. Этот раздел начинается зарезервированным словом Exports, за которым через запятую перечисляются имена и индексы экспортируемых подпрограмм, описанных до того и помеченных директивой Export:
Library Lib;
Function Funct1 (x : real) : Real; Export;
begin
…
end;
Procedure Proc1 ; Export;
begin
…
end;
Exports
Funct1 index 1, Proc1 index2;
begin
end.
Индекс присваивается процедуре автоматически по порядку ее появления в списках Exports: первая получает индекс 0, следующая 1 и т.д. Можно явно указать индекс добавив за ее именем в списке Exports слово index и целое число без знака в диапазоне от 1 до 32767. Можно определить внешнее имя экспортируемой процедуры отличное от ее идентификатора. Для этого в списке Exports добавляется слово name и внешнее имя в кавычках:
Exports
Funct1 index 1 name ‘myFunct’;
Внешние имена критичны к регистру букв.
Вызывающая программа может ссылаться или на имя экспортируемой подпрограммы, или на ее индекс. При вызове по имени программа просматривает имена в таблице имен в поисках нужного. Так как имена могут состоять из длинных наборов символов и самих имен в таблице может быть много, процесс поиска имени существенно медленнее, чем процесс поиска индекса. Поэтому желательно ссылаться не на имя, а на индекс. Затраты времени на поиск процедуры по имени можно заметно сократить, если указать в списке Exports слово resident:
Exports
Funct1 index 1 name ‘MyFunct’ resident;
Т.к. в этом случае информация о процедуре сохраняется в памяти во все время использования библиотеки.
Для использования процедур из DLL необходимо описать их как внешние, добавив за словом External имя библиотеки и если надо индекс или имя :
Procedure Proc1 ; External ‘MyDLL1’;
Function Func1 (x: real) : real; External ‘MyDLL1’ index1;
Function MyFunct (x:real): real ; External ‘MyDLL1’ name ‘Funct1’;
Описанный способ связывания DLL с основной программой называется статическим. При этом библиотеки загружаются в память одновременно с загрузкой самой программы.
Программа может загружать и высвобождать DLL (динамически) с помощью функций: LoadLibrary, GetProcAddress и FreeLibrary.
begin //Процедура с динамической загрузкой DLL
var : DLLHandler:LongInt;
Handler := LoadLibrary(‘MyDLL1.dll’);
if DLLHandler = 0 then
begin
ShowMessage (‘DLL не найдена’);
Halt(1);
end;
{ определяем адреса процедур функций от первой до третьей по индексу,четвертой– по имени. При вызове по индексу младшее слово PChar содержит индекс, делаем приведение типов: }
@ Funct1 := GetProcAddress (Handler, Pchar (LongInt(1))) ; //Настройка дескриптора DLL
@ SubC := GetProcAddress (Handler, Pchar (LongInt(2))) ;
@ MulC := GetProcAddress (Handler, Pchar (LongInt(3))) ;
@ Proc1 := GetProcAddress (Handler,’Proc1’) ;
FreeLibrary (DLLHandler) // Освобождаем библиотеку
end;