ЗАДАНИЯ НА САМОСТОЯТЕЛЬНУЮ РАБОТУ

1. ИНТЕРФЕЙС DRAG&DROP

 

Операционная система Windows широко использует специальный прием связывания программ с данными, который называется Drag&Drop (перетащи и от­пусти). Такой прием в Проводнике Windows используется для копирования или перемещения файлов. В Delphi реализован собственный интерфейс Drag&Drop, позволяющий компонентам обмениваться данными путем “перетаскивания» их мышью. Этот интерфейс определяется двумя свойствами и тремя событиями, дос­тупными каждому видимому компоненту.

Свойство

property DgagMode : TDragMode;

TGragMode = (dmManual, dmAutomatic);

Определяет, как будет выполняться весь комплекс действий, связанных с Drag&Drop: dmManual — вручную (программой); dmAutomatic — автомати­чески (свойствами и методами компонентов). Во всех случаях программист должен написать обработчики этих событий.

Свойство

PropertyDradCursor: TCursor;

Определяет вид указателя мыши в момент, когда над компонентом 2протаскиваются данные». Если компонент готов принять данные, он устанавливает в это свойство значение crDrag , в противном случае — crNoDrag . Установка этих свойств осуществляется автоматически, если DgagMode = dmAutomatic.

Событие OnDragOver(Sender, Soursce : TObject; X, Y: Integer; State: TDragState; var Accept: Boolean) возникает в момент перемещения указателя мыши «с грузом» над компонентом.

Здесь Sender — компонент, который возбудил событие; Soursce — компонент-оправитель «груза»; X, Y — текущие координаты указателя мыши; State — состояние указателя (dsDragEnter— только что появился над компонентом; dsDragLeave — только что покинул компонент или была отпущена кнопка мыши; dsDragMove — перемещается над компонентом). В параметре Accept обработчик сообщает, готов ли компонент принять данные.

Событие OnDragDropEvent(Sender, Soursce : TObject; X, Y: Integer) означает, что пользователь «бросил» данные на компонент. Параметры обработчика совпадают по назначению с одноименными параметрами OnDragOver.

Наконец, при завершении перетаскивания (вне зависимости от того, приняты данные или нет) возникает событие

OnEndDrag(Sender, Target : TObject; X, Y: Integer);

где Sender — отправитель данных; Target — получатель данных или NIL, если никто не принял «посылку»; X, Y — координаты мыши в момент отпускания левой кнопки.

Задание 1.

Создадать проект, содержащий 2 списка ListBox, компонент Edit, компонент Panel и две кнопки. Данный проект должен обеспечивать следующие функции:

 

 

 

· копирование строк из Edit в 1 список;

· перенос строк из первого списка во второй;

· удаление строк из 1 списка методом их буксировки на черную панель.

Задание 2.

Создадать проект, содержащий компонент StringGrid и компонент Edit. Данный проект должен обеспечивать копирование строк из Edit в таблицу.

 

 

АВТОМАТИЗАЦИЯ ActiveX

В настоящее время в технологиях создания программного обеспечения видна явная тенденция к переходу на объектно-ориентированные принципы разработки. Эти принципы позволяют в большинстве случаев существенно упростить написание и отладку программ, хотя этап проектирования может усложниться. Основные принципы объектно-ориентированной разработки предписывают рассматривать всю анализируемую предметную область как совокупность объектов, которые могут взаимодействовать между собой. Каждый объект имеет некоторый набор «методов» (процедур и функций) и свойств, только через которые и можно взаимодействовать с этим объектом.

Современные версии операционных систем от Microsoft по сути частично уже являются объектно-ориентированными. Для взаимодействия между объектами фирма Microsoft разработала целый ряд стандартов, объединенных между собой под единой маркой ActiveX.

В данной работе на примере программы Microsoft Excel мы рассмотрим, как можно из программы Delphi запустить Excel, создать в нем новую книгу и заполнить ее данными. В создаваемом приложении должна быть обеспечена возможность выбора таблицы базы данных, ее просмотр в виде таблицы, а также команда создания отчета по данной таблице с использованием ActiveX-автоматизации.

Приложение будет состоять всего из одной формы, на которой необходимо разместить компоненты для просмотра и навигации по таблице, а также кнопки для выбора таблицы базы данных, выхода из программы и создания отчета.

Для того, чтобы пользователь в программе мог выбирать имена баз данных и таблиц, необходимо на форме разместить два комбосписка. Список элементов для выбора имени базы данных необходимо заполнить в обработчике события формы OnCreate. Для этого необходимо вызвать метод Session.GetDatabaseNames. Список элементов второго комбосписка для выбора имени таблицы необходимо формировать в ответ на изменение имени базы данных с помощью вызова метода Session.GetTableNames. при изменении имени базы данных или таблицы необходимо заново попытаться открыть таблицу или выдать сообщение об ошибке открытия.

Для упрощения выбора таблицы, размещенной локально в некотором каталоге и имеющей фрмат Dbase, FoxPro или Paradox, можно разместить на форме кнопку и диалог выбора файла. При нажатии кнопки нужно выдать диалоговое окно для выбора файла с таблицей и по его завершении занести в комбосписки с именами базы данных и таблицы соответственно значения пути к файлу и его имя.

После выполнения указанных шагов пользователь сможет выбирать произвольные таблицы и просматривать их содержимое.

Для программирования с помощью автоматизации ActiveX вначале необходимо установить связь с программой-сервером автоматизации и связаться с каким-то из его объектов, например с книгой Microsoft Excel или с документом Microsoft Word. В Delphi это делается с помощью функции SetActiveOleObject для подключения к объекту уже запущенного сервера либо с помощью CreateObject для запуска приложения-сервера автоматизации и подключения к его объектам. Эти функции определены в модуле ComObj, поэтому перед их использованием этот модуль необходимо указать в секции Uses. Аргументом вызова этих функций является имя создаваемого объекта сервера автоматизации, например, «Excel.Application» для получения доступа к Microsoft Excel в целом либо «Word.Document» для создания в памяти временного текстового документа Microsoft Word.

Если при подключении к серверу произошла ошибка, например приложение-сервер не запущено в случае вызова функции SetActiveOleObject либо приложение-сервер вообще не установлено на компьютере, то возникает исключение, которое необходимо в программе соответствующим образом обработать.

Результатом вызова указанных функций соединения с сервером является так называемый «диспетчеризуемый» интерфейс запрошенного объекта. Такие интерфейсы-диспетчеры позволяют вызвать процедуры, функции, обращаться к массивам и свойствам объектов сервера. В Delphi для упрощения доступа к объектам автоматизации такие интерфейсы лучше всего запоминать в переменных типа Variant, который позволяет хранить в себе данные разнообразных типов, в том числе и диспетчеризуемые интерфейсы объектов автоматизации.

В нашей программе результат вызова функции обращения к объекту «Excel.Application» необходимо запомнить, например, в переменной XLApp, объявленной как имеющей тип Variant. Детальное описание всех имеющихся методов и свойств серверов автоматизации обычно имеется в соответствующих файлах справки.

 

Приведем пример обработчика события для кнопки создания отчета.

 

Var

XLApp,Sheet,Colum:Variant;

index,i:Integer;

Begin

XLApp:= CreateOleObject('Excel.Application'); { строка создаёт объект Excel и записывает его в переменную XLApp.}

XLApp.Visible:=true; { строка заставляет запустить сам Excel.}

XLApp.Workbooks.Add(-4167); { добавляем новую рабочую книгу. Число в скобках – это константа, которая означает создание книги и её изменять нельзя. }

XLApp.Workbooks[1].WorkSheets[1].Name:='Отчёт'; { даtv название созданной книге. Это действие не обязательно, но тогда будет название по умолчанию "Лист 1".}

{ Теперь у нас Excel запущен и создана новая книга. Можно переходить к

впечатыванию данных. Но прежде чем это сделать отформатируем колонки и строки. Для этого получаем указатель на колонки рабочей книги Colum.}

Colum:=XLApp.Workbooks[1].WorkSheets['Отчёт'].Columns;

Colum.Columns[1].ColumnWidth:=20; { последовательно изменяем ширину колонок}

Colum.Columns[2].ColumnWidth:=20;

Colum.Columns[3].ColumnWidth:=20;

Colum.Columns[4].ColumnWidth:=20;

Colum.Columns[5].ColumnWidth:=20;

Colum:=XLApp.Workbooks[1].WorkSheets['Отчёт'].Rows; { в ту же переменную записываем указатель на строки рабочей книги и в следующих строках устанавливаем параметры шрифта}

Colum.Rows[2].Font.Bold:=true;

Colum.Rows[1].Font.Bold:=true;

Colum.Rows[1].Font.Color:=clBlue;

Colum.Rows[1].Font.Size:=14;

{Теперь можно выводить данные. Для этого получаем указатель на лист Sheet. Для того, чтобы вывести данные, нужно просто присвоить значение в Sheet.Cells[строка, колонки].

Sheet:=XLApp.Workbooks[1].WorkSheets['Отчёт']; {}

Sheet.Cells[1,2]:='Телефонный справочник';

Sheet.Cells[2,1]:='Фамилия';

Sheet.Cells[2,2]:='Имя';

Sheet.Cells[2,3]:='e-mail';

Sheet.Cells[2,4]:='Город';

Sheet.Cells[2,5]:='Дата рождения';

{Далееработаем с записями таблицы}I

ndex:=3;