Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторная работа № 5
Стиль приложений SDI
Цель работы: закрепить навыки создания приложений в стиле SDI, познакомится с компонентами классаTImage и TSpeedButton, научиться использовать инструментальные панели в приложении; освоить работу с буфером обмена.
Термин SDI (Single Document Interface) дословно означает одно-документный интерфейс и описывает приложения, способные загрузить и использовать одновременно только один документ. Программа Notepad, приведенная на рис.1, является ярким представителем такого класса программ. В последнее время приложения становятся все более объекто-центричными, т.е. они работают с неким центральным объектом, в который могут быть внедрены внешние объекты. В общем случае эти внешние объекты обрабатываются другим специализированным приложением. Примером может служить Wordpad, позволяющий внедрять любые OLE-объекты в свои файлы. Но он остается при этом SDI-приложением, так как может работать только с одним объектом (или документом в широком смысле этого слова) Wordpad.
Рис. 1 Программа Notepad как пример SDI-приложения
Способность одновременно работать только с одним объектом не мешает приложению использовать дополнительные формы, например диалоговые окна, панели инструментов и прочее. Для реализации этих возможностей в Delphi просто добавьте форму в ваше приложение и установите ее свойство FormStyle равным fsSizeToolWin или fsToolWindow.
Еще одним примером может служить сама Delphi - огромное количество панелей инструментов, меню, разнообразных библиотек компонентов, взаимодействующих между собой форм... Но в целом она остается SDI-приложением, так как может загрузить и использовать одновременно только один объект.
TImage
TImage позволяет поместить графическое изображение в любое место на форме. Этот объект очень прост в использовании - выберите его на странице Additional и поместите в нужное место формы. Собственно картинку можно загрузить во время дизайна в редакторе свойства Picture (в инспекторе объектов). Картинка должна храниться в файле в формате BMP (bitmap), WMF (Windows Meta File) или ICO (icon).
Как известно, форматов хранения изображений гораздо больше трех вышеназванных (например, наиболее известны PCX, GIF, TIFF, JPEG). Для включения в программу изображений в этих форматах нужно либо перевести их в формат BMP, либо найти библиотеки третьих фирм, в которых есть аналог TImage, “понимающий” данные форматы (есть как VBX объекты, так и “родные” объекты для Delphi).
При проектировании следует помнить, что изображение, помещенное на форму во время дизайна, включается в файл .DPR и затем прикомпилируется к EXE файлу. Поэтому такой EXE файл может получиться достаточно большой. Как альтернативу можно рассмотреть загрузку картинки во время выполнения программы, для этого у свойства Picture (которое является объектом со своим набором свойств и методов) есть специальный метод LoadFromFile(Имя файла).
Важными являются свойства объекта Center и Stretch - оба имеют булевский тип. Если Center установлено в True, то центр изображения будет совмещаться с центром объекта TImage. Если Stretch установлено в True, то изображение будет сжиматься или растягиваться таким образом, чтобы заполнить весь объект TImage.
Приложение для просмотра изображений
Для демонстрации SDI создадим простую программу просмотра изображения.
Обычно первым шагом построения программы является создание интерфейса. Для этого выполните следующие действия:
1. Выберите команду File/New Application, и появится пустое приложение. (Delphi по умолчанию создает именно SDI-приложение. Однако хранилище объектов предоставляет возможность назначить новый шаблон проекта по умолчанию).
2. Установите следующие свойства форм.
Свойство Значение
Caption Image Viewer
Name frmMain
ShowHint True
3. Поместите компонент TPanel в форму. Установите следующие его свойства.
Свойство Значение
Align alTop
Caption
4. Поместите три компонента TSpeedButton (страница Additional
) в TPanel и назовите их SBLoad, SBStretch и SBCenter. Установите следующие их свойства.
Свойство Значение
SBLoad.Hint Load
SBLoad.Left 8
SBLoad.Top 8
SBStretch.AllowAlIUp True
SBStretch.Grouplndex 1
SBStretch.Hint Stretch
SBStretch.Left 48
SBStretch.Top 8
SBCenter.AllowAlIUp True
SBCenter.Grouplndex 2
SBCenter.Hint Center
SBCenter.Left 80
SBCenter.Top 8
5. Поместите еще одну Panel в форму и установите следующие ее свойства.
Свойство Значение
Align alClient
Caption
6. Поместите компонент ТImage (страница Additional ) во вновь созданную ТPanel и установите следующие его свойства.
Свойство Значение
Align alClient
Name ImgMain
7. Добавьте в форму TOpenDialog (страница Dialogs , или, что предпочтительнее для данной задачи, TOpenPictureDialog ) со следующими свойствами.
Свойство Значение
Filter Bitmaps (*.bmp)|*.bmp
Name opndlgLoad
Options [ofPathMustExist,ofFileMustExist]
Свойство Options определяет условия выбора файла. Множество опций, которые вы можете установить программно или во время проектирования, включает:
OfAllowMultiSelect Позволяет пользователю выбирать несколько файлов
OfCreatePrompt В случае, если пользователь написал имя несуществующего файла, появляется замечание и запрос, надо ли создать файл с заданным именем
OfEnableIncludeNotify Разрешает посылать в диалог сообщения
OfEnableSizing Разрешает пользователю изменять размер диалогового окна
OfExtensionDifferent Этот флаг, который можно прочитать после выполнения диалога, показывает, что расширение файла, выбранного пользователем, отличается от DefaultExt
OfFileMustExist В случае, если пользователь написал имя несуществующего файла, появляется сообщение об ошибке
OfHideReadOnly Удаляет из диалога индикатор Открыть только для чтения
OfNoChangeDir После щелчка пользователя на кнопке OK восстанавливает текущий каталог, независимо от того, какой каталог был открыть при поиске файла
OfNoDereference Links Запрещает переназначать клавиши быстрого доступа в диалоговом окне
OfNoLongNames Отображаются только не более 8 символов имени и трех символов расширения
OfNoNetworkButton Убирает из диалогового окна кнопку поиска в сети. Действует только если флаг ofOldStyleDialog включен
OfNoReadOnlyReturn Если пользователь выбрал файл только для чтения, то генерируется сообщение об ошибке
OfNoTestFile Create Запрещает выбор в сети защищенных файлов и не доступных дисков при сохранении файла
OfNoValidate Не позволяет писать в именах файлов неразрешенные символы, но не мешает выбирать файлы с неразрешенными символами
OfOldStyleDialog Создает диалог выбора файла в старом стиле
OfOverwritePrompt В случае, если при сохранении файла пользователь написал имя существующего файла, появляется замечание, что файл с таким именем существует и запрашивается желание пользователя переписать существующий файл
OfPathMustExist Генерирует сообщение об ошибке, если пользователь указал в имени файла несуществующий каталог
OfReadOnly По умолчанию устанавливает индикатор Открыть только для чтения при открытии диалога
OfShareAware Игнорирует ошибки нарушения условий коллективного доступа и разрешает, несмотря на них, производить выбор файла
OfShowHelp Отображает в диалоговом окне кнопку Справка
По умолчанию все перечисленные опции, кроме ofHideReadOnly, выключены. Многие из них полезно включить перед вызовом диалогов.
Если вы разрешаете с помощью опции множественный выбор файла, то список выбранных файлов можно прочитать в свойстве Files типа TStrings.
Delphi предоставляет вам множество значков для компонента TSpeedButton; они находятся в каталоге Program Files\Common Files\Borland Shared\Images\Buttons. Для вас вполне подойдут следующие установки свойств Glyph.
Свойство Значение
SBLoad.Glyph FLDROPEN.BMP
SBStretch.Glyph FONTSIZE.BMP
SBCenter.Glyph PICTURE.BMP
Теперь нужно сохранить проект, выбрав в меню команду File/Save Project As. Сохраните Unit1 как Main, а проект как EgSDIApp.
Теперь, после создания интерфейса, перейдем к написанию исходного текста вашего приложения. Сначала загрузите изображение следующим образом.
1. Дважды щелкните на компоненте SBLoad, и Delphi выведет окно редактора и автоматически создаст обработчик события OnClick.
2. Введите код.
if opndlgLoad.Execute then
imgMain.Picture.LoadFromFile(opndlgLoad.FileName);
Метод opndlgLoad.Execute вызывает стандартное диалоговое окно открытия файла. Если вы выбрали файл и щелкнули на ОК, метод возвращает True и загружает в свойство FileName полный путь к имени файла. При щелчке на Cancel или нажатии клавиши <ESC> метод вернет False.
Компонент TImage предоставляет свойство Picture, которое является экземпляром класса TPicture. Этот класс обеспечивает работу с растровыми изображениями, пиктограммами и метафайлами. Один из его методов, LoadFromFile, служит для загрузки изображения по имени файла.
Запустите приложение и попытайтесь открыть картинку.
Теперь добавьте возможность растягивания изображения.
1. Дважды щелкните на компоненте SBStretch, и Delphi выведет окно редактора и автоматически создаст обработчик события OnClick.
2. Введите код.
imgMain.Stretch:= SBStretch.Down;
Компонент TSpeedButton имеет свойство Down, которое равно True при нажатой кнопке. Свойство Stretch класса TImage позволяет растянуть картинку.
Для выравнивания картинки по центру воспользуйтесь приведенной выше инструкцией (только используйте компонент spbtnCenter) и введите следующий код:
imgMain.Center:= SBCenter.Down;
Возможность редактирования изображений вам предоставится в следующих лабораторных работах. А теперь займемся вопросами редактирования текстов.
TMemo и работа с буфером обмена
Как вам известно, компоненты класса TMemo поддерживают работу с большими текстами и автоматически выполняют функции большинства редакторов, имеют "горячие" клавиши для быстрого редактирования: Ctrl-C - копирование выделенного текста в буфер обмена Clipboard (команда Copy), Ctrl-X - вырезание выделенного текста в буфер Clipboard (команда Cut), Ctrl-V - вставка текста из буфера Clipboard в позицию курсора (команда Paste), Ctrl -Z - отмена последней команды редактирования.
Компоненты Memo (Edit, MaskEdit) имеют простые в использовании средства, предназначенные для пересылки данных с помощью буфера обмена:
CopyToClipboard - Копирует выделенный текст в компоненте редактирования в Clipboard в формате CF_TEXT;
CutToClipboard - Переносит выделенный текст в Сlipboard в формате CF_TEXT и уничтожает его в окне;
PasteFromClipboard - Переносит в окно текст из буфера Clipboard.
Например, если вы хотите чтобы при нажатии на кнопку выделенный текст компонента Memo1 скопировался в буфер обмена, в обработчике события onClick этой кнопки надо задать: Memo1.CopyToClipboard;
Вот еще несколько методов, которые часто используются в работе:
SelectAll - Выделяет весь текст в окне редактирования;
Undo - Отменяет все изменения, хранившиеся в буфере отмены результатов редактирования с момента последнего вызова ClearUndo;
ClearUndo - Очищает буфер отмены команд редактирования, так что никакие изменения в тексте после этого не могут быть отменены;
Clear - Удаляет текст из окна;
ClearSelection - Удаляет текст, выделенный в окне.
Весь текст содержится в свойстве Text.
SelLength, SelStart, SelText - определяют соответственно длину выделенного текста, позицию перед первым символом выделенного текста и сам выделенный текст.
Свойство Lines, доступное как во время проектирования, так и во время выполнения, имеет множество свойств и методов типа TStrings, которые обычно используются для формирования и редактирования текста:
Count : Integer - Число строк в списке. Свойство только для чтения.
Names[Index: Integer] String Применяется для списков, имеющих структуру "Имя = Значение". Такую структуру имеют, например, файлы .ini. Свойство Names возвращает Имя, использованное в строке с указанным индексом. Если строка не имеет форму "Имя = Значение", возвращается пустая строка. Свойство только для чтения.
Strings[Index: Integer] : String - Текст строки с указанным индексом. Индекс первой строки - 0.
Text : String - Представляет весь список как одну строку, внутри которой используются разделители типа символов возврата каретки и перевода строки.
Values[const Name:string] : String - Применяется для списков, имеющих структуру "Имя = Значение". Такую структуру имеют, например, файлы .ini. Свойство Values возвращает Значение, в строке с указанным именем Name. Если заданное имя Name не найдено, возвращается пустая строка.
Add (const S:string) : Integer - Добавляет строку в конец списка. Возвращает индекс добавленной строки. В окнах редактирования добавляемая строка может оказаться разбитой на несколько, так что в этих случаях возвращаемый индекс ни о чем не говорит.
AddObject( const S: string; AObject:TObject) : Integer - Добавляет в список строку и связанный с ней объект. Возвращает индекс добавленной строки и объекта.
AddStrings(Strings:TStrings) - Добавляет в список группу строк другого объекта Strings типа TStrings.
Append(const S: string) - Добавляет строку в конец списка. Метод аналогичен Add, но не возвращает индекс строки.
Clear - Очищает список.
Delete (Index: Integer) - Удаляет из списка указанную строку.
Equals(Strings: TStrings): Boolean - Сравнивает данный список с заданным списком Strings. Возвращает true при идентичности списков.
Exchange (Index1, Index2: Integer) - Переставляет местами указанные строки списка.
GetText: PChar - Возвращает буфер, под который выделяет память, и заполняет его значением свойства Text.
IndexOf (const S: string): Integer - Возвращает индекс указанной строки S. Если такой строки нет в списке, возвращается -1.
IndexOfName(const Name: string): Integer - Применяется для списков, имеющих структуру "Имя = Значение". Такую структуру имеют, например, файлы .ini. Возвращается индекс строки, в которой имя равно заданному значению Name. Если такой строки нет в списке, возвращается -1.
IndexOfObject(AObject: TObject): Integer - Возвращает индекс первой строки, связанной с заданным объектом. Если такой строки нет в списке, возвращается -1.
Insert ( Index: Integer;0 const S: string) - Вставляет указанную строку S в заданную позицию Index. Если Index=0, строка вставляется на первую позицию.
InsertObject( Index: Integer; const S: string; AObject: TObject) - Вставляет указанную строку S в заданную позицию Index и связывает с ней объект AObject. Если Index=0, строка вставляется на первую позицию.
LoadFromFile(const FileName: string) - Заполняет список строками текста из указанного файла FileName.
LoadFromStream( Stream: TStream) - Заполняет список строками текста из указанного потока Stream.
Move (CurIndex, NewIndex: Integer) - Изменяет позицию строки с индексом CurIndex, давая ей индекс NewIndex.
SaveToFile(const FileName: string) - Сохраняет строки списка в файле с указанным именем.
SaveToStream( Stream: TStream) - Сохраняет значение свойства Text в указанном потоке.
SetText(Text: PChar) - Задает значение свойства Text.
Потоки
Компоненты Memo (Edit, MaskEdit) поддерживают работу с потоками. Например, рассмотрим поток TMemoryStream, который хранит данные в динамической памяти.
procedure TForm1.Button1Click(Sender: TObject);
var TempStream : TMemoryStream;
begin
TempStream := TMemoryStream.Create;// Создается поток
ListBox1.Items.SaveToStream(TempStream);// Передаем данные в поток
TempStream.Position := 0; // Устанавливаем указатель на первую
//запись потока
RichEdit1.Lines.LoadFromStream(TempStream); // Загружаем данные из
// потока в RichEdit1
TempStream.Free; // Удаляем поток
end;
Задания на разработку:
1. Создайте приложение, позволяющее просматривать графические файлы, руководствуясь примером, рассмотренным в лабораторной работе. Результат сравните с примером, который находится в каталоге с лабораторной работой \Example1.
2. Модифицируйте приложение так, чтобы при открытии какого либо конкретного рисунка (например, baby.bmp) выдавалось сообщение о невозможности его открытия и сам рисунок не показывался на экране.
3. Создайте текстовый редактор, позволяющий производить запись и чтение текстовых файлов, операции вставки и удаления текста с помощью верхнего меню и подвижной инструментальной панели.Инструментальную панель можно создать используя компонент TToolBar (страница Win32). Результат сравните с примером, который находится в каталоге с лабораторной работой \Example2.
4. Создайте приложение, в котором все введенные слова в компонент Memo записывались наоборот.
5. Создайте приложение, в котором информация по требованию пользователя записывалась в поток и считывалась из него. Результат сравните с примером, который находится в каталоге с лабораторной работой \Example3.
Контрольные вопросы