- •Лабораторная работа 1. Реализация линейных алгоритмов
- •Вариант 1
- •1. Даны два ненулевых числа. Найти их сумму, разность, произведение и частное.
- •Вариант 2
- •1. Даны два числа. Найти среднее арифметическое их квадратов и среднее арифметическое их модулей.
- •Вариант 3
- •1. Скорость лодки в стоячей воде V км/ч, скорость течения реки U км/ч (U < V). Время движения лодки по озеру T1 ч, а по реке (против течения) — T2 ч. Определить путь S, пройденный лодкой.
- •Вариант 4
- •1. Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить расстояние между ними через T часов, если автомобили удаляются друг от друга.
- •Лабораторная работа 2. Условный оператор
- •Лабораторная работа 3. Оператор варианта.
- •Лабораторная работа 4. Строки. Операторы цикла.
- •Программирование численных циклических алгоритмов. Циклы «до» и «пока»
- •Лабораторная работа 5. Подпрограммы
- •Лабораторная работа 6. Массивы
- •Лабораторная работа 7. Множества
- •Лабораторная работа 8. Комбинированный тип данных (Запись)
- •Лабораторная работа 9. Работа с файлами
- •Лабораторная работа 10. Процедуры и функции модуля GraphABC
- •Графические примитивы
- •Подпрограммы для работы с пером
- •Лабораторная работа 11. Создание собственных модулей.
- •Лабораторная работа 12. Решение простейших задач в Console Application
- •Лабораторная работа 13. Динамические массивы
- •Лабораторная работа 14. Тип данных Variant
- •Лабораторная работа 15. Тип TDateTime
- •Лабораторная работа 16. Простейшие задачи на форме
- •Лабораторная работа 17. Флажки и переключатели
- •Лабораторная работа 18. Работа с меню
- •Главное меню
- •КОНТЕКСТНОЕ МЕНЮ
- •Лабораторная работа 19. Работа со списками
- •СПИСКИ ВЫБОРА
- •ВЫПАДАЮЩИЕ СПИСКИ
- •Лабораторная работа 20. Таймер. Работа с календарем
- •Лабораторная работа 21. Таблица строк
- •Лабораторная работа 22. Графика в Delphi
- •Лабораторная работа 23. Калькулятор
- •Лабораторная работа 24. Моделирование движения. Пуля
- •Лабораторная работа 25. Моделирование движения по кругу
- •Лабораторная работа 26. Цветомузыка
- •Лабораторная работа 27. Проигрыватель
- •Лабораторная работа 28. Цветочная поляна
- •Лабораторная работа 29. QUEST
- •Лабораторная работа 30. Тир
- •Лабораторная работа 31. Компоненты Delphi для взаимодействия с серверами автоматизации MS Office
- •Лабораторная работа 32. Обмен данными между программами с помощью DDE
- •Лабораторная работа 33. Технология Drag & Drop
- •Лабораторная работа 34. Использование динамически подключаемых библиотек (DLL).
- •Лабораторная работа 35. Создание собственного класса
- •Лабораторная работа 36. Конструкторы и деструкторы
- •Лабораторная работа 37. Создание собственных компонентов
Для компонента Edit2 определены методы-обработчики приёмника. Метод Edit2DragOver проверяет класс источника и разрешает или запрещает приём.
Метод Edit2DragDrop осуществляет перенос текста из источника в приёмник.
Примечание: обратите внимание, что оба компонента TEdit одновременно
являются источниками и приёмниками. Для этого каждый из них использует методыобработчики другого. А исходный код методов настроен на обработку владельца как экземпляра класса TEdit.
Форма, как приёмник Drag-and-Drop, обеспечивает перемещение панели Panel2, которая выступает в роли источника. Метод FormDragOver запрещает приём любых компонентов, кроме панелей. Метод FormDragDrop осуществляет перемещение компонента.
Панель не имеет своих методов-обработчиков, т. к. работает в режиме dmAutomatic и не нуждается в дополнительной обработке завершения переноса.
Задания для самостоятельной работы
Напишите программу, позволяющую перетаскивать строки из одного списка строк в другой. При этом перетаскиваемая строка должна удаляться из исходного списка.
Примечание: для определения позиции вставки необходимо использовать метод ItemAtPos класса TListBox, который возвращает номер строки в списке.
Лабораторная работа 34. Использование динамически подключаемых библиотек (DLL).
Динамически подключаемая библиотека (DLL) – файл, содержащий процедуры и функции, которые могут использоваться в других библиотеках и программах. При этом эти процедуры и функции не помещаются в программу, а непосредственно вызываются из DLL. Преимущества DLL – экономия оперативной и дисковой памяти, возможность использования различных языков программирования в одном проекте. В Delphi DLL создается как отдельный проект, который может использовать модули и формы, как обычный проект. Создается библиотека выбором меню File- New…-New DLL.
Структура DLL:
library <имя библиотеки> uses <используемые модули>
<описание процедур и функций>
exports < список имен экспортируемых процедур и функций>
© ИМПИ ОГПУ
begin
end.<операторы, выполняющиеся при подключении библиотеки>
В именах процедур и функций прописные и строчные буквы различаются. Возможно переименовать процедуру или функцию – для этого в списке экспортируемых процедур после слова exports пишется <имя процедуры> name
‘<новое имя>’
Пример:
library mylibrary;
uses SysUtils, Classes;
Function Plus(a,b: integer):integer; begin
result:=a+b;
end;
exports Plus name 'Summa';
begin end.
После компиляции будет создан файл mylibrary.dll. Для использования
описанной функции в другом модуле Delphi ее необходимо описать – указать заголовок, после которого записать слово external ‘<имя DLL>’.
Например:
Function Summa(a,b:integer):integer; external ‘mylibrary.dll’;
В DLL могут храниться формы. Для вызова формы DLL должна содержать процедуру, которая создает форму, вызывая конструктор, показывает ее, а затем удаляет из памяти.
Например:
Var F:Tform1;
Procedure ShowForm (Owner:Tcomponent);
Begin
F:=Tform1. Create(Owner);
F.ShowModal;
F.free;
End;
© ИМПИ ОГПУ
Из модуля основной программы теперь просто вызываем ShowForm(Form1), где Form1 – имя формы основной программы.
Отметим, что DLL имеет свою область динамической памяти, отличную от памяти программы, поэтому динамические массивы и строки не могут использоваться как параметры процедур в DLL. Если нужно использовать тип string, то его преобразуют в PChar.
Для удобства управления несколькими проектами можно использовать диспетчер проектов, который вызывается ViewProject Manager.
Кроме обычного подключения DLL, когда процедура описывается в исходном тексте можно использовать динамическую загрузку DLL. Загрузка осуществляется в три этапа:
1.С помощью функции LoadLibrary (name:String):Integer
загружаем библиотеку. Функция возвращает дескриптор DLL – ее номер в оперативной памяти, если загрузка прошла успешно, и 0 – если неудачно.
2.С помощью функции GetProcAddress(numdll: integer, namefunc:string):pointer получаем адрес функции из DLL. Если
возвращается Nil – то такая функция отсутствует.
3.Преобразуем указатель в переменную процедурного типа и используем в программе
4.Выгружаем DLL функцией
FreeLibrary(numdll:integer):Boolean.
Пример.
procedure TForm1.Button1Click(Sender: TObject); Type Func = function (a,b: integer):integer; Var Sum:Func;
D: Integer; begin
Try
D:=LoadLibrary('mylibrary.dll');
if d=0 then ShowMessage('DLL not load') else
begin
Sum:=Func(GetProcAddress(D,'Summa')); if Assigned(Sum) then ShowMessage('Ok')
else ShowMessage('Function not found')
end;
finally FreeLibrary(D); end; end;
© ИМПИ ОГПУ
Задания для самостоятельной работы
1.Напишите DLL, содержащую функцию вычисления минимума двух чисел. Используйте ее в программе, загружая статически и динамически.
2.Напишите DLL, содержащую форму со сведениями об авторе программы. Используйте ее в программе, загружая статически и динамически.
3.Напишите DLL, содержащую функцию перевода целого числа от 0 до 1000 в запись словами на русском языке. Используйте ее в программе, загружая статически и динамически.
Лабораторная работа 35. Создание собственного класса
Создание класса содержащего сведения о сотруднике некоторой организации.
Создадим класс в модуле MyClasses.
unit MyClasses; interface
uses SysUtils, Dialogs, Classes; type
TPerson = class private
FName: string; // Фамилия, имя и отчество
FDepl, FDep2, FDep3: string; // Место работы (учебы)
FYear: word; |
// Год рождения |
|
FSex: char; |
// Пол: "м" или "ж" |
|
FAttr: boolean; |
// Булев атрибут |
|
FComment: string; |
// Комментарий |
protected
procedure SetSex(Value: char); // Процедура записи public
property Name: string read FName write FName; property Depl: string read FDepl write FDepl; property Dep2: string read FDep2 write FDep2; property Dep3: string read FDep3 write FDep3; property Year: word read FYear write FYear;
property Sex: char read FYear, write SetSex default 'м'; property Attr: boolean read FAttr write FAttr default
true;
property Comment: string read FComment write FComment; end;
implementation
procedure TPerson.SetSex(Value: char);
© ИМПИ ОГПУ
// Процедура записи пола begin
if Value in ['м', 'ж'] then FSex := Value
else ShowMessage('Недопустимый символ "' + Value +
'" в указании пола'); end;
end.
Вы создали класс в вашем модуле MyClasses. Давайте посмотрим, как можно
использовать объекты нашего класса. Создайте в модуле формы Unit1 вашего приложения тест класса TPerson. Введите в модуль операторы:
uses Classl;
var Pers: TPerson;
Они обеспечивают связь с модулем, описывающим класс, и объявляют переменную Pers, через которую вы будете связываться с объектом класса. Но так
же, как при работе с другими объектами и записями, объявление этой переменной еще не создает сам оъект. Это указатель на объект, и его значение равно nil.
Создание объекта вашего класса TPerson должно осуществляться вызовом его конструктора Create. Так что создайте обработчик события OnCreate вашей формы, и вставьте в него оператор: Pers := TPerson.Create;
Вот теперь объект создан, и переменная Pers указывает на него. Чтобы не
забыть очистить память от этого объекта при завершении работы приложения, сразу создайте обработчик события OnDestroy формы, и вставьте в него оператор:
Pers.Free;
Теперь перенесите на форму четыре окна Edit, окно Memo и две кнопки. Пусть первая кнопка с надписью Запись заносит в объект Pers данные из окон
редактирования: фамилию с именем и отчеством, пол, подразделение, в котором работает или обучается человек, год рождения, характеристику из окна Memo.
Обработчик щелчка на ней может иметь вид:
with Pers do begin
Name := Editl.Text;
if Edit2.Text <> " then Sex := Edit2.Text[1]; Depl := Edit3.Text;
Year := StrToInt(Edit4.Text);
Comment := Memol.Text; end;
А вторая кнопка с надписью Чтение пусть осуществляет чтение информации из объекта в окна редактирования. Обработчик щелчка на ней может иметь вид:
© ИМПИ ОГПУ