10228

Стиль приложений SDI

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа № 5 Стиль приложений SDI Цель работы: закрепить навыки создания приложений в стиле SDI познакомится с компонентами классаTImage и TSpeedButton научиться использовать инструментальные панели в приложении, освоить работу с буфером обмена. Термин SDI Single Document ...

Русский

2013-03-24

94 KB

4 чел.

Лабораторная работа № 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.

Контрольные вопросы

  1.  Какими свойствами обладают приложения стиля SDI?
  2.  Какими свойствами обладает кнопка TSpeedButton в отличии от TButton?
  3.  Как создать инструментальную панель в приложении?
  4.  Для чего используется компонент TImage, какими методами и свойствами он обладает?
  5.  Какие методы и свойства класса TStrings вы знаете?
  6.  Как компонеты TEdit, TMemo работают с буфером обмена?
  7.  Как произвести обработку выделенного текста в Memo?
  8.  Каким образом можно обратится к какой-либо конкретной строке компонента Memo?
  9.  Что такое поток TStream?
  10.   Как происходит взаимодействие компонентов TMemo, TEdit и др. с потоками?


 

А также другие работы, которые могут Вас заинтересовать

78271. Определение положения точек земной поверхности, системы координат 125.83 KB
  Определение положения точек земной поверхности системы координат Топографическое изучение земной поверхности заключается в определении положения ситуации и рельефа относительно математической поверхности Земли т. в определении пространственных координат характерных точек необходимых и достаточных для моделирования местности. Модель местности может быть представлена в виде геодезических чертежей изготовление которых называют картографированием и аналитически – в виде совокупности координат характерных точек. Для построения моделей...
78272. Масштабы топографических карт планов 25.89 KB
  Масштаб карты это отношение длины отрезка на карте к его действительной длине на местности. Масштаб от немецкого мера и Stb палка отношение длины отрезка на карте плане аэро или космическом снимке к его действительной длине на местности. Именованный словесный масштаб вид масштаба словесное указание того какое расстояние на местности соответствует 1 см на карте плане снимке. Так как длины линий на местности принято измерять в метрах а на картах и планах в сантиметрах то масштабы удобно выражать в словесной форме...
78273. Нивелирование трассы 50.9 KB
  Закрепление трассы по высоте Вдоль всей разбитой на местности трассы но за пределами зоны работ закрепляются точки называемые реперами. Чтобы не пропустить пикеты и плюсовые точки нивелировщик должен иметь пикетажный журнал трассы. За связующие точки принимают пикеты или плюсовые точки но чтобы расстояние между ними не более 150 м а превышения несколько меньше длины рейки. Нивелирование трассы Отсчеты по рейкам установленным на связующие точки берут в следующей последовательности: 1 по черной стороне рейки на заднюю точку Зч; 2 по...
78274. Условные знаки. Классификация топографических (картографических) условных 37.03 KB
  Условные знаки. Классификация топографических картографических условных знаков Топографические картографические условные знаки символические штриховые и фоновые условные обозначения объектов местности применяемые для их изображения на топографических картах. Для топографических условных знаков предусмотрена общность обозначений по начертанию и цвету однородных групп объектов при этом основные знаки для топографических карт разных стран не имеют между собой особых различий...
78275. Рельеф местности и его изображение на топографических картах и планах 396.95 KB
  Основные формы рельефа и их элементы; характерные точки и линии. При проектировании и строительстве железных автомобильных и других сетей необходимо учитывать характер рельефа – горный холмистый равнинный и др. Рельеф земной поверхности весьма разнообразен но все многообразие форм рельефа для упрощения его анализа типизировано на небольшое количество основных форм...
78276. Ориентирование направлений 97.22 KB
  При этом положение линии определяют с помощью соответствующих углов ориентирования: дирекционного угла истинного или магнитного азимута. В этом случае положение линии местности относительно осевого меридиана определяет угол ориентирования называемый дирекционным рис. Дирекционные углы Для линии ОА её дирекционным углом в точке О является горизонтальный угол αО между северным направлением осевого меридиана и направлением линии. Таким образом дирекционным углом является угол в горизонтальной плоскости отсчитываемый от северного направления...
78277. Определение прямоугольных координат точек 475.32 KB
  Определение прямоугольных координат точек. Широта φ это угол образованный нормалью данной точки к плоскости эллипсоида и плоскостью экватора. Долгота λ это двугранный угол образованный плоскостью нулевого гринвичского меридиана и плоскостью меридиана в данной точке М Широта и долгота полностью не отражают положение точки в пространстве необходимо знать 3ю координату – высоту. Х Y Система плоских прямоугольных координат Гаусса-Крюгера Для того чтобы воспользоваться прямоугольной системой координат необходимо земной эллипсоид...
78278. Сущность измерений. Классификация и виды геодезических измерений. Линейные измерения 105.6 KB
  Основные положения регламентирующие номенклатуру и структуру органов и служб стандартизации в стране их компетенцию устанавливает ГОСТ Государственная система стандартизации. Межгосударственный стандарт Государственной системы обеспечения единства измерений ГОСТ 8. Фундаментальные физические константы ГОСТ Р 8. Основные положения ГОСТ 8.