Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб.работы по программированию

.pdf
Скачиваний:
30
Добавлен:
21.05.2015
Размер:
1.07 Mб
Скачать

AutoConnect: Boolean—определяет, загружать (true) или нет (false) сервер при запуске приложения;

AutoQuit: Boolean— определяет, разрывать (true) или нет (false) связь с сервером при завершении работы приложения;

ConnectKind: TConnectKind — определяет способ установки соединения с сервером. Это свойство может принимать следующие значения:

ckRunningOrNew – если приложение-сервер уже выполняется, то производится подключение к запущенной программе, иначе запускается новый экземпляр;

сkNewInstance – всегда создается новый экземпляр сервера;

ckRunningInstance – подключение к уже запущенному серверу;

ckRemote – подключение к удаленному серверу.

RemoteMachineName – сетевое имя компьютера, на котором расположен

сервер.

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

With WordApplication1 do

Begin

Connect;

Visible:=True; Documents.Add(EmptyParam, EmptyParam);

Selection.InsertAfter(’Вводим текст в новый документ’); Quit;

Disconnect; end;

Отметим, что большинство параметров методов имеют тип OleVariant, а для пустых параметров используется специальное значение EmptyParam.

Рассмотрим взаимодействие с MS Word. Основной объект, представляющий программу Word WordApplication. Его основные свойства:

Visible: Boolean – если false, то программа будет невидима;

ActiveDocument: Document – ссылка на активный документ;

Documents: Documents – список открытых документов;

Selection: Selection – выделенный фрагмент текста или текущая позиция курсора.

Для выхода из программы используется метод Quit, для печати документа –

PrintOut.

© ИМПИ ОГПУ

Массив документов Documents содержит свойство Count: Integer – количество документов и методы:

Add(Var Template, NewTemplate: OleVariant) – создание нового документа. Необязательные параметры задают имя шаблона и логическое значение, которое задает, является ли создаваемый документ шаблоном;

Open(var FileName: OleVariant,…) – открывает файл. Кроме первого параметра – переменной, задающей имя файла, – требует еще девять параметров, которые задают различные режимы открытия файла. Обычно все они

равны EmptyParam.

Save( var NoPromt, Format: OleVariant) – сохраняет открытые документы. Если первый параметр равен true, то не будет выдан запрос на сохранение документа. Второй параметр задает формат сохраняемого документа.

Close(var SaveChanges, Format, RouteDocument: OleVariant)

закрывает все документы.

Item(var Index: OleVariant): Document – возвращает ссылку на документ. Index – его порядковый номер. Документы нумеруются с единицы.

С каждым документом Word можно работать как с объектом класса

TWordDocument.

Для этого компонент WordDocument нужно присоединить к одному из открытых документов вызовом метода ConnectTo(D: Document). Например, для присоединения к активному документу вызываем

WordDocument1.ConnectTo(WordApplication1.ActiveDocument);

Компонент содержит следующие основные свойства:

Content: Range – объект, содержащий весь текст документа;

Name: WideString – имя документа;

Paragraphsсодержит все абзацы документа;

Tables – содержит все таблицы документа.

Также компонент содержит методы Save и Close, аналогичные методам объекта Documents, метод PrintOut для печати документа.

Метод Range(var Start, End_: OleVariant): Range возвращает объект типа Range, содержащий фрагмент текста, начиная с символа с номером Start и заканчивая символом с номером End_.

© ИМПИ ОГПУ

Для ввода и форматирования текста в MSWord используются свойства и методы объектов Paragraph, Range, Selection.

Объект Paragraph – элемент объекта Paragraphs, который является одним из свойств WordDocument. У объекта Paragraphs есть методы:

Add(var Range: OleVariant): Paragraph – добавление абзаца.

Необязательный параметр Range задает фрагмент текста, перед которым будет добавлен абзац. Если этот параметр равен EmtyParam, то абзац добавляется в конец документа.

Item (Index: integer): Paragraph – возвращает абзац, имеющий номер Index.

У объекта Paragraph есть свойства, задающие параметры форматирования абзаца:

Alignment – способ выравнивания текста абзаца. Может принимать значения :

 

o

wdAlignParagraphCenter,

 

o

wdAlignParagraphLeft,

 

o

wdAlignParagraphRight,

 

o

wdAlignParagraphJustify;

 

FirstLineIndent: Real – отступ красной строки в пунктах;

 

LeftIndent, RightIndent: Real – левый и правый отступы;

и т. д.

Объект Selection задает выделенную область текста. Он имеет следующие основные свойства:

Range – содержит выделенный фрагмент. Может использоваться для установки параметров шрифта;

Text: String – собственно текст;

Font – шрифт, с ним может быть связан специальный компонент Delphi

WordFont;

Start, End_ – начальный и конечный символ выделения;

и методы:

TypeText(Text: WideString) – вставляет текст вместо выделения, при этом новый текст не выделяется;

InsertBefore(Text: WideString)

иInsertAfter(Text: WideString) – вставляют текст до или после выделения, при этом текст включается в выделение.

© ИМПИ ОГПУ

Объект Range также содержит свойства Font, Start, End_ и методы

InsertAfter, InsertBefore, а также дополнительные свойства Bold, Italic: Integer – равны единице, если включена жирность или наклон и нулю, если выключены.

Объект Font (свойство у Selection или у Range) содержит свойства шрифта,

в том числе Bold, Italic, Size: integer – размер шрифта, Name:

WideString – имя шрифта и другие.

Для работы с таблицами используется свойство Tables объекта

WordDocument. Добавляется таблица методом Add (Range: Range; NumRows, NumCols: integer); где Range – фрагмент текста, в котором создается таблица, NumRows и NumCols – количества строк и столбцов. Метод Item(index: Integer): Table возвращает таблицу с номером Index.

Для работы с ячейкой таблицы используется метод Cell(Row, Column: integer): Cell, возвращающий ячейку таблицы – объект Cell.

Текст ячейки таблицы можно получить с помощью свойства Range объекта Cell. Метод Select выделяет ячейку таблицы. Таким образом, при заполнении таблицы можно применить любой из двух способов:

использовать методы InsertBefore или InsertAfter объекта

Cell(i,j).Range;

вызвать метод Cell(i,j).Select, а затем использовать для ввода методы объекта Selection.

Пример: Добавим в активный документ таблицу умножения в место, где стоит курсор.

With WordApplication1 do begin

ActiveDocument.Tables.Add(Selection.Range, 9, 9);

For i := 1 to 9 do For j := 1 to 9 do

ActiveDocument.Tables.Item(1).Cell(i,j).Range.InsertBefore(IntToStr(i*j))

End;

Задания для самостоятельной работы

1.Создать в MS Word новый документ, добавить туда заголовок (выровненный по центру полужирным начертанием), напечатать в следующей строке свои фамилию

иимя, сохранить под именем MyName.doc и закрыть MS Word.

2.Открыть документ MyName.doc, добавить в конец документа таблицу квадратов чисел от 0 до 99.

© ИМПИ ОГПУ

Лабораторная работа 32. Обмен данными между программами с помощью DDE

DDE (Dynamic Data Exchange) – механизм обмена данными (текстовыми строками) между программами. При этом одна из программ выступает в качестве сервера и по запросу предоставляет данные программам-клиентам. Технологию DDE поддерживает большинство программ Windows, в том числе Microsoft Excel. В Delphi есть специальные компоненты для реализации DDE. Компонент DDEClientConv (закладка System) используется в клиентских программах, компонент

DDEServerConv (закладка System) – в серверных.

Рассмотрим взаимодействие клиентских программ созданных в Delphi с Microsoft Excel. В клиентской программе компонент DDEClientConv необходимо связать с программой-сервером. Для этого нужно заполнить свойства DDEService – название программы-сервера и DDETopic – имя объекта, с которым происходит обмен информацией (для Excel это будет имя листа в книге). Значения свойств можно заполнить автоматически, скопировав в буфер обмена любую ячейку листа, а затем вставив в режиме редактирования значения DDEService содержимое буфера с помощью кнопки Paste Link.

Далее для пересылки строки

на

сервер

используется метод

function PokeData(Item: String;

Data:

PChar):

boolean. Функция

помещает строку Data в раздел данных Item в программу-сервер. Результат функции true, если пересылка произошла успешно. Отметим, что для Excel

разделом данных является ячейка,

у

которой

указывается адрес в

формате

R<номер строки>C<номер столбца>.

Обратите

внимание

на необходимость

преобразования типа String в тип PChar.

 

 

 

Пример: DDEClientConv1.PokeData(’R2C3’, Pchar(Edit1.Text));

Чтобы

получить информацию

от

сервера

используется

метод

function

RequestData(Item:

String):

PChar.

Функция возвращает

строку данных, которая находится в программе-сервере в заданном разделе данных.

В Delphi имеется также компонент DDEClientItem, который связывает клиентскую программу с конкретным разделом данных в программе-сервере. У компонента DDEClientItem необходимо заполнить поля DDEConv – указатель на компонент DDEClientConv и DDEItem – имя раздела данных. После этого не требуется постоянно вызывать методы для получения информации от сервера. Информация при изменении раздела данных в серверной программе будет автоматически обновляться в свойствах Lines и Text объекта DDEClientItem. Также при изменении раздела данных возникает событие OnChange, которое можно обработать.

© ИМПИ ОГПУ

Задания для самостоятельной работы

1.Напишите программу, которая будет передавать в Excel коэффициенты квадратного уравнения и получать обратно значения корней. Решение уравнения произвести в Excel

2.Напишите программу, которая с помощью Excel вычисляет определитель 5- го порядка. Данные в программе вводятся с помощью StringGrid.

3.Напишите программу, которая выводит содержимое произвольной таблицы БД Access в компонент Memo. Связь с таблицей установите, скопировав через буфер обмена имя таблицы. Для доступа к данным используйте раздел данных с названием Data. Чтобы отдельные записи выводились в разных строках, в компоненте

DDEClientConv установите у свойства FormatChars значение true. Найдите в справке Access, какие еще разделы данных (DDE Items) можно использовать из других программ и попробуйте обратиться к ним из своей программы.

Лабораторная работа 33. Технология Drag & Drop

Интерфейс переноса и приема компонентов появился достаточно давно. Он обеспечивает взаимодействие двух элементов управления во время выполнения приложения. При этом могут выполняться любые необходимые операции. Несмотря на простоту реализации и давность разработки, многие программисты (особенно новички) считают этот механизм малопонятным и экзотическим. Тем не менее, использование Drag-and-Drop может оказаться очень полезным и удобным.

Для того чтобы механизм заработал, требуется настроить соответствующим образом два элемента управления. Один должен быть источником (Source), второй

— приёмником (Target). При этом источник никуда не перемещается, а только регистрируется в качестве такового в механизме.

Примечание: один элемент управления может быть одновременно источником и приёмником.

Пользователь помещает указатель мыши на нужный элемент управления, нажимает левую кнопку мыши и, не отпуская её, начинает перемещать курсор ко второму элементу. При достижении этого элемента пользователь отпускает кнопку мыши. В этот момент выполняются предусмотренные разработчиком действия. При этом первый элемент управления является источником, а второй — приёмником.

После выполнения настройки механизм включается и реагирует на перетаскивание мышью компонента-источника в приёмник. Группа методовобработчиков обеспечивает контроль всего процесса и служит для хранения исходного кода, который разработчик сочтёт нужным связать с перетаскиванием. Это может быть передача текста, значений свойств (из одного редактора в другой можно передать настройки интерфейса, шрифта и сам текст); перенос файлов и изображений; простое перемещение элемента управления с места на место и т. д. Пример реализации Drag-and-Drop в Windows — возможность переноса файлов и папок между дисками и папками.

© ИМПИ ОГПУ

Таким образом, можно придумать множество областей применения механизма Drag-and-Drop. Его универсальность объясняется тем, что это всего лишь средство связывания двух компонентов при помощи указателя мыши. А конкретное наполнение зависит только от фантазии программиста и поставленных задач.

Весь механизм Drag-and-Drop реализован в базовом классе TControl, который является предком всех элементов управления. Рассмотрим суть механизма.

Любой элемент управления из Палитры компонентов Delphi может являться источником в механизме Drag-and-Drop. Его поведение на начальном этапе переноса зависит от значения свойства DragMode.

Значение dmAutomatic обеспечивает автоматическую реакцию компонента на нажатие левой кнопки мыши и начало перетаскивания — при этом механизм включается самостоятельно.

Значение dmManual (установлено по умолчанию) требует от разработчика обеспечить включение механизма вручную. Этот режим используется в том случае, если компонент должен реагировать на нажатие левой кнопки мыши как-то иначе. Для инициализации переноса используется метод

procedure BeginDrag(Immediate: Boolean; Threshold: Integer = -1);

Параметр immediate = True обеспечивает немедленный старт механизма. При значении False механизм включается только при перемещении курсора на расстояние, определенное параметром Threshold.

О включении механизма сигнализирует указатель мыши — он изменяется на курсор, определенный в свойстве DragCursor.

Еще раз напомним, что источник при перемещении курсора не изменяет собственного положения, и только в случае успешного завершения переноса сможет взаимодействовать с приёмником.

Приёмником может стать любой компонент, в котором создан метод-обработчик

Procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);

Он вызывается при перемещении курсора в режиме Drag-and-Drop над этим компонентом. В методе-обработчике можно предусмотреть селекцию источников переноса по нужным атрибутам.

Если параметр Accept получает значение True, то данный компонент становится приёмником. Источник переноса определяется параметром Source. Через этот параметр разработчик получает доступ к свойствам и методам источника.

© ИМПИ ОГПУ

Текущее положение курсора задают параметры X и Y. Параметр State возвращает информацию о характере движения мыши:

dsDragEnter — указатель появился над компонентом; dsDragLeave — указатель покинул компонент; dsDragMove — указатель перемещается по компоненту.

Приемник должен предусматривать выполнение некоторых действий в случае, если источник завершит перенос именно на нём. Для этого используется методобработчик OnDragDrop, который вызывается при отпускании левой кнопки мыши на компоненте-приёмнике. Доступ к источнику и приёмнику обеспечивают параметры Source и Sender соответственно. Координаты мыши возвращают параметры X и Y.

При завершении переноса элемент управления — источник — получает соответствующее сообщение, которое обрабатывается методом OnEndDrag. Источник и приёмник определяются параметрами Sender и Target соответственно. Координаты мыши определяются параметрами X и Y.

Для программной остановки переноса можно использовать метод источника EndDrag (при обычном завершении операции пользователем он не используется). Параметр Drop = True завершает перенос. Значение False прерывает перенос.

Рассмотрим небольшой пример. В проекте DemoDragDrop на основе механизма Drag-and-Drop реализована передача текста между текстовыми редакторами и перемещение панелей по форме.

© ИМПИ ОГПУ

Задания для самостоятельной работы

Напишите программу, позволяющую перетаскивать строки из одного списка строк в другой. При этом перетаскиваемая строка должна удаляться из исходного списка.

Примечание: для определения позиции вставки необходимо использовать метод ItemAtPos класса TListBox, который возвращает номер строки в списке.

Лабораторная работа 34. Использование динамически подключаемых библиотек (DLL).

Динамически подключаемая библиотека (DLL) – файл, содержащий процедуры и функции, которые могут использоваться в других библиотеках и программах. При этом эти процедуры и функции не помещаются в программу, а непосредственно вызываются из DLL. Преимущества DLL – экономия оперативной и дисковой памяти, возможность использования различных языков программирования в одном проекте. В Delphi DLL создается как отдельный проект, который может использовать модули и формы, как обычный проект. Создается библиотека выбором меню File- New…-New DLL.

Структура DLL:

library <имя библиотеки> uses <используемые модули> <описание процедур и функций>

exports < список имен экспортируемых процедур и функций> begin

<операторы, выполняющиеся при подключении библиотеки>

end.

В именах процедур и функций прописные и строчные буквы различаются. Возможно переименовать процедуру или функцию – для этого в списке экспортируемых процедур после слова exports пишется <имя процедуры> name ‘<новое имя>’

После компиляции будет создан файл mylibrary.dll. Компиляция осуществляется посредством комбинаций клавиш Ctrl+F9. Для использования описанной функции в другом модуле Delphi ее необходимо описать – указать заголовок, после которого записать слово external ‘<имя DLL>’.

Например:

Function Summa(a,b:integer):integer; external ‘mylibrary.dll’;

© ИМПИ ОГПУ

В DLL могут храниться формы. Для вызова формы DLL должна содержать процедуру, которая создает форму, вызывая конструктор, показывает ее, а затем удаляет из памяти.

Из модуля основной программы теперь просто вызываем 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.

Задания для самостоятельной работы

1.Напишите DLL, содержащую функцию вычисления минимума двух чисел. Используйте ее в программе, загружая статически и динамически.

2.Напишите DLL, содержащую форму со сведениями об авторе программы. Используйте ее в программе, загружая статически и динамически.

3.Напишите DLL, содержащую функцию перевода целого числа от 0 до 1000 в запись словами на русском языке. Используйте ее в программе, загружая статически и динамически.

©ИМПИ ОГПУ