Основы алгоритмизации и программирования - Учебное пособие (Струков В.М.)

7. развитые средства диалогового интерфейса

7.1. Диалоги

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

В Delphi для реализации диалогов предназначена палитра компонентов Dialogs. Компоненты этой палитры позволяют реализовать следующие стандартные диалоги Windows.

OpenDialog – выбор имени открываемого файла.

SaveDialog – выбор имени сохраняемого файла.

OpenPictureDialog – открытие графического файла.

SavePictureDialog  - -//-//-//-//-//-//-//-;

FontDialog – настройка параметров шрифта;

ColorDialog – выбор цвета;

PrintDialog – вывод на печать;

PrinterSetupDialog – настройка принтера;

FindDialog – поиск файла;

ReplaceDialog – поиск с заменой.

Активизация диалога.

При размещении компонента, реализующего один из перечисленных диалогов, на форме он отображается в виде небольшой пиктограммы. Но для активизации диалога во время работы приложения этого мало. В отличие от многих других визуальных компонентов, диалоги автоматически при запуске приложения на выполнение не появляются на экране. Для этого их нужно активизировать программным путем с помощью метода Execute, который является общим для всех диалогов палитры Dialogs. Этот метод является функцией и возвращает значение типа Boolean: True – если диалог завершен успешно (например, нажатием кнопки Оk, Открыть или Сохранить), и False – в противном случае, т.е., если диалог отменен. Активизация диалога может быть выполнена нажатием соответствующей командной кнопки или другим способом. Для этого в обработчике соответствующего события должен быть записан оператор следующего вида:

If OpenDialog1.Execute Then  {действие при положительном завершении}

Else  {действие при отмене диалога};

7.1.1. Работа с произвольными файлами.

Для выполнения операции выбора имени открываемого или сохраняемого произвольного файла в Delphi используются два компонента – OpenDialog и  SaveDialog.

OpenDialog – компонент , реализующий процедуру выбора имени открываемого файла посредством предоставления пользователю стандартного окна Windows, которое имеет следующий вид:

Компонент SaveDialog  отличается от OpenDialog только заголовком окна и предназначен для реализации процедуры выбора имени сохраняемого файла.

Основными свойствами компонентов OpenDialog и SaveDialog являются:

FileName – свойство типа String, содержит полное имя выбранного в диалоге файла; Это значение, как правило, определяется в ходе выполнения программы в процессе самого диалога. Вместе с тем программист имеет возможность задать имя открываемого файла, которое предлагается по умолчанию сразу после активизации диалога. Для этого необходимо в процессе визуального конструирования   приложения  выполнить следующие действия:

щелкнуть мышкой в поле значения свойства FileName по значку , после чего на экране появится окно такого же вида, что и на рис. 7.1.;

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

Title – свойство типа String, содержит заголовок окна; если значение этого свойства явно не установлено, то по умолчанию окну присваивается заголовок Открыть (для компонента OpenDialog) или Сохранить (для компонента SaveDialog);

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

OpenDialog1.InitialDir:=’C:Delphi7Source’;

DefaultExt   – свойство типа String, задает тип расширения имени файла, который задается по умолчанию (если он не задан в явном виде);  

Filter – это массив типа String; каждый элемент массива содержит шаблон (маску) имен файлов, который отображается в поле «Тип файла». Это свойство определяет файлы, которые будут отображаться в рабочем поле окна диалога. По умолчанию задается пустая строка (эквивалентно *.* - все файлы). Значения массива можно формировать в Инспекторе объектов и программным путем. В первом случае фильтр формируются по щелчку на значке  в поле значения свойства, после чего на экране появляется окно вида:

которое представляет собой редактор фильтра. В левой колонке вводится имя шаблона, которое будет отображаться в поле «Тип файла» (например, «текстовые файлы»); в правой колонке вводится сам шаблон (фильтр) групповое имя (например, *.*). Таких строк может быть несколько. Для формирования фильтра программным путем можно использовать оператор следующего вида:

         OpenDialog1.Filter:=’Все файлы|*.*|Ехе-фалы|*.exe’;

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

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

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

 ofNoChangeDir – запрещает смену каталога;

ofShowHelp – включает в окно кнопку Help;

ofAllowMultiSelect – разрешает выбирать из списка более одного файла;

ofFileMustExist – разрешает выбор только существующих файлов;

ofCreatePrompt – при вводе имени несуществующего файла выдается запрос на создание файла.

Пример использования диалога OpenDialog.

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

При нажатии кнопки Открыть активизируется окно диалога открытия файла. Выбранный в процессе диалога файл будет загружен в поле Memo1. При этом нужно учесть, что в Memo корректно отображаются только тексты в кодировке ANSI. Результат работы программы выглядит следующим образом:

7.1.2. Работа с графическими файлами.

Для выбора имени открываемого и сохраняемого графического файла в Delphi используются компоненты  OpenPictureDialog  и SavePictureDialog.

 Эти компоненты отличаются от предыдущих двумя факторами: 1) в окне диалога справа от списка имен файлов помещено окно для предварительного просмотра рисунка; 2) свойство Filter  по умолчанию установлено для отображения графических файлов следующих форматов: *.jpg, *.jpeg, *.bmp, *.ico, *.emf, *.wmf .

Кроме того, на этапе выполнения значение свойства Filter  можно установить с помощью специальной функции GraphicFilter, обращение к которой имеет следующий вид:

OpenPictureDialog1.Filter:=GraphicFilter(GraphicClass:TGraphicClass):string;

Здесь параметр GraphicClass может принимать одно из следующих значений:

TBitmap – файлы с расширением *.bmp;

TIcon – файлы с расширением *.ico;

TMetafile – файлы с расширением *.emf, *.wmf;

TJPEGImage – файлы с расширением *.jpg, *.jpeg;

TGraphic – все перечисленные выше файлы.

Пример обращения:

OpenPictureDialog1.Filter:=GraphicFilter(TBitmap);

Все остальные примы работы с графическими диалогами такие же как и с диалогами OpenDialog и SaveDialog.

7.1.3. Выбор параметров шрифта.

Как было рассмотрено ранее, практически все визуальные компоненты обладают свойством Font, которое определяет такие параметры шрифта, как размер символов, тип шрифта, начертание (жирный, курсив и т.п.) и др. Для формирования значений этого свойства в процессе выполнения программы посредством диалога в Delphi используется компонент  FontDialog . Активизированное окно FontDialog имеет вид:

К основным свойствам компонента FontDialog относятся следующие:

Font – комплексное свойство типа TFont, определяющее параметры шрифта (подсвойства Syile, Size, Color и др.); доступно как на этапе визуального программирования так и в процессе выполнения программы;

MinFontSize, MaxFontSize – свойства типа Integer, которые задают диапазон возможных значений размера шрифта. Значения этих свойств задаются в пунктах (1 пункт равен около 0,36 см.). Если значения свойств установлены в 0, то ограничение на размер шрифта отсутствует.

Device – свойство типа TFontDialogDevice, которое задает тип устройства, для которого устанавливается шрифт, и может принимать следующие значения:

  fdScreen – задает вывод на экран;

  fdPrinter – задает вывод на принтер;

  fdBoth – задает вывод на экран и принтер.

Options – комплексное свойство типа TFontDialogOptions, которое содержит более десяти подсвойств типа Boolean:

и используется для настройки определенных параметров диалога.

Наиболее важными подсвойствами являются следующие:

fdEffects – включает в окно диалога переключатели Подчеркнутый и Зачеркнутый и список выбора цвета шрифта;

  fdLimitSize – активизация свойств MinFontSize, MaxFontSize, устанавливающая режим ограничения на размер шрифта;

  fdTrueTypeOnly - устанавливает отображение в списке только шрифтов TrueType;

  fdWysiwyg – устанавливает отображение в списке шрифтов, доступных одновременно и для экрана и для принтера.

      

По умолчанию в значение True установлено только подсвойство fdEffects.

Пример. Установка параметров шрифта сообщений, которые будут выводиться в поле вывода Label1:

If FontDialog1.Execute Then Label1.Font:= FontDialog1.Font;

7.1.4. Выбор цвета.

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

 

Основными свойствами компонента ColorDialog являются следующие:

Color – свойство типа Tcolor  задает значение цвета заливки, которое в процессе выполнения программы можно использовать применительно к различным визуальным компонентам.

Options - свойство типа TcolorDialogOptions  используется для настройки определенных режимов работы диалога ColorDialog и содержит пять подсвойств типа Boolean:

cdFullOpen – задает отображение дополнительной панели выбора цвета; если это свойство установлено в значение True, то активизированное окно диалога ColorDialog имеет вид, представленный на следующем рисунке:

cdPreventFullOpen – свойство, позволяющее отключить кнопку Определить цвет>> (игнорируется при включенном свойстве cdFullOpen);

cdShowHelp – задает отображение кнопки Help/Справка;

cdSolidColor – определяет выбор вместо выбранного ближайшего сплошного цвета;

cdAnyColor – определяет выбор несплошных цветов.

По умолчанию все подсвойства выключены.

Пример применения диалога ColorDialog:

If  ColorDialog1.Execute Then Label1.Color:= ColorDialog1.Color;

7.1.5. Диалоги поиска и замены строк.

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

Компонент FindDialog  реализует диалоговое окно для ввода строки, подлежащей последующему поиску в тексте. Активизированное окно диалога имеет следующий вид:

Основными свойствами компонента FindDialog  являются следующие:

FindText -  свойство типа String содержит строку, введенную в ходе диалога в поле «Что»;

Options – комплексное свойство типа TFindOptions содержит более десяти подсвойств типа Boolean, которые используются для настройки определенных параметров диалога.

Компонент ReplaceDialog  реализует диалоговое окно для ввода двух строк: одной - подлежащей поиску в тексте, и второй – той, которой будет заменена найденная в тексте первая строка. Активизированное окно диалога ReplaceDialog имеет следующий вид:

Введенные в поля Что и Чем строки запоминаются в свойствах FindText и ReplaceText, соответственно.

7.1.6. Диалоги работы с принтером.

Для реализации интерфейса взаимодействия с принтером в Delphi используются два компонента палитры Dialogs – PrintDialog  и PrinterSetupDialog  .

7.2. Индикаторы.

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

На примере наиболее характерных индикаторов рассмотрим технику работы с ними.

Компонент ProgressBar , расположенный в палитре Win32, и компонент  Gauge  из палитры  Samples.

Компонент ProgressBar является наиболее часто применяемым и удобным индикатором процесса в системе Windows. Он в палитре Win32. Этот индикатор, к примеру, используется практически во всех программах инсталляции программных продуктов. Визуально он представляет собой вертикальную или горизонтальную прямоугольную полоску, заполняемую по ходу выполнения процесса:

Основными свойствами этого компонента являются:

Position – свойство типа  integer, определяет степень выполнения отображаемого процесса (заполненную часть индикатора);

Min – свойство типа  integer, задает минимальное (стартовое) числовое значение свойства Position (по умолчанию равно 0);

Max – свойство типа  integer, задает максимальное (конечное) числовое значение свойства Position (по умолчанию равно 100);

Orientation – ориентация расположения индикатора, может принимать одно из двух предопределенных значений: pbHorizontal (горизонтальное положение) и  pbVertical  (вертикальное положение);

Step - свойство типа  integer, задает величину шага, на которую изменяется значение Position при обращении к процедуре StepIt; по умолчанию равно 10.

Управление процессом изменения состояния индикатора осуществляется во время выполнения приложения. Для этой цели используется либо непосредственное управление значением свойства Position с помощью, к примеру, оператора присваивания:

ProgressBar1.Position:=ProgressBar1.Position+20;

либо две стандартные процедуры – StepBy и StepIt. Процедура StepBy изменяет значение свойства Position на величину Delta типа Integer, которая используется в качестве аргумента. Формат обращения к процедуре -StepBy(Delta); Например: 

         Var Delta:integer;

. . .

         Delta:=20;

. . .

ProgressBar1.StepBy(Delta);  

или: ProgressBar1.StepBy(20);

Процедура  StepIt изменяет значение свойства Position на величину Step. Эта процедура используется без аргументов:

StepIt;

Компонент  Gauge  является многозначным компонентом (имеющим различное визуальное представление в зависимости от конкретных значений его свойств) и позволяет отображать ход выполнения некоторого процесса в одном из следующих видов:

1) вертикально заполняемый прямоугольник;

2) горизонтально заполняемый прямоугольник;

3) спидометр со стрелкой;

4) круговая диаграмма;

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

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

gkHorizontalBar – горизонтально заполняемый прямоугольник; 

gkVerticalBar – вертикально заполняемый прямоугольник;

grNeedle –  спидометр со стрелкой;

gkPie –  круговая диаграмма;

gkText –  прямоугольник с изменяющимся текстовым значением части выполненного процесса в процентах.

Вид каждого из индикаторов в соответствии со значениями свойства Kind представлен на следующем рисунке:

 

К основным свойствам компонента Gauge, кроме вышерассмотренного Kind, отнесем следующие:

Progress – свойство типа  integer, определяющее степень выполнения отображаемого процесса (аналог свойства Position индикатора ProgressBar);

MinValue – свойство типа  integer, задает минимальное (стартовое) числовое значение свойства Progress (по умолчанию равно 0);

MaxValue – свойство типа  integer, задает максимальное (конечное) числовое значение свойства Progress (по умолчанию равно 100);

ForeColor – свойство типа TColor, принимающее значение из предопределенного списка именованных констант (clRed, clGreen и т.д., по умолчанию - clBlack).

Управление процессом изменения состояния индикатора осуществляется во время выполнения приложения путем непосредственного управления значением свойства Progress с помощью, к примеру, оператора присваивания:

Gauge1.Progress:= Gauge1.Progress+15;

Компонент  TrackBar. Два вышерассмотренных компонента предназ-начены  для отображения хода выполнения некоторого процесса. На практике часто возникают ситуации, когда процессом должен управлять пользователь (например, управление громкостью и тоном воспроизведения звука). Для реализации таких ситуаций в Delphi предназначен компонент  TrackBar    из палитры Win32. Визуально он представляет собой регулятор, который можно перетаскивать мышкой вдоль шкалы изменения некоторой величины, тем самым вручную устанавливая требуемое значение:

Отметим, что значением регулятора можно управлять также и программным путем, как в компонентах ProgressBar и Gauge.

К основным свойствам компонента относятся:

Position – свойство типа Integer, определяет текущее положение регулятора; доступно в Инспекторе объектов и на этапе выполнения программы;

Min – свойство типа Integer,  задает минимальное значение диапазона изменения регулируемой величины;

Max – свойство типа Integer, задает максимальное значение диапазона изменения регулируемой величины;

Orientation – свойство, определяющее ориентацию расположения компонента на форме, принимает значение из списка предопределенных именованных констант:

- trHorizontal – горизонтальное расположение;

- trVertical -  вертикальное расположение;

Frequency - свойство типа Integer,  определяет частоту нанесения меток на шкале индикатора: 1 – каждое значение регулируемой величины имеет свою метку, 2 – каждое второе значение регулируемой величины имеет свою метку и т.д.

Для реакции программы на изменение положения регулятора пользователем можно воспользоваться обработчиком события OnChange. В качестве примера рассмотрим программу, которая при каждом изменении положения регулятора TrackBar  устанавливает в такое же положение индикатор ProgressBar:

procedure TForm1.TrackBar1Change(Sender: TObject);

begin

 ProgressBar1.Position:=TrackBar1.Position;

end;

Аналогичные функции выполняет также регулятор ScrollBar из палитры  Standard.