
Получить результат в виде
Представить результат выполнения программы преподавателю.
Занести в отчет результат выполнения программы и исходные данные.
Выполнить представленные задания.
Закончить работу с системой Delphi.
Варианты заданий:
-
Дан массив А размером m*m. сформировать массив В из сумм элементов каждой строки.
Дан массив А размером m*n. сформировать массив NS из номеров строк, в которых имеются отрицательные элементы.
Дан целочисленный массив А размером m*n. сформировать одномерные массивы В и С, содержащие соответственно четные и нечетные элементы массива А.
Лабораторная работа №4
Создание объектов в среде Delphi. Изменение свойств объектов.
Цель занятия:
Освоение принципов создания и использования простейших объектов в среде Delphi.
Изучение свойств инспектора объектов.
Получение практических навыков работы объектно-ориентированного программирования.
Вопросы для коллоквиума.
Укажите основные составные части Delphi.
Дайте определение Редактору форм.
Укажите назначение палитры компонент.
Для чего предназначен Редактор кода.
Порядок выполнения работы.
Загрузить систему Delphi.
Создайте новый проект. Создайте новую паку и сохраните в ней модуль главной формы под именем Unit1.pas, а проект под именем Project1.dpr.
Выберите из меню Project пункт View Source, чтобы увидеть исходный код проекта:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Всё это ничто иное, как содержимое файла Project1.dpr. Первой строкой стоит имя программы program Project1. В этой строке ничего менять нельзя. После этого идёт уже знакомый раздел uses в котором можно подключать необходимые модули. У нас подключен модуль Forms (позволяет работать с формами) и Unit1 (модуль главного окна).
Между begin и end выполняется три строчки:
Application.Initialize – запускает инициализацию приложения. Убирать не рекомендуется.
Application.CreateForm (TForm1, Form1) – метод CreateForm инициализирует форму. У него два параметра – имя объекта и имя переменной, которая в последствии будет указывать на созданный объект. В нашем случае это имя формы TForm1 и имя переменной Form1. Переменная Form1 автоматически описывается в модуле объекта TForm1 (в нашем случае это модуль Unit1.pas) в разделе var:
var
Form1: TForm1;
Application.Run – после инициализации всех форм можно запускать выполнение программы с помощью метода Run объекта Application. Здесь везде используется объект Application. Этот объект всегда существует в программах в единственном экземпляре и создаётся здесь с помощью строки Application.Initialize.
Теперь создайте новую форму File->New->Form и сохраните её под именем Unit2.pas. Посмотрите на исходник проекта, он должен быть уже таким:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
В раздел uses добавилось объявление нового модуля, а между begin и end появился код создания новой формы.
Теперь войдите в свойства проекта (из меню Project нужно выбрать пункт Option). На закладке Forms, в списке Auto-create forms у нас описано две формы. Выделите Form2 и перенесите её в список Available forms. Закройте окно свойств кнопкой ОК и посмотрите на исходник проекта. Строка инициализации второй формы исчезла. Это потому что мы перенесли её из списка автоматически создаваемых форм в список доступных форм. Теперь, чтобы использовать Form2, мы её должны сначала создать. Чтобы дальше можно было удобнее работать, переименуйте главную форму Form1 в MainForm, а вторую форму Form2 в SplashForm (используйте свойство формы Name).
Для того чтобы модули проекта были взаимосвязаны («узнавали друг друга») добавьте в разделе описаний модулей Uses первой формы (Unit1) модуль второй формы Unit2.
Бросьте на главную форму кнопку и по её нажатию напишите следующий код:
procedure TMainForm.Button1Click(Sender: TObject);
begin
Application.CreateForm(TSplashForm, SplashForm);
SplashForm.ShowModal;
SplashForm.Free;
end;
Здесь, в первой строке кода мы инициализируем форму SplashForm. Во второй, созданное окно выводиться на экран. И в последней строке окно уничтожается.
Второй способ создания окон:
procedure TMainForm.Button1Click(Sender: TObject);
begin
SplashForm:=TSplashForm.Create(Owner);
SplashForm.ShowModal;
SplashForm.Free;
end;
Здесь мы присваиваем в переменную SplashForm результат вызова метода Create объекта TSplashForm. Этому методу нужно передать только один параметр – владельца окна. Если владельца нет, то можно передавать nil, а в нашем случае передаем Owner – свойство, в котором храниться указатель на текущее окно. Если главным окном должно быть не текущее окошко, то нужно указать имя объекта – Form1.Owner.
Сделаем так, чтобы наше окно SplashForm, появлялось на время загрузки программы. Для этого зайдите в исходник проекта и подкорректируйте его до следующего вида:
begin
SplashForm:=TSplashForm.Create(nil);
SplashForm.Show;
SplashForm.Repaint;
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Sleep(1000);
SplashForm.Hide;
SplashForm.Free;
Application.Run;
end;
Рассмотрим этот код построчно:
Создаем окно SplashForm. У этого окна нет владельца, поэтому в качестве параметра методу Create указываем значение nil.
Отображаем окно на экране не модально.
Перерисовать окно с помощью вызова метода Repaint.
Инициализация приложения.
Создаётся форма TMainForm.
Делаем задержку, чтобы окно SplashForm могло хоть немного повисеть на экране. Для этого я используем процедуру Sleep, а в качестве параметра указываем время задержки в миллисекундах. Одна секунда равна 1000 миллисекунд. Для использования этой функции в раздел uses нужно добавить модуль Windows.
Прячем форму SplashForm, вызовом метода Hide.
Уничтожаем окно.
Запускаем приложение.
Запустите программу, и вы сначала увидите окно SplashForm (поместите на него текст TLabel c надписью «Идёт загрузка»), а потом уже появиться главное окно.
Когда создаются окна (вызывается CreateForm), то программа выполняет обработчики события OnCreate всех создаваемых форм.
Создание дочерних окон.
Создайте новый проект.
Создайте новую форму. Для этого, из меню File выберите пункт New, а затем выберите пункт Form, как показано на рисунке ниже.
Delphi должен создать новую чистую форму. Откройте менеджер проектов (View -> Project Manager). Посмотрите на его содержимое и убедитесь, что в вашем проекте Project1.exe теперь есть две формы: Unit1 и Unit2:
Двойной щелчок по любой из форм в менеджере проектов вызовет форму в дизайнер для редактирования.
Сохраните новую форму. Для этого при выделенной новой форме нажмите Ctrl+S. Перед вами появится окно для ввода имени формы. Это окно у нас будет показывать информацию о программе, поэтому назовем его AboutUnit.pas. Модуль главной формы переименуем в MainUnit.pas. Нельзя просто так переименовывать имена модулей. Для этого желательно использовать меню File->Save As. Сразу изменим и имя формы с Form2 на AboutForm (свойство формы Name). Сохранили. Теперь изменим заголовок формы на «О программе» (свойство формы Caption).
Бросьте несколько компонентов TLabel, чтобы сделать надписи.
Теперь нужно показать это окно. Бросьте на главную форму кнопку «О программе» и создайте обработчик события Button1Click у нашей главной формы.
Теперь в получившемся обработчике напишем следующее:
procedure TForm1.Button1Click(Sender: TObject);
begin
AboutForm.ShowModal;
end;
В этом коде мы вызываем метод ShowModal окна AboutForm. Этот метод показывает форму в режиме Modal. В этом режиме окно получает полное управление, и пока оно не закроется, главная форма не будет работать.
Если вы попробуете сейчас откомпилировать код, то получите ошибку. Чтобы MainUnit смог увидеть форму, описанную в AboutUnit, нужно её подключить. Для этого перейдите в модуль MainUnit и из меню File выберите пункт Use Unit. Перед вами откроется окно:
В этом окне нужно выбрать модуль, который вы хотите подключить и нажать кнопку «ОК». Что после этого изменится? Посмотрим на следующий отрывок кода:
var
Form1: TForm1;
implementation
uses AboutUnit;
{$R *.dfm}
Как видите, здесь появилась новая строчка uses. Точно такая же есть в начале модуля, но там мы подключали стандартные заголовочные файлы. Здесь же мы подключаем модули написанные нами. Если вы забыли подключить модуль и откомпилировать код, то помимо ошибок вы увидите следующее окно:
Здесь написано, что вы из главного модуля ссылаетесь на форму AboutForm, которая объявлена в модуле AboutUnit. Вам также предлагается подключить этот модуль. Если вы нажмёте «Yes», то Delphi моментально сделает все действия для подключения.
Запустите программу и нажмите кнопку «О программе». Вы увидите вторую созданную нами форму.
Модальные и не модальные окна.
В предыдущем примере мы создали главное окно, которое вызывает дочернее в виде модального окна. Что значит модальное? Это значит, что управление полностью передаётся ему. Как только программа натыкается на код AboutForm.ShowModal, работа главной формы останавливается, и управление полностью передаётся дочерней форме. Пока модальное окно не закроется, главная форма работать не будет!!!
Рассмотрим простой пример:
procedure TForm1.AboutClick(Sender: TObject);
var
Index:Integer;
begin
AboutForm.ShowModal;
Index:=10;
end;
В этом примере мы показываем модальное окно и после этого присваиваем переменной Index значение 10. Так вот, переменная index получит значение 10, но только после того, как модальное окно AboutForm закроется.
Для того чтобы создать не модальное окно, нужно вызвать метод Show. В этом случае главная форма создаст дочернее, показав его на экране, и смело продолжит выполняться дальше. Это позволит тебе работать с обеими формами одновременно, переключаться между ними и код обеих форм будет выполняться как бы параллельно.
Рассмотрим пример:
procedure TForm1.AboutClick(Sender: TObject);
var
Index:Integer;
begin
AboutForm.Show;
Index:=10;
end;
В этом случае мы создаем немодальное окно, и выполнение кода не останавливается на точке AboutForm.Show, в ожидании закрытия окна, а спокойно продолжается дальше. То есть будет показано дочернее окно и моментально переменной index будет присвоено значение 10.
Давайте создадим ещё одну форму. Сразу переименуем её свойство Name в NonModalForm. Можете что-нибудь написать на ней или бросить только одну кнопку, с помощью которой можно будет закрыть это окно:
Сохраните новую форму под именем NonModalUnit.pas.
Теперь вернёмся в главную форму и допишем в раздел uses имя модуля NonModalUnit:
uses AboutUnit, NonModalUnit;
Бросьте на главную форму еще одну кнопку с названием «Не модальное окно». Создадим обработчик события для этой кнопки и напишем в нём следующее:
procedure TForm1.SaveClick(Sender: TObject);
begin
NonModalForm.Show;
end;
Здесь мы показываем форму NonModalForm как немодальное окно. Это значит, что если вы запустите программу и нажмете на кнопку «Не модальное окно», то увидите окно новой формы, и сможете спокойно переключатся между главной формой и NonModalForm без каких-либо проблем.
Обмен данными между формами.
Немного изменим не модальное окно, добавив на него строку ввода:
Теперь посмотрим на очень интересное свойство кнопки «Закрыть» - ModalResult. В этом свойстве мы можем задавать значение, возвращаемое при закрытии окна. Давай выберем здесь «mrOk». Теперь если мы покажем окно как модальное и потом закроем его кнопкой «Закрыть», то функция ShowModal вернёт нам значение mrOk.
Добавьте на форму кнопку «Отмена», у которой свойство ModalResult установите в mrCancel. Кстати, теперь вы должны очистить обработчики событий OnClick, для кнопок. Когда вы указали в свойстве ModalResult возвращаемое значение, кнопка уже автоматически умеет закрывать окно и не нужно создавать для неё обработчик OnClick и в нём писать метод Close.
Измените обработчик события OnClick для кнопки «Не модальное окно»:
procedure TForm1.Button2Click(Sender: TObject);
begin
if NonModalForm.ShowModal=mrOK then
Application.MessageBox(PChar(NonModalForm.Edit1.Text),
'Вы ввели:', MB_OKCANCEL)
end;
Теперь построчно рассмотрим код. В первой строке мы вызываем модальное окно и сразу проверяем возвращаемое значение. Если оно равно mrOK то выполняется следующее действие (if NonModalForm.ShowModal=mrOK then). Вторая строка показывает стандартное окно диалога. Это делаем с помощью метода MessageBox объекта Application. У этого метода три параметра:
1) Строка, которая будет показана внутри окна.
2) Строка заголовка окна.
3) Кнопки, которые будут на окне.
• MB_OK – кнопка «ОК».
• MB_OKCANCEL – кнопки «ОК» и «Отмена».
• MB_RETRYCANCEL – кнопки «Повторить» и «Отмена».
• MB_YESNO – кнопки «Да» и «Нет».
• MB_YESNOCANCEL – кнопки «Да», «Нет» и «Отмена».
В качестве текста сообщения в окне мы выводим текст, введённый в строку ввода нашего модального окна (NonModalForm.Edit1.Text).
Теперь если пользователь нажмёт кнопку «Закрыть» в модальном окне, то появится окно с введённым текстом. Иначе ничего не произойдёт.
Представить результат выполнения программы преподавателю.
Занести в отчет результат выполнения программы и исходные данные.
Выполнить представленные задания.
Закончить работу с системой Delphi.
ВАРИАНТЫ ЗАДАНИЙ:
Создать проект, в котором создается два окна. При запуске программы открывается первое окно с установленным на нем компонентом Edit, предназначенным для ввода пароля. Если пароль введен верно, открывается второе окно и выводится сообщение «Пароль введен верный».
Лабораторная работа №5
Разработка графических приложений в среде Delphi. Рисование и отображение.
Цель занятия:
Освоение принципов рисования с помощью свойства Canvas.
Рисование с помощью объектов Shape.
Рисование с помощью компонентов.
Получение практических навыков работы объектно-ориентированного программирования.
Вопросы для коллоквиума.
Укажите назначение объекта Shape.
Свойства Canvas.
Перечислите методы и события Canvas.
Назначение и применение компонента PaintBox.
Использование свойств Pen и Brush.
Назначение компонента Image.
Принципы отображения метафайлов, растровых изображений и пиктограмм.
Порядок выполнения работы.
Рассмотрим способы рисования и отображения при помощи различных свойств, методов и объектов.
Откройте новый проект, выбрав пункт меню File | New Project.
Нарисуем на форме голубой прямоугольник, заполненный желтыми диагональными штрихами. Для этого введите в обработчик событий формы OnPaint (найдите это событие в Инспекторе свойств и событий формы и установите значение FormCreate) следующие операторы:
with Canvas do
begin
Pen.Color:=clBlue;
Brush.Color:=clYellow;
Brush.Style:=bsDiagCross;
Rectangle(10,10,100,100);
end;
Свойство Canvas во время разработки проекта не доступно в окне Object Inspector.
Разместите на форме объект Shape (страница палитры Additional). Выберите свойство Shape – StRoundRect или введите в обработчик события формы OnCreate следующий оператор:
Shape1.Shape:=stRoundrect;
В окне Object Inspector присвойте подсвойствам Pen и Brush соответствующие значения (цвет, стиль, ширина пера).
Преимуществами работы с Shape является то, что изменять свойства фигуры и саму фигуру можно во время разработки формы приложения. Также фигуру можно двигать по форме.
Рассмотрим различие между понятиями рисование и отображение. Рисование возможно только в обработчике события OnPaint, в других обработчиках событий происходит отображение фигуры. Разместите на форме объект Button. Создайте для объекта обработчик события OnClick. В обработчике события напишите следующие операторы:
Обработчик событий OnClick:
procedure TForm1.Button1Click(Sender: TObject);
var x1,x2,y1,y2:integer;
begin
Canvas.Pen.Color:=clRed;
Canvas.Pen.Width:=2;
With Button1 do begin
x1:=Left-3; y1:=Top-3;
x2:=Left+Width+4; y2:=Top+Height+4; end;
Canvas.RoundRect(x1, y1, x2, y2, 4, 4);
end;
Запустите приложение на выполнение и щелкните на кнопке, чтобы очертить на форме красный прямоугольник с закругленными углами. Спрячьте окно, а затем вновь раскройте его, прямоугольник исчезнет. В этом случае фигура не прорисовывается вновь, она лишь отображается во время возникновения события.
Для повторного отображения графических объектов при изменении значений некоторых переменных, от которых зависит вид отображаемой фигуры, используйте следующие операторы, принудительно взывающие событие OnPaint:
Form.Invalidate;
Form.Update;
Эти два оператора используются для всех событий, кроме OnPaint.
Разместите на форме компонент Panel и немного растяните ее, чтобы было место для объекта PaintBox. Из палитры System выберите объект PaintBox и установите его на панель. Создайте обработчик события OnPaint (двойной щелчок мышью справа от строки OnPaint) для объекта PaintBox1 и введите туда следующие операторы:
With PaintBox1.Canvas do
Begin
Pen.Color:=clNavy;
Brush.Color := clRed;
Brush.Style := bsDiagCross;
Ellipse(0, 0, 177, 177);
end;
В результате выполненных действий у вас будет представлена форма следующего вида:
Представить результат выполнения программы преподавателю.
Занести в отчет результат выполнения программы и исходные данные.
Закончить работу с системой Delphi.
Выполнить следующие задания:
Дан двумерный массив целых чисел, размерность массива вводится с клавиатуры. Найти сумму элементов каждой строки массива. На основании полученных данных построить графически линейную зависимость – сумма элементов строки от номера строки.
Написать программу, выполняющую следующие действия: при щелчке мыши по форме происходит отображение разноцветных окружностей с центом в точке щелчка мыши.
В соответствии с положением курсора мыши относительно центра формы нарисовать прямоугольник в следующем соответствии: центр формы является центром прямоугольника, расстояние от точки по Х до центра формы – ½ длины прямоугольника, расстояние от точки по У до центра формы – ½ ширины прямоугольника.
Лабораторная работа №6
Разработка графических приложений в среде Delphi. Рисование и отображение.
Цель занятия:
Освоение принципов отображения растровых изображений с помощью объектов Image, Picture.
Загрузка изображений типа Bitmap, Icon, MetaFile.
Получение практических навыков работы объектно-ориентированного программирования.
Вопросы для коллоквиума.
Укажите назначение объекта Shape.
Свойства Canvas.
Перечислите методы и события Canvas.
Назначение и применение компонента Picture.
Использование свойств Pen и Brush.
Назначение компонента Image.
Принципы отображения метафайлов, растровых изображений и пиктограмм.
Порядок выполнения работы.
TGraphic - класс
Абстрактный базовый класс для графических объектов типа битовых матриц, пиктограмм, метафайлов и типов, определенных пользователем.
Описание
Класс TGraphic обеспечивает производные от него классы методами хранения, манипулирования и визуализации графических объектов, методами работы с объектами типа TPicture и с буфером обмена Clipboard. Свойства класса TGraphic дают информацию о состоянии и размерах изображения.
Когда тип графики, с которой ведется работа, известен: битовая матрица, пиктограмма или метафайл, можно использовать объекты производных от TGraphic классов TBitmap, TIcon или TMetafile соответственно. Если формат графики неизвестен, то можно использовать класс TPicture, способный работать с графическими объектами любых типов, производных от TGraphic.
TPicture - класс
Описывает объект, являющийся контейнером графических объектов типа битовых матриц, пиктограмм, метафайлов и определенных пользователем типов графических объектов
Описание
Объект типа TPicture является контейнером любого графического объекта TGraphic, тип которого указывается свойством Graphic. Объект TPicture имеет полиморфные методы файлового чтения и записи LoadFromFile и SaveToFile, автоматически подстраивающиеся под тип объекта.
В зависимости от типа хранимого объекта - битовой матрицы, пиктограммы, метафайла, определены соответствующие свойства Bitmap, Icon или Metafile, указывающие на графический объект. При ошибочном обращении к этим свойствам (если объект в действительности имеет другой тип) прежнее содержимое объекта стирается и открывается новый пустой объект указанного типа. Вместо этих свойств можно получать доступ к графическому объекту непосредственно через свойство Graphic. Таким образом, например, обращения Image1.Picture.Graphic и Image1.Picture.Bitmap эквивалентны, если графический объект - битовая матрица.
Обмен объекта TPicture с буфером обмена Clipboard может осуществляться методом Assign объекта TClipboard.
LoadFromFile – метод – Загружает изображение, хранящееся в файле
Прототип – procedure LoadFromFile(const FileName: string); virtual;
Описание
Метод LoadFromFile читает файл FileName и загружает его в графический объект.
Если формат графического файла не зарегистрирован, или не соответствует типу графического объекта, то генерируется исключение EInvalidGraphic.
SaveToFile – метод – Сохраняет графическое изображение в файле
Прототип – procedure SaveToFile(const FileName: string);
Описание
Метод SaveToFile сохраняет изображение графического объекта в файле FileName.
Assign - метод графических объектов – Копирует изображение одного графического объекта в другой
Прототип – procedure Assign(Source: TPersistent);
Описание
Метод Assign копирует изображение, содержащееся в объекте Source, в данный объект. Типы объектов источника и приемника должны быть одинаковыми. Исключение составляет свойство Graphic объекта TPicture. Graphic может участвовать в обменах изображениями с объектами типов TBitMap, TIcon, TMetaFile.
Объектом копирования для классов TBitMap, TIcon, TMetaFile может быть также буфер обмена - объект ClipBoard. При этом надо не забыть включить в оператор uses приложения ссылку на модуль Clipbrd. Свойство Graphic объекта TPicture может участвовать только в копировании в буфер обмена, но не в копировании из буфера.
Рассмотрим следующий пример – сразу после запуска приложения, создается чистая заготовка для изображения. Для этого необходимо выполнить следующие шаги:
1. Откройте новый проект, выбрав пункт меню File | New Project.
2. Поместите на форме объект Image и Button.
3. Создать заготовку обработчика события OnCreate для формы, содержащей Компонент Image.
4. Создать объект Bitmap и присвоить его свойству Picture.Graphic компонента Image.
После запуска приложения вы сможете увидеть в клиентской части формы белый квадрат, представляющий собой как бы заготовку для изображения. Если вы уменьшите окно таким образом, чтобы изображение не помещалось в нем, автоматически появятся полосы прокрутки.
Код процедуры:
procedure TForm1.FormCreate(Sender: TObject);
begin
Bitmap := TBitmap.Create;{ создаем графический объект }
Bitmap.Width:= 200;{ устанавливаем начальную ширину }
Bitmap.Height:= 200;{и начальную высоту объекта Bitmap }
Image1.Picture.Graphic := Bitmap; { присваиваем созданный графический объект компоненту Image }
Bitmap.Free; { Нам больше не нужен графический объект, поэтому уничтожаем его }
end;
В данной заготовке можно осуществлять любые графические операции. Для этого следует воспользоваться канвой компонента Image.
5. Далее в этом примере создадим объект Bitmap типа TBitmap и загрузим в него битовую матрица из файла с именем "MyBitmap.bmp" (предварительно создав этот файл в любом графическом редакторе и сохранив его в корневом каталоге диска С:\). Затем свойству Image1.Picture.Graphic присваивается указатель на этот объект. Затем объект Bitmap уничтожается, чтобы освободить занимаемую им память.
6. В обработчике события кнопки OnClick укажите следующие операторы:
procedure TForm1.Button3Click(Sender: TObject);
var
Bitmap: TBitmap;
begin
Bitmap := TBitmap.Create;
try
Bitmap.LoadFromFile('c:\MyBitmap.bmp');
Image1.Picture.Graphic := Bitmap;
finally
Bitmap.Free;
end;
end;
Создайте объекты типа Bitmap (файлы с расширением bmp), Icon (ico), MetaFile (wmf).
Отобразите файлы, содержащие изображения в вашем проекте.
Для отображения используйте объект Picture, Image.
Представить результат выполнения программы преподавателю.
Рассмотрим следующий пример использования объекта Image.
Создайте новое приложение и бросьте на форму одну кнопку и компонент TImage с закладки Additional.
Теперь установите на форме компонент OpenPictureDialog с закладки Dialogs. Этот компонент предназначен для отображения на экране стандартного окна открытия картинки. Нам так же понадобиться кнопка, по нажатию которой мы будем отображать окно открытия картинки и потом загружать выбранную.
На рисунке 1.1 представлена форма будущей программы. Чтобы программа стала полноценной надо написать код загрузки картинки.
По нажатию кнопки «Открыть картинку» пишем следующий код:
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;
В первой строке отобразите стандартное окно открытия картинки. Для этого достаточно вызвать метод Execute компонента OpenPictureDialog1, т.е. написать OpenPictureDialog1.Execute. Этот метод возвращает логическое значение. Если оно равно true, то пользователь выбрал файл, иначе нажал отмену. Именно поэтому необходимо проверить результат вызова метода Execute с помощью if OpenPictureDialog1.Execute then. Если файл выбран, то выполняется следующий код: Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
У компонента Image1 есть свойство Picture. Это свойство имеет объектный тип (а значит и свои свойства и методы) TPicture. Этот объект предназначен для работы с изображениями практически любого типа.
Для загрузки изображения используйте метод LoadFromFile (загрузить картинку из файла) объекта Picture. В качестве единственного параметра этого метода нужно указать имя открываемого файла или полный путь, если картинка находиться не в той же директории, что и сама программа.
Выберите имя файла с помощью стандартного окна и полный путь к файлу, который указывается в свойстве FileName компонента OpenPictureDialog1.
Запустите программу и просмотрите результат её работы. В окне открытия файла вы увидите, какие типы файлов можно открывать. В зависимости от версии и установленной комплектации количество типов может быть от 1 до 3 - bmp, ico и wmf.
Теперь попробуем работать с jpeg форматом файлов. Для начала в разделе uses проекта подключите модуль jpeg. В этом модуле описано всё необходимое для работы с jpeg форматом изображений.
Для того, чтобы в окне открытия файлов показывать фильтр на данный тип файлов необходимо выделить компонент OpenPictureDialog1 и дважды щёлкнуть по свойству Filter.
В этом окне у есть несколько заполненных строк. В первой пустой строке напишите в первой колонке «JPEG Files», а во второй колонке напишите «*.jpg». Теперь нажмите ОК и запустите программу. В окне открытия графического файла можно выбрать тип JPEG и открыть нужный файл. Он так же будет загружен в компонент Image1, даже не смотря на свой сложный алгоритм сжатия и другой вид хранения данных. Если формат «JPEG Files» в окне присутствует, этот пункт лабораторной работы пропускаем.
Теперь попробуем модернизировать пример и получить доступ к содержимому картинки. Для этого будем копировать изображение используя прозрачность.
Создайте для неё обработчик события OnPaint для главной формы в уже созданном нами примере. В созданной процедуре FormPaint напишите следующее:
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.BrushCopy(Rect(200,16,200+Image1.Width,16+Image1.Height),
Image1.Picture.Bitmap,
Rect(0,0,Image1.Width,Image1.Height),
Image1.Picture.Bitmap.Canvas.Pixels[1,1]);
end;
В процедуре, где мы загружаем изображение нужно в конце добавить вызов метода Repaint, чтобы после открытия графического файла форма прорисовалось заново и вызвался обработчик OnPaint.
Теперь запустите программу, и загрузите в неё bmp файл. Слева у нас находиться изображение картинки Image1, а справа мы делаем копию изображения на форму.
Мы используем процедуру BrushCopy уже знакомого нам свойства Canvas . Эта процедура копирует на Canvas картинку.
procedure BrushCopy(
const Dest: TRect; // Область приёмника
Bitmap: TBitmap; // Картинка которая будет копироваться
const Source: TRect; // Область источника
Color: TColor); // Прозрачный цвет
Область приёмника объявлена как TRect, который имеет вид TRect = (Left, Top, Right, Bottom: Integer). То же самое и с областью источника. В качестве картинки мы передаём Bitmap из TImage. В качестве прозрачного цвета используем цвет пикселя в позиции [1,1] из картинки TImage. На это указывает запись Image1.Picture.Bitmap.Canvas.Pixels[1,1]. Запишем её немного по другому: TImage1.Его_картинка.Bitmap.Холст.Пиксел[1_по_оси_X, 1_по оси_Y]
Обратите внимание, что если вы сейчас попытаетесь открыть какой-нибудь не bmp файл, то программа ничего не отобразит. Это связано с тем, что только BMP файлы хранят свои изображения в свойстве Bitmap, все остальные хранят в свойстве Graphic. Так что получить доступ к JPEG изображению таким образом нельзя. Зато можно с помощью метода Draw. Для этого нужно подкорректировать обработчик события OnPaint:
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Draw(200, 16, Image1.Picture.Graphic);
end;
Здесь вы уже рисуете не Bitmap, а Graphic, поэтому программа будет работать корректно.
Векторные файлы, такие как wmf хранят свои данные в свойстве Metafile. Для их отображения обработчик события OnPaint должен быть таким:
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Draw(200, 16, Image1.Picture.Metafile);
end;
Занести в отчет результат выполнения программы и исходные данные.
Закончить работу с системой Delphi.
Лабораторная работа №7
Использование таймера в среде Delphi. Создание движущихся графических объектов.
Цель занятия:
Освоение принципов создания таймера в среде Delphi.
Изучение свойств и событий таймера.
Получение практических навыков работы объектно-ориентированного программирования.
Вопросы для коллоквиума.
Укажите свойства объекта Timer.
Какое событие имеет Timer.
Как организовать при помощи таймера движение графического объекта?
Порядок выполнения работы.
Таймер (компонент Timer )– предназначен для организации фоновых процессов. Он имеет лишь несколько свойств и единственное событие.
Событие OnTimer периодически вызывается через промежуток времени, указанный в свойстве Interval. Период времени может составлять от 1 до 65535 мс.
Можно создать один или более таймеров, которые будут работать параллельно с другими приложениями или в фоновом режиме.
Для создания таймера выберите компонент Timer на странице System палитра компонентов. Разместите на пустой форме объект Timer и измените его свойство Name (по желанию). Для свойства Interval установите нужное значение частоты события – от 1 до 65535. При значении 1000 создается односекундный таймер, при значении 100 событие генерируется с частотой 1/10 секунды.
У компонента Timer имеется только одно событие – OnTimer. Щелкните дважды на значении этого события, и в полученной заготовке обработчика вставьте операторы между begin и end, которые будут выполняться с частотой, определенной для компонента Timer.
Откройте новый проект, выбрав пункт меню File | New Project.
Уберите кнопки минимизации и максимизации окна, изменив свойства формы. (свойство BorderIcons).
И
змените размеры формы – свойство формы BorderStyle установите в значение bsSingle.
Разместите на форме метку (компонет Label), свойствам Caption и Name объекта Label присвойте значения соответственно 00:00:00 АМ и TimeLabel1.
Поместите на форму Timer.
Выберите объект Timer1 и щелкните на закладке страницы. Events в окне свойств. В результате вы увидите только одно событие OnTimer. Для создания процедуры в исходном коде программы дважды щелкните на значении справа от события. Следующую строку введите после ключевого слова begin. TimeLabel1.Caption:=TimeToStr(Time);
Предыдущий код конвертирует текущее время в строку и присваивает свойству Caption метки результат в качестве значения. В результате время отображается на экране.
Для проверки кода запустите программу.
Добавим в наше приложение простой графический объект. Создадим изображение прыгающего мяча. Для этого создайте новый проект.
Разместите на форме объекты Timer1, Timer2, и Panel. Так как мячик должен прыгать (двигаться вниз и вверх) для разных траекторий движения используем различные таймеры. Свойству Enabled первого и второго таймера присвойте значение False.
На панели поместите графический объект PaintBox.
Поместите на форме две кнопки – одна для запуска 1-го таймера, вторая – для выхода из программы.
В обработчике событий 1-й кнопке установите значение свойства Timer1. Enabled в True.
Timer1.Enabled:=True;
В процедуре создания формы задайте начальные координаты движения мячика, предварительно описав глобальные переменные х, у, х1, у1.
x:=125; y:=20; x1:=175; y1:=70;
Далее создадим процедуру изображения мячика. Так как процедура создания мячика является процедурой пользователя, необходимо предварительно описать заголовок процедуры в разделе Type:
procedure Bal(x,y,x1,y1: integer; mode: boolean);
В разделе implementation опишем тело процедуры:
procedure TForm1.Bal(x,y,x1,y1: integer; mode: boolean);
// x,y,x1,y1 – координаты мяча
// mode: True - нарисовать, False - стереть
var
pc,bc: TColor; // текущий цвет карандаша и кисти
begin
if not mode then
begin
// стереть
Form1.PaintBox1.Canvas.Brush.Color := clBtnFace;
Form1.PaintBox1.Canvas.Pen.Color := clBtnFace;
Form1.PaintBox1.Canvas.Ellipse(x, y, x1, y1);
Form1.PaintBox1.Canvas.Brush.Color := clBtnFace;
exit;
end;
// рисуем
with Form1.PaintBox1.Canvas do
begin
pc :=Pen.Color; // сохраним текущий цвет карандаша
bc := Brush.Color; // и кисти
Pen.Color:=clRed; // установим нужный цвет
Brush.Color := clRed;
Ellipse(x, y, x1, y1);
Pen.Color:=pc; // восстановим старый цвет
end;
end;
Движение мячика организуем в процедуре вызова таймера OnTimer:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Bal(x,y,x1,y1,False);
if y1 < (Panel1.ClientHeight-30)then
begin
y:=y+5; y1:=y1+5;
end
else
begin
Timer1.Enabled:=False;
Timer2.Enabled:=True;
end;
Bal(x,y,x1,y1,True); //нарисовать в новой точке
end;
Процедура работы второго таймера аналогична. Здесь движение происходит в обратном порядке.
В результате должна получится форма следующего вида:
Представить результат выполнения программы преподавателю.
Занести в отчет результат выполнения программы и исходные данные.
Напишите программу мигания светофора.
Закончить работу с системой Delphi.
Лабораторная работа №8
Конструирование меню в среде Delphi. Общие принципы создания меню.
Цель занятия:
Освоение принципов создания меню.
Организация быстрого доступа к пунктам меню.
Пометка пунктов меню.
Всплывающие меню.
Получение практических навыков работы объектно-ориентированного программирования.
Вопросы для коллоквиума.
Компоненты создания меню.
Принципы создания главного и всплывающего меню.
Свойства Items.
Вложенные меню.
Организация быстрого доступа к пунктам меню.
Пометка пунктов меню.
Назначение кода пунктам меню.
Динамические меню.
использование клавишных эквивалентов команд (Акселераторы).
Порядок выполнения работы.
Откройте новый проект, выбрав пункт меню File | New Project.
На форму главного окна поместите объект MainMenu.
Установите свойство формы Menu равным имени объекта MainMenu.
Создайте подменю File и Exit (введите &File и E&xit, чтобы выделить клавиши мнемонического доступа <F> и <Х>).
Поочередно выберите все элементы меню в Меnu Designer и замените имя свойства name Filel на FileMenu, а затем Exit1 на FileExit.
Добавьте в программу операторы, чтобы применять эти элементы меню для различных целей. Например, на форму поместите кнопку (компонент Button) и, чтобы создать обработчик события, дважды щелкните на этой кнопке. Затем между begiп и eпd вставьте следующий оператор:
with FileExit do
Visible := not Visible;
Вставьте в обработчик команды Exit оператор Close;.
Запустите программу и пощелкайте на кнопке, чтобы включить и выключить команду Exit.
Создайте подменю Edit и Неlр.
С помощью свойства Items компонентов MainMenu, РорирМеnи и Menultem измените свойства компонентов подменю. Вы можете вызывать его методы, например Items.Insert, или обращаться к нему как к массиву, например, в выражении MyMenu.Items[N]. В объекте MainMenu свойство Items содержит перечень названий подменю. Каждый элемент меню имеет порядковый номер, который начинается с нуля. В нашем случае номер ноль имеет пункт главного меню Filе, 1 – Edit и т.д. Если рассматривать элементы подменю, то их нумерация также начинается с нуля относительно того подменю, в котором они располагаются.
В программе с подменю Filе, Edit и Неlр при помощи следующих операторов замените имя первого подменю на Presto-Chaпgo, запретите использование подменю Edit и сделайте подменю Неlр невидимым.
На форму поместите кнопку (компонент Button) и в обработчике события вставьте следующие операторы:
with MainMenu1 do
begin
Items[0].Caption := 'Presto-Chango';
Items[1].Enabled := False;
Items[2].Visible:= False;
End;
Верните все в прежнее состояние, создав третью кнопку и используя, следующие операторы:
with MainMenu1 do
begin
Items[0].Caption := 'File';
Items[1].Enabled := True;
Items[2].Visible:= True;
end;
Любой пункт подменю может иметь вложенное меню, как показано на рис. 1.1. Для того чтобы получить вложенное меню в Menu Designer, создайте такую команду меню, как Search (см. рис. 1.1). Выделив ее и нажав <Ctrl+→>, вы создадите вложенное меню, которое можно редактировать подобно обычным подменю. Для создания дополнительных уровней вам достаточно повторить то же самое.
Существует два способа доступа к пунктам меню. Первый заключается в создании клавиши мнемонического доступа. Для этого перед какой-нибудь буквой названия пункта меню необходимо поставить символ &. Например, если вы устанавливаете свойство Caption объекта Menultem равным &Configure, то, чтобы открыть меню Coпfigure, нажмите <Alt+C>.Второй способ состоит в назначении пункту меню клавишного эквивалента. Обычно клавишные эквиваленты представляют собой комбинации алфавитно-цифровых, функциональных, специальных клавиш «Ctrl>, <Shift», а также клавиш управления курсором. Они называются так потому, что пользователь для выполнения команды может воспользоваться определенной комбинацией клавиш, не прибегая к меню.
Введите, например, E&xit для свойства Caption объекта FileExit и установите для данного объекта свойство ShortCut равным <Alt+X>. Открыв подменю File, вы увидите, что Delphi автоматически отображает данный пункт как Exit Alt+ Х.
Для того чтобы создать всплывающее меню, которое появляется при щелчке правой кнопкой мыши, выполните следующие шаги.
Поместите на форму объект PopupMenu. По умолчанию в Delphi ему присваивается имя PopupMenul.
Дважды щелкните на объекте PopupMenul и используйте Menu Designer для ввода команд меню.
Присвойте PopupMenul свойству формы PopupMenu.
Создайте всплывающее меню с командами меню Edit.
Если вы запустите программу и нажмете правую кнопку мыши, то увидите отображающееся всплывающее меню.
Для того чтобы в ответ на события, отличные от щелчка правой кнопкой мыши, отобразить всплывающее меню, необходимо вызвать метод Popup компонента PopupMenu. При этом передайте в метод Popup координаты экрана х и у, как показано в следующем операторе: PopupMenu1.Popup(300, 300); Для примера бросьте на форму кнопку и поместите в обработчик событий кнопки вызов метода Popup всплывающего меню.
Для создания процедуры FormMouseDown выберите в инспекторе объектов событие формы OnMouseDown и установите его значение, равным FormMouseDown. Обработчик событий автоматически создаст указанную процедуру. Вставте в нее строку PopupMenu1.Popup(300, 300); Всплывающее меню будет появляться при нажатии любой клавиши мыши только в точке с координатами 300,300. В процедуре создания формы отмените автоматическое появление меню при нажатии правой клавиши мыши в любой точке формы.
procedure TForm1.FormCreate(Sender: TObject);
begin
PopupMenu1.AutoPopup := False;
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift:
TShiftState; X, Y: Integer);
Begin
PopupMenu1.Popup(300, 300);
end;
В результате выполненных действий у вас будет представлена форма следующего вида:
Представить результат выполнения программы преподавателю.
Занести в отчет результат выполнения программы и исходные данные.
Закончить работу с системой Delphi.
Задание на выполнение:
Написать программу, содержащую следующее меню:
Выбор фигуры → прямоугольник, эллипс, квадрат, сектор, сегмент;
Стиль пера → сплошная, штриховая, пунктирная, штрихпунктирная.
Цвет фигуры → красный, синий, зеленый, желтый, фиолетовый;
Стиль кисти → штриховка по-диагонали, горизонтальная, вертикальная штриховка, клетка.
При выборе любого пункта меню происходит выполнение заданного действия.
Лабораторная работа №9
Использование файловых переменных в среде Delphi.
Создание файлов.
Цель занятия:
Освоение принципов создания файлов в среде Delphi.
Изучение операций ввода-вывода.
Получение практических навыков работы объектно-ориентированного программирования.
Вопросы для коллоквиума.
Укажите виды файловых переменных.
Какие операции ввода-вывода вы знаете?
Перечислите функции и процедуры работы с файлами и каталогами.
Порядок выполнения работы.
Откройте новый проект, выбрав пункт меню File | New Project.
Рассмотрим простейший пример программы, которая по нажатию одной кнопки будет запрашивать имя файла у пользователя и записывать содержимое файла из объекта TMemo. По нажатию другой кнопки программа опять же будет запрашивать имя файла, читать от туда записанные данные и помещать их в TMemo.
Поместите на форму один объект TMemo и две кнопки.
Первая кнопка будет сохранять текстовый файл, вторая – открывать.
Поместите на форму объект – диалог открытия файла OpenDialog.
Если для сохранения файла вы хотите создать файл, то поместите на форму компонент TEdit, откуда считаем имя создаваемого файла.
Обработчик первой кнопки приведите к такому виду: procedure TForm1.Button1Click(Sender: TObject); var
F : TextFile;
FileName : String;
i : Integer;
begin FileName:=Edit1.Text;
AssignFile(F, FileName);
if IoResult<>0 then Exit;
Rewrite(F);
for i := 0 to Memo1.Lines.Count do
WriteLn(F, Memo1.Lines[i]);
CloseFile(F);
end;
Затем при помощи процедуры Rewrite этот файл открывается для записи.
В цикле выполняется чтение из компонента Memo текстовых строк и запись их в файл.
Процедура WriteLn осуществляет запись текущей строки Memo и переходит на следующую строку.
Обработчик второй кнопки должен выглядеть так: procedure TForm1.Button2Click(Sender: TObject); var
F : TextFile;
tmp : String;
begin
if OpenDialog1.Execute
then AssignFile(F, OpenDialog1.FileName)
else Exit;
Reset(F);
while not EOF(f) do
begin
ReadLn(F, tmp);
Memo1.Lines.Add(tmp);
end;
CloseFile(F); end;
Если в диалоге открытия файла OpenDialog был выбран файл, то его имя связывается с файловой переменной F при помощи процедуры AssignFile.
В качестве имени файла рекомендуется всегда передавать полное имя файла (включая его маршрут). Как раз в таком виде возвращают результат выбора файла диалоги работы с файлами TOpenDialog, TOpenPictureDialog.
Reset(F) - открываем файл для чтения процедурой Reset. Далее запускается цикл по всему файлу (while not EOF(F) do). Функция EOF(F : File) возвращает true когда достигнут конец файла.
Форма должна выглядеть следующим образом:
Представить результат выполнения программы преподавателю.
Занести в отчет результат выполнения программы и исходные данные.
Рассмотри пример работы с типизированными файлами.
Создадим файл, содержащий сведения о студенте: фамилия, год рождения.
На главной форме разместите компонент TMainMenu. Создайте меню следующего вида:
Файл → Создать
Открыть → Просмотр данных
Вывод данных по ключу
Выход
При выборе пункта меню «Создать» - создается новый типизированный файл. Данные вводятся на новой форме.
Создайте новую форму. Теперь войдите в свойства проекта (из меню Project нужно выбрать пункт Option). Выделите Form2 и перенесите её в список Available forms.
В обработчике событий пункта меню «Создать» введите следующий код:
Application.CreateForm(TForm2, Form2);
Form2.ShowModal;
На форме создания файла поместите кнопку «Сохранить» - для сохранения данных в файл. Компоненты TEdit для ввода имени файла и количества записей и два компонента TMemo для ввода данных.
Форма для ввода данных получится следующая:
В обработчике событий кнопки «Сохранить» напишите следующий код:
type student=record
fio:string[10];
data:integer;
end;
var
a: array[1..5] of student;
f:file of student;
filename:string;
n:integer;
begin
filename:=Edit3.Text;
assignfile(f,filename);
rewrite(f);
n:=StrToInt(Edit4.Text);
for i:=0 to n-1 do begin
a[i].fio:=Memo1.Lines[i];
a[i].data:=StrToInt(Memo2.Lines[i]);
write(f,a[i]);
end;
closefile(f);
end;
Прежде чем вводить данные не забудьте указать имя файла.
Теперь создадим форму для вывода данных из файла.
В обработчике событий пункта меню «Просмотр данных» создайте новую форму, аналогично предыдущей.
На форме вывода данных из файла разместите кнопку «Открыть» и компонент TStringGrid для вывода данных из файла.
Процедура обработки событий кнопки «Открыть» должна выглядеть следующим образом:
procedure TForm3.Button1Click(Sender: TObject);
type student=record
fio:string[10];
data:integer;
end;
var
a: array[1..5] of student;
f:file of student;
n:integer;
i:integer;
begin
if OpenDialog1.Execute
then AssignFile(F, OpenDialog1.FileName)
else Exit;
AssignFile(F, OpenDialog1.FileName);
Reset(F);
n:=filesize(f);
Form3.StringGrid1.ColCount:=2;
Form3.StringGrid1.RowCount:=n;
for i:=0 to n-1 do
begin
Read(f, a[i]);
Form3.StringGrid1.Cells[0,i]:=a[i].fio;
Form3.StringGrid1.Cells[1,i]:=IntToStr(a[i].data);
end;
CloseFile(F);
end;
Формы проекта представлены ниже:
Самостоятельно создайте форму для просмотра содержимого типизированного файла по ключу (пункт меню первой формы «Вывод данных по ключу»). Например, предусмотрите вывод данных о студентах моложе 18 лет.
Закончить работу с системой Delphi.
Лабораторная работа №10
Использование классов TStream и THandleStream.
Создание потоков для работы с файлами.
Цель занятия:
Использование класса TFileStream для работы с файлами.
Сохранение данных в адресном пространстве.
Хранение строки и доступ к ней во время выполнения приложения при помощи класса TStringStream.
Получение практических навыков работы объектно-ориентированного программирования.
Вопросы для коллоквиума.
Что собой представляют потоки. Их назначение.
Свойства и методы класса Tstream.
Как создать поток для работы с файлами?
Укажите назначение класса TMemoryStream. Перечислите свойства и методы этого класса.
Укажите назначение класса TStringStream. Перечислите свойства и методы этого класса.
Порядок выполнения работы.
Откройте новый проект, выбрав пункт меню File | New Project.
Рассмотрим пример программы, которая позволяет просматривать содержимое файлов, копировтаь файлы и редактировать их.
Разместите на форме объекты TButton для выполнения перечисленных действий.
Первая кнопка будет считывать данные из файла.
Поместите на форму объект – диалог открытия файла OpenDialog.
Данные из файла для чтения и редактирования будут выводится в новом немодальном окне, поэтому создайте вторую форму и подключите ее к первому окну. (меню File - пункт Use Unit).
На второй форме разместите компоненты Memo (для вывода данных), Edit (будет содержать имя файла, с которым вы работаете) и Button для закрытия второй формы.
Обработчик кнопки «Чтение данных из файла» приведите к такому виду: procedure TForm1.Button1Click(Sender: TObject);
var Stream1: TFileStream;
st:string[100];
n:byte;
begin
Form2.Show;
Form2.Memo1.Lines.Clear;
if Not OpenDialog1.Execute then Exit;
try
Stream1 := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
form2.edit1.text:= OpenDialog1.FileName;
n:=Stream1.seek(0,sofromend);
Stream1.Seek(0, soFromBeginning);
Stream1.ReadBuffer(st,n);
Form2.Memo1.Text:=st;
finally
Stream1.Free;
end;
Form2.Memo1.ReadOnly:=true;
end;
Рассмотрим подробно код этой процедуры: для создания потока объявляем переменную Stream1: TFileStream; и создаем поток, который открывает файл в режиме чтения
Stream1 := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); (файл должен существовать). Для выбора файла используем компонент OpenDialog1.
Считываем размер файла, используя для этого метод seek – n:=Stream1.seek(0,sofromend);
Переходим в начало потока и считываем данные из потока в буфер.
Stream1.Seek(0, soFromBeginning);Stream1.ReadBuffer(st,n);
Записываем данные в Memo. Form2.Memo1.Text:=st; Освобождаем поток. Stream1.Free;
Так как файл открыт для чтения, устанавливаем свойство Memo ReadOnly в True.
Рассмотрим процедуру редактирования данных из файла. Текст процедуры следующий:
procedure TForm1.Button2Click(Sender: TObject);
begin
Form2.Show;
Form2.Memo1.ReadOnly:=false;
Form2.Memo1.Lines.Clear;
try
if Not OpenDialog1.Execute then Exit;
Stream1 := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
f:=OpenDialog1.FileName;
n:=Stream1.seek(0,sofromend);
Stream1.Seek(0, soFromBeginning);
Stream1.ReadBuffer(st,n);
Form2.Memo1.Text:=st;
finally
Stream1.Free;
end;
end;
При закрытии формы выводы данных необходимо сохранять изменения в файле, поэтому создадим процедуру закрытия второй формы:
procedure TForm2.Button1Click(Sender: TObject);
begin
if Form2.Memo1.ReadOnly=true then Close
else
if MessageDlg('Сохранить изменения в файле?',
mtConfirmation,[mbYes, mbNo], 0)=MrYes then
begin
try
Stream1 := TFileStream.Create(f, fmOpenWrite);
st1:=Memo1.Text;
n:=length(st1);
Stream1.WriteBuffer(st1,n);
finally
Stream1.Free;
close;
end;
end else close;
end;
При закрытии формы выдается сообщение «Сохранить изменения в файле?». При ответе «нет» форма закрывается, в противном случае Создается поток для записи в него данных из компонента Memo.
Процедура копирования данных из одного файла в другой выглядит следующим образом:
procedure TForm1.Button3Click(Sender: TObject);
var Stream1, Stream2: TFileStream;
begin
if Not OpenDialog1.Execute then Exit;
try
Stream1 := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
NewFile:= InputBox('Input Box', 'Введите путь и имя файла для копирования', 'имя файла');
Stream2 := TFileStream.Create(NewFile, fmCreate,fmOpenWrite);
Stream2.Seek(0, soFromBeginning);
Stream2.CopyFrom(Stream1, Stream1.Size);
finally
Stream1.Free;
Stream2.Free;
end;
end;
Создается два потока, один открывает файл в режиме чтения, другой в режиме записи. При помощи диалога InputBox вводится путь и имя файла для сохранения. Методом CopyFrom данные копируются из одного потока в другой.
Формы проекта представлены ниже:
Самостоятельно создайте обработчик события для создания нового файла, при этом используйте для записи данных в файл поток класса TMemoryStream.
Закончить работу с системой Delphi.
Лабораторная работа №11
Создание баз данных в среде Delphi. Программирование форм баз данных. Построение запросов БД.
Цель занятия:
Освоение принципов создания баз данных в среде Delphi.
Изучение свойств объектов Table, DataSource, DBGrid, DBNavigator .
Получение практических навыков работы объектно-ориентированного программирования.
Вопросы для коллоквиума.
Укажите основные компоненты Delphi, предназначенные для работы с БД.
Дайте определение алиасу. Как он создается?
Как создать файл базы данных?
Укажите назначение компонент Table, DataSource, DBGrid, DBNavigator.
Как вывести из таблицы БД данные на форму?
Порядок выполнения работы.
Delphi можно использовать для написания приложений, которое могло бы создавать новые базы данных. Для того чтобы создать новую БД прежде всего необходимо определить место для хранения вашей информации и присвоить псевдоним (alias), который будет ссылаться на выбранное местоположение.
Для того чтобы создать псевдоним БД необходимо выполнить следующие шаги:
Запустите утилиту Database Desktop, выбрав ее из меню Tools Delphi. Выберите команду Tools->Alias Manager.
Для того чтобы создать новый псевдоним, щелкните на кнопке New. Введите новое имя псевдонима – оно может представлять собой любую строку, но обычно оно совпадает с каталогом или файлом, в котором будет размещаться ваша база данных.
Установите Driver Type равным STANDART (значение по умолчанию).
Щелкните на кнопке Browse и раскройте комбинированный список Drive (или Alias). Выберите диск, а затем последующий список каталогов, где будет храниться ваша база данных. Щелкните на кнопке Ok , чтобы закрыть средство просмотра, а затем на кнопке Keep New для сохранения выбранного псевдонима. Щелкните на кнопке Ok и ответьте Yes, когда вам будет предложено сохранить общедоступные (public) псевдонимы в IDAPI.CFG. Теперь вы можете обращаться к вашей базе данных по выбранному псевдониму.
После регистрации псевдонима и подготовки места для хранения БД создаем \БД на основе плоского файла:
Запустите утилиту Database Desktop.
Выберите команду File->New, а затем команду подменю Table. Вы увидите список доступных форматов БД. Выберите действующий по умолчанию Paradox 7.0.
Теперь вы видите главное окно для ввода и редактирования полей БД. Введите имена полей, типы (нажимая клавишу пробел для получения списка), размер алфавитных полей и звездочку (или любой другой символ), чтобы обозначить поле первичного ключа, по которому будет индексирована БД.
После ввода полей щелкните на кнопке Save as и выберите псевдоним для ссылки на новую базу данных или выберите уже существующий алиас.
Заполните поля созданной БД значениями, выбрав из меню File-> Open утилиты Database Desktop имя вашей БД. Затем выберите из меню Table команду Edit Data.
После создания новой базы данных или выбора существующей приступаем к написанию приложения Delphi, позволяющего получить доступ к информации из этой базы данных.
Если Вы используете Table для доступа к таблице, то при открытии данной таблицы заполняются некоторые свойства Table (количество записей RecordCount, описание структуры таблицы и т.д.). Объект Table воздвигает мост между приложением и псевдонимом БД.
Прежде всего, вы должны поместить на форму объект Table и указать, с какой таблицей хотите работать. Для этого нужно заполнить в Инспекторе объектов свойства DatabaseName (base) и TableName (mybase.DB). В DatabaseName можно либо указать директорию, в которой лежат таблицы в формате dBase или Paradox (например, C:\DELPHI\DEMOS\DATA), либо выбрать из списка псевдоним базы данных (DBDEMOS). Теперь, если свойство Active установить в True, то при запуске приложения таблица будет открываться автоматически.
Поместите на форму объект DataSource для связи с БД упавляющих элементов, предназначенных для работы с данными. Свяжите его с объектом Table, выбрав его из списка свойства DataSet.
Имеются два различных способа открыть таблицу во время выполнения программы. Вы можете написать следующую строку кода: Table1.Open; Или, если Вы предпочитаете, то можете установить свойство Active равное True: Table1.Active := True;
Также, как имеются два способа открыть a таблицу, так и есть два способа закрыть ее. Самый простой способ просто вызывать Close: Table1.Close; Или, если Вы желаете, Вы можете написать: Table1.Active := False;
Поместите на форму объект DBGrid в целях обеспечения просмотра и редактирования информации из базы данных. Задайте в качестве его свойства DataSource объект ТDataSource1.
Поместите на форму объект DBNavigator в целях обеспечения просмотра и редактирования информации из базы данных. Задайте в качестве его свойства DataSource объект ТDataSource1.
В результате должна получится форма следующего вида:
Теперь добавим в наш проект небольшое вычисление. Определим самого успевающего студента.
Для вычисления добавим на форму следующие объекты: Button – для вызова процедуры на выполнение, Edit – для вывода результата вычисления. При нажатии на кнопку вызывается на выполнение следующая процедура:
procedure TForm1.Button1Click(Sender: TObject);
Var i:integer;
max:real;
fam:string;
begin
max:=Table1.Fields[2].AsFloat;
fam:=Table1.Fields[0].AsString;
for i := 0 to Table1.FieldCount+1 do
begin
if max<Table1.Fields[2].AsFloat then
begin
max:=Table1.Fields[2].AsFloat;
fam:=Table1.Fields[0].AsString;
end;
Table1.Next;
end;
Edit1.Text:=fam;
end;
Здесь Table1.Fields[2].AsFloat; - обращение к данным 3-го поля таблицы Table1 (нумерация начинается с нуля), 3-е поле является средним балом и имеет вещественный тип данных. fam:=Table1.Fields[0].AsString – здесь в переменную fam записывается значение 1-го поля таблицы Table1, которое имеет строковый тип данных. Table1.Next; - переход на следующую запись в таблице (базе данных). Table1.FieldCount – определяет количество компонент в базе данных.
Задание на выполнение:
Написать программу просмотра таблицы базы данных, предварительно создав БД. Для вывода на экран элементов БД использовать вместо объекта DBGrid объекты DBEdit, чтобы каждый элемент выводился в отдельном окне. Для того чтобы вывести в объекте DBEdit поле БД в свойстве DataField укажите значения выводимого поля. По самостоятельному выбору произвести над данными БД некоторые вычисления с использованием свойств и методов объектов, расположенных на форме.
Лабораторная работа №12
Объекты OLE. Компонент OleContainer. Связывание и встраивание объектов.
Цель занятия:
Освоение принципов использования технологии OLE в среде Delphi.
Изучение свойств объекта OleContainer.
Получение практических навыков работы объектно-ориентированного программирования.
Вопросы для коллоквиума.
Что представляет собой технология OLE.
Укажите назначение компонента компонент OleContainer.
Перечислите свойства компонента OleContainer.
Укажите назначение OLE Контейнера.
Порядок выполнения работы.
Создайте новый проект.
Бросьте на форму компонент OleContainer с закладки System палитры компонентов. Теперь дважды щёлкните внутри окна компонента (или щёлкните правой кнопкой и в появившемся меню выберите пункт Insert Object). Перед вами откроется следующее окно:
В этом окне, в списке «Тип объекта» найдите строку «Рисунок PaintBrush». Выделите эту строку. Если поставить галочку «В виде значка», то на форме вы потом увидите только значок объекта, а по двойному щелчку будет запускаться выбранное приложение (PaintBrush). Если галочки нет, то приложение встраивается прямо в окно.
Запустите программу и дважды щёлкнуть внутри компонента OLEContainer. Компонент будет взят в рамочку и вы сможете рисовать в нём как в самом PaintBrush.
Таким способом мы встроили стороннее приложение в свою программу.
Для добавления меню в ваше приложение бросьте на форму компонент MainMenu. Туда не надо добавлять никаких пунктов, достаточно просто его бросить. Если у формы есть главное меню, то OLE компонент будет автоматически встраиваться в него.
Запустите программу и убедитесь, что меню появляется.
Теперь измените свойство Align у компонента OleContainer1 на alClient, чтобы растянуть его по всей форме. Запустите программу и посмотрите на результат. Теперь ваше приложение превратилось в полноценный PaintBrush. Единственное, что отличает его – заголовок окна и иконка Delphi.
Создайте в нашем главном меню два пункта Файл и Правка. У обоих пунктов добавьте подпункты Выход и Копировать.
Теперь запустите программу и посмотрите на результат. Когда вы пытаетесь активизировать OLE объект, то меню Файл остаётся ваше, а аналогичное из программы PaintBrush исчезает. К тому же у вас должно получиться два пункта Правка. Пункты меню, у которых в свойстве GroupIndex стоит чётное значение (0, 2, 4 …) – остаются неизменными. Пункты меню, у которых GroupIndex нечётное – заменяются аналогичными из OLE объекта. Попробуйте поставить у пункта Правка в свойстве GroupIndex значение 1 и запустите программу. Теперь при активизации OLE объекта пункт меню «Правка» будет заменён аналогичным из объекта.
Изменим наш пример. Добавьте на форму одну панель TToolBar (вкладка Win 32).
Сразу же изменим одно его свойство – дважды щёлкните по свойству EdgeBorders и измените свойство ebTop на false. Это заставит исчезнуть оборочку сверху панели.
Измените свойство AutoSize на true, чтобы панель принимала размеры соответствующие кнопкам.
Закрыть объект.
Теперь создадим кнопки на панели. Для этого щёлкните по ней правой кнопкой мыши и выберите из появившегося меню пункт New Button. Пункт New Separator этого же меню создаёт разделитель между кнопками. Если вам нужно будет удалить кнопку или разделитель, то просто выделите его и нажмите кнопку Del (на клавиатуре ).
Т
аким образом создайте все кнопки вместе с разделителями. У вас должно получиться нечто похожее на рисунок:
Теперь необходимо сделать так, чтобы кнопки что-то отображали. Но для начала выделите саму панель и изменить свойство Flat на true, чтобы кнопки на панели выглядели более изящно (плоско).
Теперь бросьте на форму компонент TImageList (вкладка Win32) и добавьте в него картинки.
Выделите панель и в свойстве Images укажите созданный набор картинок. На кнопках сразу же отобразятся картинки в той последовательности, в которой вы их добавили. Если вы хотите изменить картинку на какой-нибудь кнопке, то надо выделить её и изменить свойство ImageIndex.
Теперь для каждой кнопки в свойстве Caption напишите осмысленный текст (по умолчанию там стоит текст ToolButton плюс порядковый номер кнопки). Желательно, чтобы текст соответствовал изображению на картинке. Названия кнопок:
Вставить объект.
Свойства объекта.
Вставить из файла
Открыть объект.
Сохранить объект.
Если хотите, чтобы панель отображала на кнопках не только картинки, но и указанный в свойствах Caption текст установите true в свойстве ShowCaptions у панели инструментов. (Если ещё установить свойство List у панели инструментов, то текст будет отображаться справа от картинки)
У вас должна получится форма приблизительно такого вида:
По нажатию кнопки «Вставить объект» пишем следующий код:
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
OleContainer1.InsertObjectDialog;
end;
Теперь, после нажатия этой кнопки, программа будет отображать уже знакомое вам окно, с помощью которого можно будет сменить OLE объект на другой.
По нажатию второй кнопки (свойства объекта) пишем следующий код:
procedure TForm1.ToolButton2Click(Sender: TObject);
begin
OleContainer1.ObjectPropertiesDialog;
end;
Этим кодом мы будем отображать окно свойств объекта.
По нажатию кнопки «Вставить из файла» пишем следующий код:
procedure TForm1.ToolButton4Click(Sender: TObject);
begin
if OpenDialog1.Execute then
OleContainer1.CreateObjectFromFile(OpenDialog1.FileName, false);
end;
Так как в для открытия файла требуется компонент OpenDialog, бросьте его на форму. Как только пользователь выбирает файл, создается объект на основе выбранного файла. Попробуйте запустить приложение и открыть bmp, doc или xls файл. Как только вы нажмёте кнопку «Открыть», так сразу перед вами появиться соответствующий выбранному файлу OLE объект. Если вы выберете doc файл, то запуститься Word.
По нажатию кнопки «Открыть объект» пишем следующий код:
procedure TForm1.ToolButton4Click(Sender: TObject);
begin
OleContainer1.LoadFromFile('ole.dat');
end;
Здесь мы открываем объект из указанного файла. В качестве имени файла используем ‘ole.dat’.
По нажатию кнопки сохранить мы пишем следующее:
procedure TForm1.ToolButton4Click(Sender: TObject);
begin
OleContainer1.SaveToFile('ole.dat');
end;
Здесь мы сохраняем объект в тот же файл ‘ole.dat’. Файл созданный OLE объектом не совместим с форматом самой программы объекта. Это значит, что ole.dat – это не bmp картинка, хотя и bmp – это родной формат для программы PaintBrush. Так что вы не сможете открыть файл ole.dat с помощью PaintBrush.
По нажатию кнопки закрыть пишем следующее:
procedure TForm1.ToolButton11Click(Sender: TObject);
begin
OleContainer1.Close;
end;
Здесь мы закрываем запущенный OLE объект. Если пользователь дважды щёлкнул по контейнеру, то OLE объект запускается и закрыть его можно с помощью этой кнопки.
Если вы все сделали правильно, у вас получится следующее приложение:
Представить результаты выполнения преподавателю.
Закончить работу с Delphi.
Лабораторная работа №13
Работа с документами MS WORD в среде Delphi.
Цель занятия:
Освоение принципов работы с приложениями MS Office в среде Delphi.
Изучение свойств объектов Word.Application, Document.
Получение практических навыков работы объектно-ориентированного программирования.
Вопросы для коллоквиума.
Укажите функцию, реализующую механизм доступа к OLE-объекту.
Перечислите объекты MS WORD.
Как создать документ Word?
Перечислите свойства и методы объекта Selection.
Что собой представляет коллекция объектов Shapes?
Порядок выполнения работы.
Создайте новый проект.
Рассмотрим пример написания тестовой программы и формирования отчета по результатам ее работы. Отчет сформируем в документе Word.
Для создания теста разместите на форме следующие компоненты: Label1-«Вопрос №», Label2-«» (здесь будет вводится номер вопроса), Label3-«Введите ответ», Edit1 – «»(Для ввода вопроса), Edit2 – «» (для ввода ответа).
В меню укажите пункты «запуск теста», «выход», «Отчет». Подменю «Отчет» состоит из пунктов меню: «Данные курсанта » и «Формирование отчета».
Опишите следующие глобальные переменные:
n,k:integer; / номер вопроса и количество правильных ответов
my,s:array [0..4] of string; / массивы вопросов и ответов
fio:string; / фамилия и номер группы курсанта
При создании формы задаем значения элементов массива вопросов:
procedure TForm1.FormCreate(Sender: TObject);
begin
s[0]:=' Идентификатор объекта Word ';
s[1]:=' Метод создания нового документа ';
s[2]:=' Метод сохранения документа Word ';
s[3]:=' Метод закрытия документа Word ';
s[4]:=' Идентификатор части документа Word ';
k:=0;
end;
В процедуре запуска теста задаем начальные значения:
procedure TForm1.N1Click(Sender: TObject);
begin
n:=0;
label2.Caption:=Inttostr(n+1);
Edit1.Text:=s[0];
end;
Обработчик события кнопки «Принять»:
procedure TForm1.Button1Click(Sender: TObject);
begin
case n of
0: begin my[0]:=Edit2.Text; if Edit2.Text='Word' then inc(k);end;
1: begin my[1]:=Edit2.Text; if Edit2.Text='Add' then inc(k); end;
2: begin my[2]:=Edit2.Text; if Edit2.Text='Save' then inc(k); end;
3: begin my[3]:=Edit2.Text; if Edit2.Text='Close' then inc(k); end;
4: begin my[4]:=Edit2.Text; if Edit2.Text='Range' then inc(k); end;
end;
if n<4 then begin inc(n);Edit2.Text:=''; Edit1.Text:=s[n];end else
begin
Label1.Caption:='';
Label2.Caption:='';
Label3.Caption:='';
Edit1.Text:='Ваша оценка';
Edit2.Text:=inttostr(k);
end;
end;
Здесь происходит проверка ответов, подсчет количества правильных ответов и вывод результата.
Прежде чем отвечать на вопросы задаются данные отвечающего в процедуре «Данные курсанта» при помощи процедуры InputBox:
fio:=InputBox('Данные курсанта','Введите фамилию и номер группы','');
Прежде чем формировать отчет, подключите модуль ComObj (для работы с объектами Word).
Для формирования отчета в MS Office предназначена процедура «Формирование отчета»:
procedure TForm1.N5Click(Sender: TObject);
var W:variant;
MyRange:variant;
i:integer;
begin
W:=CreateOleObject('Word.Application');
W.visible:=true;
W.Documents.Add;
W.ActiveDocument.range.Font.Name:='Arial';
W.ActiveDocument.range.Font.Italic:=true;
W.ActiveDocument.range.Font.Size:=16;
W.ActiveDocument.range.Font.color:=rgb(0,0,255);
W.ActiveDocument.Range.InsertAfter('Фамилия и группа: ');
W.ActiveDocument.Range.InsertAfter(fio);
MyRange:=W.ActiveDocument.Range(W.ActiveDocument.Range.End-1,
W.ActiveDocument.Range.End-1);
W.ActiveDocument.Tables.Add(Range:=MyRange,NumRows:=5,NumColumns:=2);
for i:=0 to 4 do
begin
W.ActiveDocument.Tables.Item(1).Cell(i+1,1).Range.Text:=s[i];
W.ActiveDocument.Tables.Item(1).Cell(i+1,2).Range.Text:=my[i];
end;
W.ActiveDocument.Range.InsertAfter('Ваша оценка : ');
W.ActiveDocument.Range.InsertAfter(inttostr(k));
W.ActiveDocument.SaveAs('MyTest',ReadOnlyRecommended:=true);
W.ActiveDocument.Close;
W.Quit;
W:=UnAssigned;end;
Рассмотрим ее подробнее:
W:=CreateOleObject('Word.Application'); - создаем объект Word;
W.visible:=true; - делаем его видимым;
W.Documents.Add; - добавляем новый документ Word;
W.ActiveDocument.range.Font.Name:='Arial'; - устанавливаем стиль шрифта;
W.ActiveDocument.range.Font.Italic:=true; - устанавливаем курсив шрифта;
W.ActiveDocument.range.Font.Size:=16; - устанавливаем размер шрифта;
W.ActiveDocument.range.Font.color:=rgb(0,0,255); - устанавливаем цвет шрифта;
W.ActiveDocument.Range.InsertAfter('Фамилия и группа: '); - добавляем в документ строку текста, если в документе уже есть текст, новый будет добавлен в конец документа;
W.ActiveDocument.Range.InsertAfter(fio);
MyRange:=W.ActiveDocument.Range(W.ActiveDocument.Range.End-1,
W.ActiveDocument.Range.End-1); - создаем новую область вывода для таблицы данных
W.ActiveDocument.Tables.Add(Range:=MyRange,NumRows:=5,NumColumns:=2); - создаем таблицу для вывода данных (число столбцов – 2 , число строк – 5);
for i:=0 to 4 do
begin
W.ActiveDocument.Tables.Item(1).Cell(i+1,1).Range.Text:=s[i]; - выводим в 1 столбец вопросы теста
W.ActiveDocument.Tables.Item(1).Cell(i+1,2).Range.Text:=my[i]; - выводим во 2 столбец ваши ответы на вопросы теста
end;
W.ActiveDocument.Range.InsertAfter('Ваша оценка: ');
W.ActiveDocument.Range.InsertAfter(inttostr(k)); - выводим результат ответов на вопросы
W.ActiveDocument.SaveAs('MyTest',ReadOnlyRecommended:=true); - сохраняем файл с именем « MyTest », при последующем открытии файл будет открыт в режиме чтения.
W.ActiveDocument.Close; - закрытие документа;
W.Quit; - закрытие Word;
W:=UnAssigned; - очищаем память от объекта Application
end;
Результаты работы представить преподавателю, выполнить предложенное задание.
Задание на выполнение:
Измените предложенную программу, меняя характеристики вывода данных в отчет. (стиль, размер, цвет шрифта, параметры таблицы – размеры и количество строк и столбцов, форматирование в таблице и т.д., добавьте любое графическое изображение в документ).
Лабораторная работа №14
Работа с документами MS Excel в среде Delphi.
Цель занятия:
Освоение принципов работы с приложениями MS Office в среде Delphi.
Изучение свойств объектов Excel.Application, Workbooks.
Получение практических навыков работы объектно-ориентированного программирования.
Вопросы для коллоквиума.
Укажите функцию, реализующую механизм доступа к OLE-объекту.
Перечислите объекты MS Exsel.
Как создать рабочую книгу MS Excel?
Перечислите свойства и методы объекта WorkSheets.
Что собой представляет коллекция объектов Chart?
Порядок выполнения работы.
Рассмотрим пример формирования отчета и построения диаграммы по исходным данным из базы данных. Отчет и диаграмму сформируем на отдельных листах рабочей книги Excel.
Создайте новый проект.
Бросьте на форму компоненты для работы с базой данных. Кнопки создания отчета в Excel, построения диаграммы и кнопку – «Выход».
Подключите модуль ComObj для использования функции, реализующей механизм доступа к OLE-объекту.
Создайте новую базу данных, содержащую не менее трех полей: например – фамилия, год рождения, средний бал.
В обработчике событий кнопки «Отчет Excel» укажите следующий код:
procedure TForm1.Button1Click(Sender: TObject);
var
E,Sheet:Variant;
index,i:Integer;
begin
E:= CreateOleObject('Excel.Application');
E.Visible:=true;
E.Workbooks.Add;
E.Workbooks[1].WorkSheets[1].Name:='Отчёт';
E.Workbooks[1].WorkSheets[1].Columns[1].ColumnWidth:=20;
E.Workbooks[1].WorkSheets[1].Columns[2].ColumnWidth:=20;
E.Workbooks[1].WorkSheets[1].Columns[3].ColumnWidth:=20;
E.Workbooks[1].WorkSheets[1].Rows[2].Font.Bold:=true;
E.Workbooks[1].WorkSheets[1].Rows[1].Font.Bold:=true;
E.Workbooks[1].WorkSheets[1].Rows[1].Font.Color:=clBlue;
E.Workbooks[1].WorkSheets[1].Rows[1].Font.Size:=16;
Sheet:=E.Workbooks[1].WorkSheets['Отчёт'];
Sheet.Cells[1,2]:='Моя база данных';
E.Workbooks[1].WorkSheets[1].range['a2:c2'].Font.Size:=14;
Sheet.Cells[2,1]:='Фамилия';
Sheet.Cells[2,2]:='Год рождения';
Sheet.Cells[2,3]:='Средний бал';
index:=3;
TAble1.First;
for i:=0 to TAble1.RecordCount-1 do
begin
Sheet.Cells[index,1]:=TAble1.Fields.Fields[0].AsString;
Sheet.Cells[index,2]:=TAble1.Fields.Fields[1].AsString;
Sheet.Cells[index,3]:=TAble1.Fields.Fields[2].AsString;
Inc(index);
TAble1.Next;
end;
E.Workbooks[1].saveas('lab14');
E.Workbooks[1].Close;
E.Quit;
E:=UnAssigned;
end;
Первая строка создаёт объект Excel (E:= CreateOleObject('Excel.Application')), и записывает его в переменную XLApp. Эта переменная типа Variant. Variant - это тип, который может принимать любые значения: строки, числа, указатели и др. Вторая строка (E.Visible:=true) заставляет запустить сам Excel. Затем добавляем новую рабочую книгу (E.Workbooks.Add). Дальше даем название первому листу созданной книги E.Workbooks[1].WorkSheets[1].Name:='Отчёт'. Отформатируем колонки и строки созданного листа. Последовательно изменяем ширину колонок (E.Workbooks[1].WorkSheets[1].Columns[1].ColumnWidth:=20;). Для украшения строк нашего отчёта устанавливаем у первых двух строк жирный шрифт (Colum. Rows[1]. Font. Bold := true). В квадратных скобках теперь порядковый номер строки. Далее идут две строки, в которых я устанавливаю цвет первой строки в синий и размер шрифта равный 16.
Форматирование окончено, теперь можно выводить данные. Для этого мы получаем указатель на лист (Sheet:=E.Workbooks[1].WorkSheets['Отчёт']). Для того, чтобы вывести данные, нужно просто присвоить значение в Sheet.Cells[строка, колонки]. Подпишем данные нашей таблицы. (Sheet.Cells[2,1]:='Фамилия'; Sheet.Cells[2,2]:='Год рождения'; Sheet.Cells[2,3]:='Средний бал';).
Давайте посмотрим на код вывода данных таблицы:
index:=3;
TAble1.First;
for i:=0 to TAble1.RecordCount-1 do
begin
Sheet.Cells[index,1]:=TAble1.Fields.Fields[0].AsString;
Sheet.Cells[index,2]:=TAble1.Fields.Fields[1].AsString;
Sheet.Cells[index,3]:=TAble1.Fields.Fields[2].AsString;
Inc(index);
TAble1.Next;
end;
Сначала задаем переменной index значение 3. Эта переменная будет отображать, в какую строку таблицы Excel мы сейчас должны выводить данные. Первые две строки у нас уже заняты заголовками для отчёта, поэтому данные нужно начинать выводить с третей строки. Обратите внимание, что строки и таблицы в Excel нумеруются начиная с единицы, а не с нуля, как в остальных таблицах и массивах. После этого переходим на первую строку нашей таблицы с помощью метода First компонента Table. Это необходимо, потому что пользователь может перед нажатием кнопки отчёта выделить любую строку в середине таблицы и в этом случае отчёт пойдёт от этой выделенной строки. Теперь мы готовы запускать цикл, в котором будут перебираться все строки и информация из них будет попадать в Excel. Цикл запускаем начиная с 0 и до количества строк в таблицы. Таким образом перебираем все записи. Последовательно заполняем колонки данными из таблицы, присваивая в Sheet.Cells[index, номер колонки], соответствующие данные. Данные из базы данных берем по индексу. Для этого используется следующая конструкция:
Sheet.Cells[index,1]:=TAble1.Fields.Fields[0].AsString;
После вывода данных увеличиваем переменную Index, чтобы на следующем этапе выводить данные в следующую строку, и переходим на новую строку.
8. Сохраним наш отчет в файле lab14 ( E.Workbooks[1].saveas('lab14');). Закроем рабочую книгу Excel и приложение командами E.Workbooks[1].Close; E.Quit;
9. Создадим обработчик событий для кнопки «Диаграмма Excel». Для этого запишем следующий код:
procedure TForm1.Button2Click(Sender: TObject);
const
xlColumns=52;
var E,Chart:Variant;
i:Integer;
ChartName:string;
begin
E:= CreateOleObject('Excel.Application');
E.Visible:=true;
E.WorkBooks.Open('lab14');
Chart:=E.WorkBooks[1].Charts.Add;
Chart.ChartType:=xlColumns;
Chart.SeriesCollection.Add(Source:=E.Workbooks[1].Sheets.Item[2].Range['a3:b6']);
Chart.HasTitle:=True;
Chart.ChartTitle.Shadow:=true;
Chart.ChartTitle.font.size:=20;
Chart.ChartTitle.font.Color:=clBlue;
Chart.ChartTitle.font.italic:=true;
Chart.ChartTitle.Text:=E.Workbooks[1].Sheets.Item[2].cells[1,2].text;
Chart.PlotArea.Border.Weight:=2;
Chart.PlotArea.Border.LineStyle:=xlDot;
end;
Задание на выполнение:
Написать программу просмотра таблицы базы данных, предварительно создав БД. Построить объемную круговую диаграмму по данным из БД, описав легенду, заголовок, названия осей диаграммы, подписи данных. Для создания кнопок использовать TToolBar.
Объемные диаграммы
Объемный вид диаграммы определяется горизонтальным и вертикальным углами поворота, изометрией и другими параметрами, влияющими на вид трехмерной проекции. Объект Chart обладает следующими свойствами, позволяющими изменить диаграмму объемного вида: Rotation — поворот (в горизонтальной плоскости), Elevation — возвышение (поворот в вертикальной плоскости), Perspective — перспектива, RightAngleAxes — изометрия, AutoScaling — автомасштаб, HeightPercent — высота в процентах от нормальной высоты. Все перечисленные свойства имеют числовой тип, за исключением свойства AutoScaling, имеющего логический тип. Значения этих свойств можно считывать и изменять. Следующие операторы позволяют определить значения параметров объемной диаграммы:
Rotation.Value:=Chart.Rotation;
Elevation.Value:=Chart.Elevation;
Perspective.Value:=Chart.Perspective;
RightAngleAxes.Checked:=Chart.RightAngleAxes;
AutoScaling.Checked:=Chart.AutoScaling;
HeightPercent.Value:=Chart.HeightPercent;