Excel. Трюки и эффекты
Шрифт:
Листинг 9.5.
Сохранение документа Microsoft Word
procedure TFormWord.bnSaveClick(Sender: TObject);
begin
//Сохранение документа
Wrd.ActiveDocument.SaveAs(ExtractFilePath(Application.EXEName) +
\'_result.DOC\');
end;
Сохранение осуществляется путем вызова MeTOflaSaveAs объекта ActiveDocument, который в качестве параметра принимает путь к файлу. После нажатия кнопки сохранения документ с текстом будет записан в файл (result. doc) каталога, из которого была запущена программа.
Процедура завершения работы основана на вызове метода Quit (листинг 9.6).
Листинг 9.6.
Завершение
procedure TFormWord.bnExitWordClick(Sender: TObject);
begin
//Завершение приложения
Wrd.Quit;
end;
Рассмотренное приложение является примитивным контроллером автоматизации и может служить отправной точкой создания более сложных и функциональных программ автоматического составления отчетов и т. п.
Далее приступим к созданию приложения, которое будет подключаться к серверу COM Microsoft Word и выводить текст, дату и время вывода этого текста в активный документ при его смене (переключении между документами). На этот раз мы воспользуемся компонентами WordDocument и WordApplication с вкладки Servers.
Создаем новый проект и на главную форму приложения помещаем компоненты WordDocument nWordApplication. Далее устанавливаем CBoftcTBoConnectKind компонента Wo г dApp licationBc kRunni ng I ns t anc e, а также значение свойства AutoConnect в True. В данном случае приложение Microsoft Word создаваться не будет, а программа подключится к уже существующему серверу. Основную практическую ценность для нас представляет механизм определения активного документа и добавление в него текста, даты и времени (листинг 9.7).
Листинг 9.7.
Реакция на смену активного документа
procedure TFormActiveWord.WordApplicationActiveDocumentChange
(Sender: TObject);
begin
//Подключаемся к текущему документу
WordDocumentNew.ConnectTo( WordApplicationActive.ActiveDocument);
//Контроллер добавляет новую строку в текущий документ
WordDocumentNew.Range.InsertAfter(#13#10+\'Переход к документу\'+#13#10+
WordApplicationActive.ActiveDocument.Get_FullName+\' произведен :\'+ DateTimeToStr(Now));
end;
Как вы заметили, подключение к уже существующему серверу происходит каждый раз после смены активного документа. В этот момент в содержимое документа записывается информация: текстовая строка, дата и время перехода к этому документу.
Чтобы просмотреть работу этого приложения, запустите Microsoft Word и создайте в нем два документа. Запустите созданный пример и поочередно активизируйте документы (щелчком кнопкой мыши на Панели задач).
Трюки в Microsoft Excel
Не менее популярным и функциональным приложением из пакета Microsoft Office является Microsoft Excel. Это программа для работы с электронными таблицами. Как и уже знакомое нам приложение Microsoft Word, Microsoft Excel также обладает возможностью создания и редактирования документов (в данном случае таблиц) посредством СОМ. Преимущества использования Microsoft Excel из других программ очевидны, так как она предоставляет широкий спектр возможностей по построению диаграмм, графиков, произведению различных расчетов и пр. Поэтому в качестве примера создадим приложение, которое будет выполнять запуск Microsoft Excel, добавление новой книги, создание листа и помещение в его ячейки текста и формул.
Как и в случае с Microsoft Word, будет использоваться объект THnaOleVariant. Но методы и свойства СОМ-сервера поменяются. Рассмотрим исходный текст приложения для выполнения несложных операций с сервером Microsoft Excel (листинг 9.8).
Листинг 9.8.
Работа с Microsoft Excel
unit COMinExcel;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,
Dialogs,
//Включаем модуль работы с COM-объектами
ComObj;
type
TFormCOMExcel = class(TForm)
//Процедура,
procedure FormCreate(Sender: TObject);
//Процедура, вызываемая при завершении работы приложения
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormCOMExcel: TFormCOMExcel;
//Объявление объекта OleVariant с именем Microsoft Excel
Excel: OleVariant;
implementation
{$R *.dfm}
procedure TFormCOMExcel.FormCreate(Sender: TObject);
begin
//Инициализируем объект
Excel := CreateOleObject(\'Excel.Application\');
//Устанавливаем видимым окно приложения Microsoft Excel
Excel.Visible := true;
//Добавляем новую книгу
Excel.Application.Workbooks.Add;
//Вводим текст в ячейку с индексом E5
Excel.Application.Worksheets.Item[\'Лист1\'].
Cells.Item[5,5].FormulaR1C1 := \'! ТЕКСТ !\
//Задаем характеристики шрифта
Excel.Application.Worksheets.Item[\'Лист1\'].
Cells.Item[1,1].Font.Bold := true;
//В ячейку с индексом A1 записываем формулу
Excel.Application.Worksheets.Item[\'Лист1\'].
Cells.Item[1,1].FormulaR1C1 := \'=18*2\
end;
procedure TFormCOMExcel.FormDestroy(Sender: TObject);
begin
//Закрываем приложение Microsoft Excel
Excel.Quit;
end;
end.
Предложенный листинг демонстрирует основы удаленного управления приложением Microsoft Excel. Запуск Microsoft Excel, заполнение ячеек новой таблицы происходит в функции FormCreate.
Во время создания главной формы приложения-примера на экране появится окно программы Microsoft Excel с числом в ячейке с индексом А1 и текстом в ячейке с индексом Е5. Хотя в ячейку с индексом А1 мы записывали =18*2, на экране в этой ячейке будет отображаться 32, так как Microsoft Excel автоматически преобразует выражения в ячейках.
Глава 10 Окна других приложений
• Ловушки Windows
• Программа «Оконный шпион»
Здесь мы будем использовать сведения, приведенные в предыдущих главах (а точнее, в главах 1, 2 и 8), для построения программы, позволяющей проводить различные операции с окнами приложений. Вы также дополнительно познакомитесь с техникой применения ловушек (hook) в Windows и увидите пример реального использования проецирования файла в память для обмена данными между несколькими приложениями. Причем второе в нашем примере обусловлено особенностью работы ловушек, следящих за работой других приложений. Вы также узнаете, как перечислять все открытые окна и, соответственно, получать к ним доступ. Но обо всем по порядку.
10.1. Ловушки Windows
Из предыдущих глав вам должен быть понятен или, по крайней мере, известен механизм, который используется Windows для управления окнами приложений, – сообщения. Вероятно, большая мощь этого механизма и в то же время его уязвимость состоят в возможности посылки сообщений любым окнам (окнам одного процесса или окнам других процессов).
В Windows также предусмотрен мощный механизм, позволяющий следить за некоторыми важными событиями в системе и, конечно, производить мониторинг сообщений, получаемых различными окнами. Речь идет об установке так называемых ловушек. Ловушка представляет собой функцию, вызываемую при возникновении определенного события, например перед получением каким-либо окном нового сообщения, при нажатии клавиши, записи события в системный журнал и т. д.: все зависит от того, для каких событий разработчики предусмотрели ловушки. Интересен тот факт, что в Windows предусмотрены даже ловушки для отладки других ловушек.
Мы рассмотрим некоторые наиболее простые виды ловушек, перехватывающих сообщения окон. По глобальности действия рассмотренные нами ловушки являются устанавливаемыми на отдельный поток: при ошибке в функции-ловушке это безопаснее для системы.
Начинается создание ловушки с написания собственно функции-ловушки, имеющей следующий прототип:
function HookProc(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT stdcall;