Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб.раб. программирование.pdf
Скачиваний:
111
Добавлен:
21.05.2015
Размер:
764.95 Кб
Скачать

Для компонента 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;

А вторая кнопка с надписью Чтение пусть осуществляет чтение информации из объекта в окна редактирования. Обработчик щелчка на ней может иметь вид:

© ИМПИ ОГПУ