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

Методическое пособие 380

.pdf
Скачиваний:
3
Добавлен:
30.04.2022
Размер:
1.08 Mб
Скачать

excel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;

excel.Selection.Borders[xlEdgeBottom].Weight := xlMedium;

//рисуем границы выделенного диапазона правая excel.Selection.Borders[xlEdgeRight].LineStyle :=

xlContinuous;

excel.Selection.Borders[xlEdgeRight].Weight := xlMedium;

//рисуем границы выделенного диапазона вертикальные внутрениие

excel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous;

excel.Selection.Borders[xlInsideVertical].Weight := xlMedium;

//рисуем

границы

выделенного

диапазона

горизонтальные внутрениие

 

 

 

excel.Selection.Borders[xlInsideHorizontal].LineStyle

:=

xlContinuous;

 

 

 

 

excel.Selection.Borders[xlInsideHorizontal].Weight

:=

xlMedium;

 

 

 

 

//автозаполнение выделенного диапазона

//для примера заполним область ячеек 'A10:C10' словом 'привет'

//и размножим его вниз еще на пять ячеек 'A10:C15' excel.WorkBooks[1].WorkSheets[1].Range['A10:C10'].Value

:='привет';

//выделяем диапазон ячеек 'A10:C10' excel.WorkBooks[1].WorkSheets[1].Range['A10:C10'].Select

;

//автозаполняем (копируем) выделенным диапазоном область ячеек 'A10:C15'

61

excel.selection.autofill(excel.WorkBooks[1].WorkSheets[1].R

ange['A10:C15'],xlFillDefault);

//отключаем предупреждения, чтобы не задавал вопросов о сохранении и других

excel.DisplayAlerts := False;

//сохраняем документ в формате Excel 97-2003 excel.ActiveWorkBook.Saveas(GetCurrentDir() +

'\отчет.xls',xlExcel8);

//сохраняем документ в текущем формате Excel 2007 excel.ActiveWorkBook.Saveas(GetCurrentDir() +

'\отчет.xlsx');

//закроем все книги excel.Workbooks.Close;

//закрываем Excel excel.Application.quit;

//освобождаем интерфейсы excel := Unassigned;

Except

//обрабатываем ошибки

showmessage('Внимание! Произошла ошибка при создании

MS Excel приложения');

//закроем все книги excel.Workbooks.Close;

//закрываем Excel excel.Application.quit;

62

//освобождаем интерфейсы excel := Unassigned;

end;

end;

При работе с листом Excel мы можем использовать следующие варианты:

-работать с областью Range['B3:D3'];

-работать с ячейкой Cells[2, 4] где 2 - ряд, 4 - колонка;

-работать с рядами Rows[1] или с диапазоном рядов

Rows['1:5'];

-работать с колонками Columns[1] или диапазоном колонок Columns['A:I'];

Range['A1'] и Cells[1, 1] обозначают одно и тоже.

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

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

Например так:

//закроем все книги excel.Workbooks.Close;

//закрываем Excel excel.Application.quit;

//освобождаем интерфейсы

sheet:=Unassigned; //интерфейс листа если он был создан

63

WorkBook := Unassigned;//интерфейс рабочей книги если он был создан

excel := Unassigned;//интерфейс самого предложения если он был создан

end;

На рисунке 2 представим пример вывода в Excel из Delphi таблицы умножения. Ниже представим код с подробными комментариями.

Рис. 2. Визуальное представление запрограммированной кнопки

Рис. 3. Результат работы программы

64

unit Unit1; interface uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, comobj, StdCtrls, Excel_TLB;

type

TForm1 = class(TForm) Button1: TButton;

procedure Button1Click(Sender: TObject); private

{Private declarations } public

{Public declarations } end;

var

Form1: TForm1;

excel: variant; // Переменная в которой создаётся объект EXCEL

MyData: variant; // Переменная в которой формируется таблица умножения

i,j:integer; implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); begin

try

// Обьект EXCEL

excel := CreateOleObject('Excel.Application');

//Чтоб не задавал вопрос о сохранении документа excel.DisplayAlerts := false;

//новый документ

65

excel.WorkBooks.Add;

//объявляем вариантный массив

MyData := VarArrayCreate([1,9,1,9],varVariant); for I := 1 to 9 do

for J := 1 to 9 do MyData[i,j]:=i*j;

// Обьединяем ячейки 'A1:I1' excel.WorkBooks[1].WorkSheets[1].Range['A1:I1'].Merge; //Пишем заголовок excel.WorkBooks[1].WorkSheets[1].Range['A1'].Value:='Та

блица умножения'; // Выравнивам заголовок по центру

excel.WorkBooks[1].WorkSheets[1].Range['A1'].HorizontalA lignment := xlCenter;

// задаем ширину колонок с A по I excel.WorkBooks[1].WorkSheets[1].Columns['A:I'].Column

Width := 3;

//выделяем область таблицы умножения ['A2:I10'] и рисуем границы

excel.WorkBooks[1].WorkSheets[1].Range['A2:I10'].select; //рисуем границы выделенного диапазона левая excel.Selection.Borders[xlEdgeLeft].LineStyle :=

xlContinuous; // стиль линии сплошная excel.Selection.Borders[xlEdgeLeft].Weight := xlThin;//

толщина линии //рисуем границы выделенного диапазона верхняя

excel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;

excel.Selection.Borders[xlEdgeTop].Weight := xlThin; //рисуем границы выделенного диапазона нижняя excel.Selection.Borders[xlEdgeBottom].LineStyle :=

xlContinuous;

excel.Selection.Borders[xlEdgeBottom].Weight := xlThin;

66

//рисуем границы выделенного диапазона правая excel.Selection.Borders[xlEdgeRight].LineStyle :=

xlContinuous;

excel.Selection.Borders[xlEdgeRight].Weight := xlThin; //рисуем границы выделенного диапазона вертикальные

внутрениие

excel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous;

excel.Selection.Borders[xlInsideVertical].Weight := xlThin; //рисуем границы выделенного диапазона

горизонтальные внутрениие excel.Selection.Borders[xlInsideHorizontal].LineStyle :=

xlContinuous; excel.Selection.Borders[xlInsideHorizontal].Weight :=

xlThin;

//присваиваем диапазону ['A2:I10'] значения вариантного массива MyData это значительно ускоряет работу, нежели вывод по //ячеечно

excel.WorkBooks[1].WorkSheets[1].Range['A2:I10'].Value:=

MyData;

// Делаем его видимым excel.Visible := true; //освобождаем интерфейсы

MyData:= Unassigned; excel := Unassigned; Except

showmessage('Внимание! Произошла ошибка при создании

MS Excel приложения'); //закрываем Excel excel.Application.quit; //освобождаем интерфейсы

MyData:= Unassigned; excel := Unassigned; end;

end;

end.

67

7. РАБОТА С БАЗАМИ ДАННЫХ В DELPHI 7

7.1. Delphi и базы данных

Имеются несколько основных компонент (объектов), которые Вы будете использовать постоянно для доступа к БД. Эти объекты могут быть разделены на три группы:

-невизуальные: TTable, TQuery, TDataSet, TField

-визуальные: TDBGrid, TDBEdit

-связующие: TDataSource

Первая группа включает невизуальные классы, которые используются для управления таблицами и запросами. Эта группа сосредотачивается вокруг компонент типа TTable, TQuery, TDataSet и TField. В Палитре Компонент эти объекты расположены на странице BDE.

Вторая важная группа классов - визуальные, которые показывают данные пользователю и позволяют ему просматривать и модифицировать их. Эта группа классов включает компоненты типа TDBGrid, TDBEdit, TDBImage и TDBComboBox. В Палитре Компонент эти объекты расположены на странице Data Controls.

Имеется и третий тип, который используется для того, чтобы связать предыдущие два типа объектов. К третьему типу относится только невизуальный компонент TDataSource.

7.2. Класс TDataSet

TDataSet класс - один из наиболее важных объектов БД. Чтобы начать работать с ним, Вы должны взглянуть на иерархию, показанную на рисунке 4.

TDataSet содержит абстрактные методы там, где должно быть непосредственное управление данными. TDBDataSet знает, как обращаться с паролями и то, что нужно сделать, чтобы присоединить Вас к определенной таблице. TTable знает (т.е. уже все абстрактные методы переписаны) как обращаться с таблицей, ее индексами и т.д.

68

Рис. 4, Иерархия класса TDataSet

TDataSet - инструмент, который Вы будете использовать чтобы открыть таблицу и перемещаться по ней. Конечно, Вы никогда не будете непосредственно создавать объект типа TDataSet. Вместо этого Вы будете использовать TTable, TQuery или других потомков TDataSet (например, TQBE).

На наиболее фундаментальном уровне Dataset это просто набор записей. Обычно в программе используются объекты типа TTable или TQuery, поэтому в следующих нескольких главах будет предполагаться существование объекта типа

TTable называемого Table1.

Итак, самое время начать исследование TDataSet. Как только Вы познакомитесь с его возможностями, Вы начнете понимать, какие методы использует Delphi для доступа к данным, хранящимся на диске в виде БД. Ключевой момент здесь - не забывать, что почти всякий раз, когда программист на Delphi открывает таблицу, он будет использовать TTable или TQuery, которые являются просто некоторой надстройкой над TDataSet.

7.3. Открытие и закрытие DataSet

Если Вы используете TTable для доступа к таблице, то при открытии данной таблицы заполняются некоторые свойства TTable (количество записей RecordCount, описание структуры таблицы и т.д.).

69

Прежде всего, Вы должны поместить во время дизайна на форму объект TTable и указать, с какой таблицей хотите работать. Для этого нужно заполнить в Инспекторе объектов свойства DatabaseName и TableName. В DatabaseName можно либо указать директорию, в которой лежат таблицы в формате dBase или Paradox (например, C:\DELPHI\DEMOS\DATA),

либо выбрать из списка псевдоним базы данных (DBDEMOS). Псевдоним базы данных (Alias) определяется в утилите

Database Engine Configuration. Теперь, если свойство Active

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

Имеются два различных способа открыть таблицу во время выполнения программы. Вы можете написать следующую строку кода:

Table1.Open;

Или, если Вы предпочитаете, то можете установить свойство Active, равное True:

Table1.Active := True;

Нет никакого различия между результатом, производимым этими двумя операциями. Метод Open, однако, сам заканчивается установкой свойства Active в True, так что может быть даже чуть более эффективно использовать свойство Active напрямую.

Также как имеются два способа открыть таблицу, так и есть два способа закрыть ее. Самый простой способ просто вызывать Close:

Table1.Close;

Или, если Вы желаете, Вы можете написать:

Table1.Active:= False;

70