Графические возможности среды Borland Delphi. Создание простейшего графического редактора

Объектно-ориентированное программирование: основные определения и принципы. Пример реализации графических возможностей среды Borland Delphi на примере создания простейшего графического редактора (компоненты: TShellTreeView, TShellListView, TImage).

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 25.04.2013
Размер файла 37,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru

Федеральное Государственное Бюджетное Образовательное Учреждение

Высшего Профессионального Образования

«Омский государственный педагогический университет»

Кафедра информатики и вычислительной техники

Курсовая работа

На тему: "Графические возможности среды Borland Delphi.

Создание простейшего графического редактора

(компоненты: TShellTreeView, TShellListView, TImage)".

Выполнила:

Бородина Ольга Михайловна

студентка 2 курса

заочного отделения,

факультета информатики

Проверила:

доцент, к.п.н.:

Леоненко Алина Николаевна

Омск 2012

Содержание

Введение

Глава 1 Основы объектно-ориентированного программирования

1.1 Объектно-ориентированное программирование: основные определения и принципы

1.2 Графические компоненты

Глава 2 Реализация графических возможностей среды Borland Delphi на примере создания простейшего графического редактора (компоненты: TShellTreeView, TShellListView, TImage)

2.1 Основной интерфейс приложения

2.2 Особенности работы приложения

Заключение

Список используемой литературы

Введение

Delphi -- это среда быстрой разработки, в которой в качестве языка программирования используется язык Delphi. Язык Delphi -- строго типизированный объектно-ориентированный язык, в основе которого лежит хорошо знакомый программистам Object Pascal.

Графические возможности и методы Delphi базируются на функциях графического ядра операционной системы Windows - Graphic Device Interface (GDI). Для обеспечения независимости от устройства отображения графической информации (дисплей, принтер, плоттер) библиотека процедур GDI используют так называемый контекст устройства - Windows device context (DC). По сути дела, контекст конкретного устройства представляет собой массив в оперативной памяти, в котором хранятся параметры, управляющие процессом вывода: размеры рабочего поля, разрешающая возможность, характеристики пишущего узла (толщина и цвет пера, тип линии), режим взаимодействия выводимых пикселей с ранее построенной частью изображения и многое другое. Обилие этих деталей и учет специфики Windows затрудняют прямое использование функций GDI.

Основным преимуществом графических объектов визуальных сред является то, что они скрывают от пользователя многие нюансы взаимодействия с процедурами GDI: запрос и освобождение контекста устройства, создание и уничтожение данных типа TPen и Tbrush, специфику обработки графических файлов разного формата (.bmp,.ico,.wmf,.emf) и т. п.

Графические возможности объектно-ориентированной среды Borland Delphi очень широки: от традиционного построения графиков до анимации; от рисования графических примитивов до программирования захватывающих дух, изысканных в своей красоте фракталов, поэтому в наше время наблюдается повышенный интерес пользователей к изучению графических возможностей среды Borland Delphi.

Объект курсовой работы - графические возможности среды Borland Delphi.

Предмет - простейший графический редактор (компоненты: TShellTreeView, TShellListView, TImage).

Целью курсовой работы является изучение графических возможностей среды Borland Delphi для создания простейшего графического редактора.

В соответствии с целью поставлены следующие задачи:

Изучить соответствующую литературу о графических возможностях среды Borland Delphi.

Рассмотреть создание простейшего графического редактора.

Используя компоненты (TshellTreeView, TshellListView, Timage), создать простейший графический редактор.

Глава 1. Основы объектно-ориентированного программирования.

1.1 Объектно-ориентированное программирование: основные определения и принципы

Рост сложности программного обеспечения создал условия для появления новых в программировании, позволяющих эффективно управлять большим объёмом программного кода и задействовать в разработке многочисленные коллективы программистов. Применяемый в середине ХХ века структурный подход в сочетании с модульным программированием позволяли получать эффективные программы, код которых не превышал приблизительно 100 000 строк. Такое ограничение было обусловлено сложностями в диагностике ошибок, возникающих при интеграции многочисленных модулей, которые разрабатывали разные программисты. Необходимо было повысить надёжность программного кода, наделить его большей обособленностью, снизить вероятность непреднамеренного влияния на обрабатываемые данные из различных частей программы. В результате был создан новый подход, который получил название «Объектно-ориентированное программирование» (далее ООП). По сути ООП является дальнейшим развитием структурного программирования, а также одним из его разделов. [2, с.19]

Объектно-ориентированное программирование - это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определённого класса, а классы образую иерархию на принципах наследуемости.

Объектно-ориентированное проектирование - это методология проектирования, соединяющая в себе процесс объектной декомпозиции и приёмы представления как логической и физической, так и статической и динамической моделей проектируемой системы.

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

Объект обладает состоянием, поведение и индивидуальностью; структура и поведение схожих объектов определяют общий для них класс; термины «экземпляр класса» и «объект» - взаимозаменяемы.

Состояние объекта характеризуется перечнем всех возможных свойств данного объекта и текущими значениями каждого из этих свойств.

Поведение объекта характеризует то, как объект воздействует или подвергается воздействию других объектов с точки зрения изменения состояния этих объектов и передачи сообщений.

Класс - множество объектов, связанных общностью структуры и поведения.

Любой объект является просто экземпляром класса.

Поля - это инкапсулированные в классе данные. Объявления полей выглядят так же, как объявления переменных после зарезервированного слова var или объявления полей в записях:

<имя поля>: <тип>;

Поля могут быть любого типа, в том числе - классами.

Методы - это инкапсулированные в классе процедуры и функции. Объявлений процедур и функций. [2, с.24]

Если выбор, повтор и переход - краеугольные основы любого процедурного языка программирования, то для объектно-ориентированного программирования важны такие понятия, как инкапсуляция, наследование и полиморфизм. Рассмотрим эти понятия, без которых ни один поддерживающий объекты язык не может называться объектно-ориентированным.

Инкапсуляция

Инкапсуляция есть объединение в единое целое данных и алгоритмов обработки этих данных. В рамках ООП данные называются полями объекта, а алгоритмы - объектными методами.

Инкапсуляция позволяет в максимальной степени изолировать объект от внешнего окружения. Она существенно повышает надежность разрабатываемых программ, т.к. локализованные в объемами данных, причем количество и тип этих данных обычно тщательно контролируются. В результате замена или модификация алгоритмов и данных, инкапсулированных в объект, как правило, не влечет за собой плохо прослеживаемых последствий для программы в целом (в целях повышения защищенности программ в ООП почти не используются глобальные переменные).[1, с. 86]

Наследование

Наследование есть свойство объектов порождать своих потомков. Объект потомок автоматически наследует от родителя все поля и методы, может дополнять объекты новыми полями и заменить (перекрывать) методы родителя или дополнять их.

Принцип наследования решает проблему модификации свойств объекта и придает ООП в целом исключительную гибкость. При работе с объектами программист обычно подбирает объект, наиболее близкий по своим свойствам для решения конкретной задачи, и создает одного или нескольких потомков от него, которые «умеют» делать то, что не реализовано в родителе.

Последовательное проведение в жизнь принципа «наследуй и изменяй» хорошо согласуется в поэтапным подходом в разработке крупных программных проектов и во многом стимулирует такой подход. [1, с. 86]

Полиморфизм

Полиморфизм - это свойство родственных объектов (т.е. объектов, имеющих одного общего родителя) решать схожие по смыслу проблемы разными способами. В рамках ООП поведенческие свойства объекта определяются набором входящих в него методов. Изменяя алгоритм того или иного метода в потомках объекта, программист может придавать этим потомкам отсутствующие у родителя специфические свойства. В результате в объекте-родителе и объекте-потомке будут действовать два одноименных метода, имеющих разную алгоритмическую основу и, следовательно, придающих объектам разные свойства. Это и называется полиморфизмом объектов.

В Турбо Паскале полиморфизм достигает не только описанным выше механизмом наследования и перекрытия методов родителя, но и их виртуализацией, позволяющей родительским методам обращаться к методам потомков. [1, с. 87]

1.2 Графические компоненты

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

Основные графические компоненты Delphi:

1.Timage предназначен для отображения в форме различных графических изображений, хранимых во внешних файлах в формате ВМР (растровое изображение), ICO (иконка) и WMF (метафайл). Возможно задание файла, изображение из которого будет отображаться в форме, как во время создания программы, так и во время ее выполнения. Для задания файла во время создания программы нужно выбрать слово Picture - после чего появится графический редактор, с помощью которого можно загрузить графическое изображение из файла.

Свойство Picture имеет тип Tpicture. Вспомогательный объект Tpicture обладает методом LoadFromFile, который используется для загрузки графического изображения из указанного файла. [1, с. 172]

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

2.Tshape предназначен для отображения различных геометрических фигур, тип которых задается в свойстве Shape (RtEllipse - эллипс, StRectangle - прямоугольник, StRoundRest - прямоугольник с закругленными углами, StRoundSquare - квадрат с закругленными углами, StSquare - квадрат,StCircle - окружность). Внешним видом геометрических фигур можно управлять через свойство Brush - Color и Style. Тип и цвет рамки задаются через свойство Pen - Color и Style.

Свойство Brush. Style может иметь следующие значения - bsSolid, bsClear, bsHorizontal, bsVertical, bsFDiagonal, bsBDiagonal, bsCross и bsDiagCross. Свойство Pen.Style может иметь следующие значения - psSolid, psDash, psDot, psDashDot, psDashDotDot, psClear и psInsideFrame.

3.Tbevel предназначен для оформления, имеет вид рамки и позволяет придать сегментам форм трехмерный вид. С помощью этого компонента можно выделить группу элементов или отделить их друг от друга.

Вид компонента Tbevel задается свойством Shape, а свойство Style управляет внешним видом самой границы, которая может быть приподнятой или углубленной, таким образом создается тип отображения - вдавленный или выпуклый. Свойство Align задает тип выравнивания этого компонента внутри компонента-владельца.

Свойство Shape, задающее вид компонента Tbevel, может иметь одно из значений (BsBox - имеет вид заполненного прямоугольника; BsFrame - вид рамки; BsTopLine - вид прямой линии, располагаемый сверху; bsBottomLine - вид прямой линии, располагаемой снизу; BsLeftLine - вид прямой линии, располагаемой слева; BsRightLine - вид прямой линии, располагаемой справа; BsSpacer - обрамление компонента отсутствует.)

Свойство Style, задающее стиль отображения, может принимать одно из значений: BsLowered - вдавленный; BsRaised - выпуклый.

4.TpaintBox используется, когда в программе необходимо иметь прямоугольную область с канвой для рисования. Обратиться к канве возможно посредством свойства “Canvas”, графические инструменты - в свойствах Font, Pen и Brush, а собственно рисование осуществляется в обработчике события on Paint.

Укажем, что в целом все графические операции в Delphi выполняются с использованием свойства Canvas, поддерживаемого многими компонентами. Оно олицетворяет интерфейс графических устройств Windows GDI и обеспечивает независимую от устройств область рисования объектов в окнах. [2, с.49]

Начиная с Delphi 6, в состав Visual Component Library(VCL) было включено несколько дополнительных компонент, обеспечивающих доступ к файловой системе. Это ShellTreeView, ShellListView и ShellComboBox, все они находятся на закладке примеров (Samples). По этой причине их принято считать нестандартными компонентами VCL, и, более того, они не упоминаются в справочной системе. Тем не менее, эти компоненты являются удобной альтернативой морально устаревшим и не отвечающим современным требованиям компонентам DirectoryListBox, FileListBox и DriveComboBox. В частности, с их помощью затруднительно добраться до таких мест системы, как рабочий стол или до папки «Мои документы». В современных компонентах, интегрированных с операционной системой (ОС), эти проблемы решены. В частности, компонент ShellTreeView (системное дерево) отображает структуру папок и устройств компьютера, а так же сетевых ресурсов. Подобную задачу выполняет и ShellComboBox, с той лишь разницей, что он не отображает каталоги на дисках и не показывает иерархии объектов. А компонент ShellListView может отображать все объекты, но не их иерархию. Сами системные компоненты, реализованные в ОС, можно видеть в проводнике Windows. В нем область «папки» соответствует компоненту ShellTreeView, основная область - ShellListView, а адресная строка, с некоторыми оговорками - ShellComboBox. [3]

Рассмотрим некоторые свойства этих компонент, и начнем с ShellTreeView:

AutoContextMenu - определяет, должно ли использоваться контекстное меню, предоставляемое ОС;

AutoRefresh - определяет, должно ли содержимое обновляться автоматически;

ObjectTypes - определяет, объекты каких типов должны отображаться;

Root - определяет корневой каталог или системную папку;

ShellComboBox - указывает на ассоциированный компонент;

ShellListView - указывает на ассоциированный компонент;

ShowButtons - определяет, отображать или нет значки рядом с именем папки, чтобы раскрыть ее содержимое;

ShowLines - определяет, должны или нет выводиться линии;

ShowRoot - определяет, должна или нет отображаться корневая папка.

Свойство ObjectTypes имеет 3 флага, указывающих на то, какие компоненты следует показывать. Это otFolders - папки, otNonFolders - все, кроме папок, и otHidden - скрытые объекты.

Свойство Root, помимо непосредственного пути, вроде «c:\Dirname», может содержать специальные значения, ссылающиеся на различные системные папки. В их числе можно отметить следующие:

rfDesktop - рабочий стол;

rfMyComputer - «мой компьютер»:

rfNetwork - «сетевое окружение»;

rfControlPanel - панель управления;

rfPrinters - принтеры;

rfFonts - шрифты;

rfAppData - данные приложений (Documents and Settings);

rfRecycleBin - «корзина».

Компонент ShellListView имеет все те же самые свойства (из приведенных в таблице 1), что и ShellTreeView, разумеется, за исключением свойства ShellListView: вместо него используется аналогичное по назначению свойство ShellTreeView. Кроме того, у него имеется еще одно свойство - AutoNavigate, которое, будучи установленным в истину, позволит пользователю открывать содержимое каталогов непосредственно из этого компонента. [3]

Глава 2. Реализация графических возможностей среды Borland Delphi на примере создания простейшего графического редактора (компоненты: TShellTreeView, TShellListView, TImage)

2.1 Основной интерфейс приложения

Для отображения графических изображений используют компонент Image - изображение, относящийся к группе дополнительных (Additional) компонент. Обычно его помещают на поверхность формы и используют для отображения рисунков, в том числе, хранящихся в виде файлов. Компонент Image является наследником класса TgraphicControl и имеет несколько собственных свойств, связанных с графикой. Прежде всего, это самое главное свойство Image - Picture, которое служит для непосредственной работы с изображениями и имеет тип Tpicture. Позже мы рассмотрим этот класс подробнее, пока же примем к сведению, что все операции над самим изображением (включая загрузку файла) выполняется посредством этого свойства.

Остальные свойства Image относятся к способам размещения изображения в рамках данного компонента. Так, свойство Center определяет, должно ли изображение быть размещено по центру (истина), или нет (ложь), в последнем случае оно будет выровнено по левому верхнему углу. Еще 2 свойства - Stretch и Proportional отвечают за масштабирование изображения. Так, если свойство Stretch установлено в истину, то изображение будет занимать все пространство, отведенное для компонента Image. Если оно при этом меньше, то оно будет увеличено, если больше - то сжато. При этом пропорции (отношение ширины к высоте) самого изображения не учитываются, что обычно приводит к искажениям. Поэтому, начиная с Delphi 6, было введено еще одно свойство - Proportional. Если оно установлено в истину, то изображение в любом случае сохранит свои исходные пропорции. Кроме того, если оно меньше, чем область, отведенная для изображения, то оно останется в исходных размерах, если только свойство Stretch так же не установлено в истину. Если же рисунок больше, то, вне зависимости от значения, заданного для Stretch, он будет пропорционально уменьшен до такого размера, чтобы поместиться в области компонента Image.

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

Наконец, еще одно свойство, IncrementalDisplay, позволяет выбирать режим показа изображений: если установить его в истину, то файлы будут отображаться постепенно, по мере считывания и раскодирования. Это может быть актуально для больших сжатых файлов, например, для 5-мегапиксельных JPEG-изображений, особенно сохраненных в высоком качестве. При этом можно получать информацию о ходе загрузки изображения при помощи обработки события OnProgress. Это единственное собственное событие рассматриваемого компонента. Оно имеет тип TprogressEvent, для которого определен следующий синтаксис:

procedure (Sender: Tobject; Stage: TprogressStage; PercentDone: Byte; RedrawNow: Boolean; const R: Trect; const Msg: string) of object;

Аргумент Sender, как обычно, ссылается на объект, получивший уведомление о событии. Приблизительный процент выполнения операции можно получить, обратившись к PersentDone, а общее состояние - начало загрузки (psStarting), выполнение загрузки (psRunning) и завершение загрузки (psEnding) - к Stage. Ну а RedrawNow показывает, может ли быть отображена уже загруженная часть изображения, определяемая координатами прямоугольника R. На практике обычно используют только PercentDone, да и то следует учитывать, что это актуально только для файлов JPEG:

ProgressBar1.Position:=PercentDone;

Создадим простейшее приложение, которое может отображать рисунки. Для этого на форме, помимо Image, нам понадобятся следующие компоненты:

Рамка (Bevel), чтобы визуально ограничить отведенную для рисунка область;

Диалог открытия файла и кнопка для его вызова. Для диалога в качестве фильтра можно задать «Изображения |*.bmp;*.ico;*.wmf;*.emf;*.jpeg;*.jpg»;

Индикатор выполнения, чтобы отображать ход загрузки JPEG-файлов.

По той причине, что стандартными средствами изображения типа JPEG не поддерживаются, то для того, чтобы программа могла с ними работать, в список используемых модулей следует добавить jpeg.

Сам код программы сводится всего лишь к 2 процедурам: обработчику OnClock копки, и обработчику OnProgress изображения. В результате мы получим код, приведенный в листинге 1.1.

Листинг 1.1. Простейшее приложение для просмотра рисунков

unit Unit1;

interface

uses

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

Dialogs, ExtCtrls, ComCtrls, StdCtrls, jpeg;

Type

Tform1 = class(Tform)

Img: Timage;

OpenBtn: Tbutton;

ProgressBar: TprogressBar;

OpenDlg: TopenDialog;

Bevel1: Tbevel;

procedure OpenBtnClick(Sender: Tobject);

procedure ImgProgress(Sender: Tobject; Stage: TprogressStage; PercentDone: Byte; RedrawNow: Boolean; const R: Trect; const Msg: String);

end;

var

Form1: Tform1;

implementation

{$R *.dfm}

procedure Tform1.OpenBtnClick(Sender: Tobject);

begin

if OpenDlg.Execute then Img.Picture.LoadFromFile(OpenDlg.FileName);

end;

procedure Tform1.ImgProgress(Sender: Tobject; Stage: TprogressStage; PercentDone: Byte; RedrawNow: Boolean; const R: Trect; const Msg: String);

begin

ProgressBar.Position:=PercentDone;

if RedrawNow then Img.Repaint;

end;

end.

Чтобы можно было просматривать достаточно большие рисунки, не помещающиеся целиком в отведенную область, следует установить свойство Proportional компонента Img в истину, а для лучшего эстетического восприятия не помешает его еще и разместить по центру, установив в истину так же и свойство Center. Этот пример можно найти в каталоге Demo\Part3\SimpleImg.

Классы Tpicture и Tgraphic.

Как уже было отмечено, важнейшей частью компонента Image является свойство Picture (рисунок), имеющее тип Tpicture. Именно оно используется для работы с самим изображением, включая такие операции, как чтение из файла и запись в файл. Оригинальный размер изображения так же доступен через свойства Height и Width рисунка. В свою очередь, класс Tpicture включает в себя несколько свойств, основанных на классе Tgraphic, которые собственно и могут содержать само изображение. Всего предусмотрено несколько таких свойств:

Bitmap типа Tbitmap - для файлов типа BMP;

Icon типа Ticon - для файлов типа ICO;

MetaFile типа TmetaFile - для файлов типа WMF или EMF.

Кроме них, существует еще свойство Graphic, которое ссылается на картинку вне зависимости от конкретного формата и имеет такие общие для всех рисунков свойства, как Height, Width и Transparent. Поэтому в тех случаях, когда тип изображения заведомо неизвестен, следует использовать именно это свойство. Более того, если используются нестандартные для Windows и Delphi типы графических фалов (взять тот же JPEG, который является опциональным в VCL), то только через свойство Graphic к нему и можно будет обращаться для того, чтобы, скажем, узнать размеры. Собственно говоря, когда используются свойства Height или Width объекта Picture, то они берут значения как раз от этого объекта.

Вообще можно отметить, что компонент Image является всего лишь полем для отображения изображений, поддержка которых полностью возложена на класс Tpicture и его дочерние свойства, основанные на Tgraphic. Единственной его особенностью являются сервисные функции для масштабирования изображений. В то же время, если этого не требуется, то можно просто создать программными методами экземпляр класса Tpicture и выводить изображение на поверхность любого компонента, имеющего свойство Canvas:

var Pic: Tpicture;

Pic:=Tpicture.Create;

Pic.LoadFromFile(`c:\mypicture.bmp');

Form1.Canvas.Draw(1,1,Pic.Graphic);

Кроме того, «сам по себе» класс Tpicture может быть полезным при работе с таким компонентом, как ImageList. Например, можно сделать так, чтобы рисунки для изображений меню или панелей инструментов загружались из отдельного файла. В таком случае даже помещать ImageList на форму во время проектирования приложения, в обще-то не обязательно - все можно делать во время работы приложения. Кроме того, поскольку формат файл заранее известен - это будет BMP, то использовать класс Tpicture так же нет необходимости, проще будет сразу обратиться к классу Tbitmap - все равно Tpicture будет просто переадресовывать все обращения к своему свойству Bitmap:

var

ImgLst: TimageList;

Bmp: Tbitmap;

ImgLst:=TimageList.Create;

Bmp:=Tpicture.Create;

Bmp.LoadFromFile(`tools.bmp');

Bmp.Transparent:=true;

ImgList.AddMasked(Bmp,Bmp.TransparentColor);

Но в ряде иных случаев использование самого класса Tpicture может быть более предпочтительным по той причине, что таким образом можно обеспечить поддержку других форматов. Для примера рассмотрим приложение, которое сможет не только показывать, но и создавать графические файлы. Для этого нам понадобится создать новое приложение, на главной форме которого расположим какой-либо объект, на поверхности которого можно рисовать, скажем, тот же Image. По традиции, назовем форму MainFrm, а изображение - Img. Затем поместим на форме 2 кнопки и назовем одну InsertBtn (вставить), а другую - SaveBtn (сохранить). Так же нам потребуется 2 диалога - для того, чтобы открывать и сохранять картинки. Используем специализированные диалоги OpenPictureDialog (OpenPicDlg) и SavePictureDialog (SavePicDlg).

Для того чтобы область, выделенная для творчества, была изначально заполнена белым фоном, имитируя лист бумаги, для события OnCreate или OnShow формы можно предусмотреть следующий код:

Img.Canvas.Brush.Color:=clWhite;

Img.Canvas.FillRect(Rect(0,0,Img.Width,Img.Height));

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

procedure TmainFrm.InsertBtnClick(Sender: Tobject);

var

Pic: Tpicture;

begin

if not OpenPicDlg.Execute then exit;

Pic:=Tpicture.Create;

Pic.LoadFromFile(OpenPicDlg.FileName);

Img.Canvas.Draw((Img.Width-Pic.Width) div 2,(Img.Height-Pic.Height) div 2,Pic.Graphic);

Pic.Free;

end;

Таким образом, при помощи метода Draw холста, мы можем вывести любое количество рисунков из файлов разных типов. В данном случае все они будут центрированы по середине изображения, но при необходимости можно было бы выводить их, скажем, в то место, где был произведен последний щелчок мышью.

Но это еще не все: все-таки составлять коллажи - не единственная возможность, предоставляемая холстом. Можно на нем просто рисовать, что уже было рассмотрено в предыдущей части книги. Между тем, мы можем не просто выводить какие-либо предопределенные фигуры, но и предоставить пользователю возможность нарисовать что-либо. Пусть это будут хотя бы простые линии, которые будут появляться после того, как пользователь нажмет на левую клавишу мышки, переместит указатель, и отпустит клавишу. Для этого мы задействуем обработчики событий OnMouseDown и OnMouseUp для объекта Img, и используем методы MoveTo и LineTo его холста:

procedure TmainFrm.ImgMouseDown(Sender: Tobject; Button: TmouseButton;

Shift: TshiftState; X, Y: Integer);

begin

Img.Canvas.MoveTo(X,Y);

end;

procedure TmainFrm.ImgMouseUp(Sender: Tobject; Button: TmouseButton; Shift: TshiftState; X, Y: Integer);

begin

Img.Canvas.LineTo(X,Y);

end;

Наконец, нам остается реализовать возможность сохранения того, что в данный момент отображается в Img. Для этого нам и пригодится 2-я кнопка, код для которой будет выглядеть следующим образом:

if SavePicDlg.Execute then Img.Picture.SaveToFile(SavePicDlg.FileName);

Таким образом, все, что нарисовано на холсте, может быть без каких-либо ухищрений сохранено в качестве обычного файла в формате Windows Bitmap. Исходный код этой программы можно найти в каталоге Demo\Part3\PicEdit.

Пример программы просмотра графики.

Теперь, когда мы разобрались с графикой в Delphi, попробуем создать более удобную программу для просмотра графических изображений. За основу возьмем программу для просмотра файлов - FileView, поскольку она уже содержит все необходимое для того, чтобы пользователь мог осуществлять навигацию по файловой системе своего ПК. Но прежде нам понадобится сделать некоторые изменения, в частности, было бы полезно переместить все имеющиеся компоненты непосредственно с поверхности формы на панель. Для этого сначала выделим все компоненты формы и вырежем их в буфер обмена (Ctrl+X). Затем поместим на форму панель и для ее свойства Align установим значение alLeft, в результате чего она займет все пространство по левому краю формы. Убедившись, что панель в данный момент является выбранным компонентом, произведем вставку из буфера обмена (Ctrl+V). Все ранее удаленные с поверхности формы компоненты появятся в том же виде на поверхности панели.

2.2 Особенности работы приложения

Создадим новый проект и перенесем на форму два компонента:

ShellTreeView И ShellListView. У компонента ShellTreeView В СВОЙСТВе

Нужно указать компонент чтобы связать в одно целое. У компонента ShellListView нужно установить свойству MutiSelect значение true, чтобы мы могли выбирать несколько файлов.

Теперь нужно добавить панель, на которой мы разместим четыре кнопки: Копировать, Переместить, Удалить, Свойства. Мою форму будущей программы вы можете увидеть на рис. 1.1.

Рабочий стол Мои документы Мой компьютер Сетевое окружение Корзина

Теперь перейдите в раздел uses и добавьте туда два модуля: SHFileOperation и FileCtrl. Первый модуль необходим для работы функции SHFileOperation. Во BIQXM есть функция SelectDirectory, которая выводит на экран стандартное окно выбора директории. Это окно мы будем использовать, когда нужно будет выбрать директорию, в которую надо скопировать или переместить файлы.

В разделе private добавим описание следующей функции:

Private

{ Private declarations }

Function DoSHFileOp (Handle : THandle; OpMode: UInt; Src, Dest: string; DelRicleBin; Boolean) : Boolean;

Эта функция будет универсальная: для копирования, перемещения и удаления файлов. Нажмите, чтобы создать заготовку этой функции. В этой заготовке нужно написать следующее (листинг 3.16).

Листинг 3.16. Универсальная функция для работы с файлами

Function TForml. DoSHFileOp (Handle: THandle; CpMode: UInt; Src,.

Dest: string; DelRicleBin: Boolean): Boolean; var

Ret: integer;

IpFileCp: TSHFileCpStruct; begin

Screen. Cursor:=crAppStart; FlUChar (ipFileOp, SizeOf (ipFileOp) , 0) ; with ipFileCp do begin wnd : = Handle; wFunc := CpMode; pFrom := pChar(Src); pTo :=

If DelRicleBin then fFlags : = FOF_ALLOWDNDO

Else

FFlags := FOF_NOCONFIRMMKDIR; fAnyCperationsAtorted := False; hNameMappings := nil; IpszProgressTitle := 1?; end; try

Ret := SHFileCperation (ipFileOp); except

Ret := 1; end;

Result : = (Ret = 0) ; Screen. Cursor:=crDefault; end;

fFlags -- флаги. Если в качестве данного параметра указано true, то мы выставляем флаг fof_allowundo. этот флаг говорит о том, что при удалении файлы будут попадать в корзину. Иначе будет установлен флаг который указывает на то, что не надо запрашивать подтверждения при необходимости во время выполнения операции создать директорию. Вы можете также указывать следующие флаги (для того, чтобы выставить несколько флагов, пишите их через знак " + "):

fof_ftlesonly -- выполнять операцию только для файлов, если указана маска (например *.*);

fof_nоconfirmation -- не выводить подтверждений и все делать без предупреждения (например, перезапись файлов);

fof_silent -- не отображать окно выполнения процесса;

fof_simpleprogress -- показать окно выполнения процесса, но не отображать имена файлов.

IpszProgressTitle -- текст, который будет отображаться в окне хода выполнения операции.

fAnyoperationsAborted -- это свойство будет равно true, если пользователь прервал выполнение операции.

После раздела var и перед ключевым словом implementation напишите следующий код:

Const

FileOpMode: array[0..3] of UInt =

(FO_CGPY, FO_DELETE, FO_MOVE, FO_RENAME);

Здесь мы объявили массив из четырех значений. Каждое из значений -- это константа для обозначения определенной операции:

О FO_COPY -- копирование;

О fo_delete -- удаление;

53nK.9"S

О fo_move -- перемещение; d fo rename -- переименование.

Теперь создадим обработчики событий для нажатия кнопок нашей панели. Сначала создайте обработчик события onclick для кнопки Копировать. В нем нужно написать следующий код (листинг 3.17).

Procedure TForml. CopyButtonClick(Sender: TObject); var

FSrc, FDes, FPath: string; i:Integer; begin FDes := ";

If ShellListViewl. Selected=nil then exit;

If not SelectDirectory(`Select Directory', », FDes) then exit;

FPath:=ShellTrseViewl. path; if FPath[Length(FPath)]<>'\' then FPath:=FPath+'\'; FSrc : = ";

For i := 0 to ShellListViewl. items. Count-1 do if (ShellListViewl. Sterns. item[i].Selected) then begin FSrc: =FSrc+

ShellListViewl. Folders[ShellListViewl. Items. Item[I].Index].PathNamet #0;

ShellListViewl, items. item[i].Selected:=false; end; FSrc:=FSrc+#0;

DoSHFileOp(Handle, FileOpMode(0], FSrc;, FDes, false); end;

Прежде чем производить попытку копирования, надо проверить, выбрал ли пользователь какие-либо файлы. Если нет, то нужно выйти из процедуры, потому что копировать нечего. Эта проверка происходит во второй строке кода:

If SheIlListViewl. Selected=nil then exit;

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

Обзор папок

Select Directory

Теперь нужно узнать директорию, из которой происходит копирование. Полный путь находится в свойстве path компонента ShellTreeviewl. Также проверяется, если последний символ пути не равен знаку его нужно

Добавить:

FPath-.=ShellTreeViewl. Path; if FPath[Length(FPath)]о'\' then FPath:=FPath+'\';

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

После цикла в переменную FSrc добавляется еще один нулевой символ. Таким образом, в конце строки будет два символа #о, что и будет означать конец строки:

For i := 0 to ShellListViewl. items. Count-1 do if (ShellListViewl. items. item[i].Selected) then begin FSrc:=FSrc+

ShellListViewl. Folders[ShellListViewl. Items. Item [I] .Index].PathName+

#0;

ShellListViewl. items. item[i].Selected:=false; end; FSrc:=FSrc+#0;

После этого вызывается написанная нами ранее процедура DoSHFileOp, указывая все необходимые параметры. В качестве второго параметра указана операция, которую надо выполнить-- FileOpModelO], что равно команде fo copy. Третий и четвертый параметр -- это пути источника и приемника (откуда и куда надо копировать).

Теперь напишем код для кнопки «Переместить». Для этого в обработчике события onclick соответствующей кнопки пишем следующее (листинг 3.18).

Procedure TForml. MoveButtonClick(Sender: TObject); var

FSrc, FDes, FPath: string; i:Integer; begin FDes := ` `;

If ShellListViewl. Selected=nil then exit;

If not SelectDirectory(`Select Directory', », Fifes) then exit;

FPath:=ShellTreeViewl. Path; if FPath[Length(FPath)]<>'\' then

FPath:=FPath+'\'; FSrc := ¦';

For i := 0 to ShellListViewl. items. Count-1 do if (ShellListViewl. items. item[il . Selected) then fcegin FSrc:=FSrc+

ShellListViewl. Folders[ShellListViewl. Items. Item[I].Index].PathName+

#0;

ShellListViewl, items, itemfi] . Selected--!=false ; end;

FSrc:=FSrc+#0;

DoSHFileOp (Handle, FileOpMode[21, FSrc, FDes, false); end;

Этот код идентичен тому, что мы написали для кнопки Копировать. Разница только в вызове процедуры DoSHFileOp, где мы указываем операцию FileOpMode [2], что означает перемещение. А в остальном там так же определяется директория, из которой нужно копировать, и так же формируется строка из имен файлов для копирования, разделенных нулевым символом.

В обработчике нажатия кнопки «Удалить» пишем следующий код:

DelFNa;me: string; begin

If ShellListViewl. Selected=nil then

Exit;

If FilesListView. isEditing then exit;'

DelFName:='1;

For i := 0 to FilesListView. items. Count-1 do if (FilesListView. items. item[i]-Selected) then begin

DelFWame:=De1FName+

FilesListView. Folders[FilesListView. Items, Item[I].Index].PathName+#0; FilesListView. items. item[i].Selected:=false; end;

DelFName:=DelFName+#0;

DoSHFileOp(Handle, FO__DELETE, DelFName, DelFName, false) ; end;

И снова код похож на тот, что мы уже использовали дважды. Но есть все -- таки две разницы:

1. Мы проверяем, находится ли какой-нибудь файл в режиме редактирования FilesListView. isEditing. Если да, ТО ЕЬМДМ ИЗ процедуры.

2. В вызове процедуры DoSHFileOp в качестве второго параметра мы напрямую указываем константу fodelete, хотя можно было бы указать

Что абсолютно, то же самое.

В обработчике нажатия кнопки «Свойства» напишем следующий код:

Procedure TFoml. PropertiesButtonClick (Sender: TObject) ; var

FPath, FSrc:String; i:Integer;

Begin

If ShellListViewl. Selected=nil then

Exit;

SHObjectProperties(Handle, S02,

PWideChar(WideString(ShellListViewl. Folders[ShellListViewl. Selected. Index] .PathName) ) , nil) ;

End;

Здесь мало строчек кода, но с ним придется разбираться. Сначала происходит простая проверка на выделение. Если пользователь ничего не выбрал, то выходим, иначе в следующей строке произойдет ошибка. Дальше мы вызываем функцию SHObjectProperties, которая отображает стандартное окно свойств объекта. У этой функции 4 параметра:

Указатель на окно-владельца.

Второй параметр может принимать значения $01 для принтера или $02 для пути к файлу или папке.

Так как мы используем файлы и папки, то здесь должен быть полный путь к этому объекту.

Последний параметр оставляем равным nil.

Unit StandardDialogs;

Чтобы проект теперь скомпилировался, нужно сообщить о существовании функции SHObjectProperties, о которой Delphi еще не знает. Для этого создайте файл standardDialogs. pas и напишите в нем следующее:

L$A+,B-,C+,D+,E-,F-,G+,H+,I+,J+rK-,L+rM-,H+,0+(P+,Q-,R-rS-,T-rU-,V+p W-rX+,Y+,Zl)

Interface uses

Windows, Messages, SHlObj,-

Const RFFJJOBROWSE = $01; RFF_NODEFAULT = $02; RFF_CALCDIRECTORY = $04; RFF_MOLRBEL = $08; RFF_NOSEPARATEMEM = $20;

//Notification Return Values //Allow the Application to run. RFjK = $00;

//Cancel the operation and close the dialog. = $01;

//Cancel the operation, tut leave the dialog open. RF_RETRY = $02;

//SHCbjectEteperties Flags OPF^PRINTERNAME = $01; OPF_PATHNAME = $02;

Type

WM^RUNFILEDLG = record hdr: NMHDR;

LpFile: PChar; IpDirectOry: PChar; nShow: Integer; end ;

TSHPicklconDlg = function(hwndOwner: HWND; lpstrFile: LPWSTR;

Var pdwBufferSize: DWord; var lpdwlconlndex: DWord) : Boolean; stdcall;

TSHRunFileDlg = procedure(hwndOwner: HWND; hlcon: HICON;

PChar;

Flags: longint); stdcall;

TSHRestartDlg = function(hwndOwner: HWND;

Reason: PAnsiChar; flag: longint) : Longint; stdcall;

TSHExitWindowsDlg = procedure (hwndOwner: HWND); stdcall;

TSHFirdCcnputer = function (pidlRoot,

PidlSavedSearch: PltemlDList) : Boolean; stdCall; TSHFindFiles = function(pidlRoot,

PidlSavedSearch: PltemlDList) : Boolean; stdcall;

TSHObjectProperties = function(hwndOwner: HWND; uFlags:

Integer; lpstrNarne, lpstrParameters: LPWSTR): Boolean; stcfcall;

TSHCutCfMemoryMessageBox » function (Owner: HWND; Caption: Pointer; style: UINT): Integer; stdcall;

TSHHandleDiskFull = procedure (Owner: HWND; Drive: UINT); stdcall;

Var

SHPicklconDlg: TSHPicklconDlg;

SHHandleDiskFull: TSHHandleDiskFull; ^CutC^fMemDryMessage^;^: TSHCutC^fMemdyMessage^^; SHCbj ectProperties: TSHCbj ectProperties; SHFindConputer: TSHFindConputer; SHFindFiles: TSHFindConputer; SHRunFileDlg: TSHRunFileDlg; SHRestartDlg: TSHRestartDlg; S^^tW^indoKE^l^: TSHExitWimdcwsDlg;

Implementation const

=

Var

HDli: THandle;

Initialization

HDll := LoadLibrary(DllNarne); if hDll <> 0 then begin

// (rom) is load by ID really good? SHPicklconDlg := GetProcAddress(hDll, PChar(62)); SHHandleDiskFull := GetProcAddress(hDll, PChar(185)); SHOutOfMemoryMessageBox GetProcAddress(hDll, PChar(126)); SHObjectProperties := GetProcAddress(hDll, PChar(178)); SHFindComputer := GetProcAddress(hDll, PChar(91)}; SHFindFiles := GetProcAddress (hDll, PChar(90)); SHRunFileDlg GetProcAddress (hDll, PChar(61)); SHRestartDlg : = GetProcAddress (hDll, PChar(59)); SHExitWindowsDlg := GetProcAddress(hDll, PChar(60)); end

Finalization

If hDll <> 0 then FreeLibrary(hDll);

End.

Теперь добавим в раздел uses имя нашего модуля standardDiaiogs и скомпилируем проект. Теперь можно запустить проект и посмотреть результат.

Заключение

Данная курсовая работа помогла прояснить некоторые теоретические и практические вопросы, связанные со средой программирования Delphi, а также с графическими компонентами данной среды программирования.

В курсовой работе был приведен краткий обзор программы Delphi, рассмотрена ее структура, основные примитивы, а также более подробно рассмотрен графические компоненты TShellTreeView, TShellListView, TImage.

Графические компоненты TShellTreeView, TShellListView, TImage были рассмотрены также на основе примера простейшей программы.

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

графический borland delphi компонент

Список используемой литературы

Бобровский, С. И. Технологии Delphi 2006. Новые возможности / С. И. Боб-ровский. - СПб. : Питер, 2006.

Истомин Е.П., Новиков В.В., Новикова М.В. Высокоуровневые методы информатики и программирования: Учебник. - СПб. ООО «Андреевский издательский дом», изд. 2-е, 2008 г.

Культин, Н. Б. Delphi в задачах и примерах / Н. Б. Культин. - СПб. : БХВ-Петербург, 2004.

Культин, Н. Б. Основы программирования в Delphi 7 / Н. Б. Культин. - СПб. : БХВ-Петербург, 2003.

Леоненко А.Н., Руденко А.Е.. Высокоуровневые методы информатики и программирования в среде Delphi: учебное пособие. - Омск: Изд-во ОмГПУ, 2011.

Фаронов, В. В. Delphi 2005. Язык, среда, разработка приложений / В. В. Фаронов. - СПб. : Питер, 2005.

Размещено на http://www.allbest.ru

...

Подобные документы

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

    методичка [788,7 K], добавлен 24.10.2012

  • Borland Delphi 7 как универсальный инструмент разработки, применяемый во многих областях программирования, функции: добавление информации об абитуриентах в базу данных, формирование отчетов. Рассмотрение и характеристика основных компонентов Delphi.

    контрольная работа [3,6 M], добавлен 18.10.2012

  • Разработка программы, аналога Paint системы Windows, с функциями открытия изображения в графическом редакторе и его сохранения, написания текста в любом указанном мышкой месте, изменения шрифта, размера и цвета текста на языке программирования Delphi.

    курсовая работа [278,5 K], добавлен 06.04.2014

  • Сущность программирования с использованием среды Delphi 7 и ее основные графические возможности. Структура автономно компилируемого программного модуля и его принципы. Основные приемы работы с графическими процедурами, построение дуги, круга и эллипса.

    курсовая работа [138,2 K], добавлен 16.12.2011

  • Рассмотрение особенностей среды программирования Delphi, анализ клиент-серверной версии. Знакомство с библиотекой визуальных компонентов. Основные функции интеллектуального редактора. Характеристика требований к базам данных. Функции программы "Магистр".

    дипломная работа [1,5 M], добавлен 10.03.2013

  • Проектирование программного модуля в среде программирования Borland Delphi 7.0. Схемы алгоритмов решения задач по темам "Символьные переменные и строки", "Массивы", "Работа с файлами", "Создание анимации". Реализация программного модуля, код программы.

    отчет по практике [961,6 K], добавлен 21.04.2012

  • История программных продуктов "Borland Software Corporation". Языки программирования Turbo-Pascal, Delphi, CaliberRM, Turbo C++ и основные их принципы работы. Развитие их совместимости с Windows. Создание корпоративных систем на основе Веб-технологий.

    реферат [20,9 K], добавлен 02.04.2010

  • Особенности среды визуального проектирования Borland Delphi 7.0. Этапы разработки программы и составления блок-схемы алгоритмов. Способы вычисления кусочно-заданной функции одной переменной. Рассмотрение компонентов среды Delphi, ее предназначение.

    контрольная работа [703,8 K], добавлен 24.09.2012

  • Исследование особенностей объектно-ориентированной среды программирования Borland Delphi. Описание процесса создания электронного пособия для изучения студентами и применения на уроках преподавателями. Характеристика технических и программных средств.

    дипломная работа [2,3 M], добавлен 10.06.2012

  • Изучение особенностей растровых и векторных графических редакторов. Создание графического редактора: выбор языка программирования, разработка структуры программы и алгоритма работы. Описание интерфейса программы. Руководство программиста и пользователя.

    курсовая работа [1,3 M], добавлен 28.07.2013

  • Разработка графического редактора для рисования двухмерной и трехмерной графики, используя язык программирования Java и интерфейсы прикладного программирования Java 2D и Java 3D. Создание графического редактора 3D Paint. Основные методы класса Graphics.

    курсовая работа [197,5 K], добавлен 19.11.2009

  • Анализ временных рядов. Разработка программы для среды визуального проектирования Borland Delphi 7.0. Математическая формулировка задачи. Структурная схема программы. Описание реализации технологии COM, динамических библиотек, возможностей программы.

    курсовая работа [4,3 M], добавлен 14.11.2010

  • Создание консольных приложений с использованием графического интерфейса пользователя. Содержание палитры компонентов программы С++ Builder. Использование возможностей объектно-ориентированного программирования, особенности редактора кода и форм в С++.

    лекция [27,0 K], добавлен 22.12.2010

  • Основы программирования, работа в консольном режиме Delphi. Правила оформления комментариев. Типы данных, используемые в консольном режиме. Текстовый редактор Delphi Memo. Пример загрузки текстового файла. Примеры решения и оформления простейших задач.

    отчет по практике [2,1 M], добавлен 11.03.2014

  • Середовище розробки програм Borland Delphi, робота компонентів. Створення нових компонентів та використання компонентів Delphi для роботи з базами даних. Системи керування базами даних InterBase та Firebird. Компоненти Delphi для роботи з СКБД FireBird.

    реферат [71,4 K], добавлен 12.04.2010

  • Характеристика и технические возможности СУБД MySQL. Трехуровневая структура MySQL. Требования к аппаратному обеспечению. Создание таблицы, триггеров, генераторов, хранимых процедур в MySQL. Разработка приложения для базы данных с помощью Borland Delphi.

    курсовая работа [940,7 K], добавлен 20.12.2011

  • Изучение основных алгоритмов генерации различных видов фракталов. Выбор языка и среды программирования. Характеристика структурных элементов растрового графического редактора фракталов. Описание интерфейса приложения, порядок редактирования изображений.

    курсовая работа [1,2 M], добавлен 04.04.2014

  • Теоретические основы объектно-ориентированного языка программирования Delphi, изучение среды визуального проектирования приложений. Определение 40-го числа Фибоначчи, составление листинга и блок-схемы программы, тестирование ее на работоспособность.

    курсовая работа [261,1 K], добавлен 25.03.2015

  • Растровые и векторные графические редакторы. Форматы файлов, используемые для хранения графических изображений. Графические редакторы, используемые для создания изображений. Редакторы для создания трехмерных изображений. Создание графического редактора.

    курсовая работа [306,5 K], добавлен 23.08.2013

  • Общая характеристика интерфейса языка программирования Delphi. Рассмотрение окна редактора кода, конструктора формы, инспектора объектов и расширения файлов. Ознакомление с основными этапами создания и сохранения простого приложения; проверка его работы.

    презентация [184,3 K], добавлен 18.03.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.