1. ИНТЕРФЕЙС DRAG&DROP
Операционная система Windows широко использует специальный прием связывания программ с данными, который называется Drag&Drop (перетащи и отпусти). Такой прием в Проводнике Windows используется для копирования или перемещения файлов. В Delphi реализован собственный интерфейс Drag&Drop, позволяющий компонентам обмениваться данными путем “перетаскивания» их мышью. Этот интерфейс определяется двумя свойствами и тремя событиями, доступными каждому видимому компоненту.
Свойство
property DgagMode: TDragMode;
TGragMode = (dmManual, dmAutomatic);
Определяет, как будет выполняться весь комплекс действий, связанных с Drag&Drop: dmManual — вручную (программой); dmAutomatic — автоматически (свойствами и методами компонентов). Во всех случаях программист должен написать обработчики этих событий.
Свойство
Property DradCursor: 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 и записывает его в переменную XLAp p. }
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;