18.5. КОМПОНЕНТЫ СТРАНИЦЫ DIALOGS

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

Работа со стандартными диалоговыми окнами осуществляется в три этапа.

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

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

Открыть файл может вызвать метод Execute Диалога TOpenDialog, обработчик нажатия инструментальной кнопки сохранить может вызвать такой же метод у компонента TSaveDialog и т. д. Только после обращения к Execute на экране появляется соответствующее диалоговое окно. Окно диалога является модальным окном, поэтому сразу после обращения к Execute дальнейшее выполнение программы приостанавливается до тех пор, пока пользователь не закроет окно. Поскольку Execute - логическая функция, она возвращает в программу True, если результат диалога с пользователем был успешным.

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

Проиллюстрируем сказанное следующим примером. Создадим простую программу для просмотра содержимого текстового файла. Для этого на пустую форму поместите компонент TOpenDialog, a также кнопку TButton и редактор TMето. При работе программы щелчок по кнопке будет сигналом о необходимости загрузить в редактор новый файл. Создайте такой обработчик события OnClick этой кнопки:

procedure TForm1.Button1Click(Sender: TObject);

var

S: String;

F: TextFile;

begin

// Настраиваем диалог на отбор текстовых файлов:

OpenDialogI.Filter :== 'Текстовые файлы|*.txt|'+ 'Файлы Паскаля|*.pas';

// Выполняем диалог и анализируем его результат if OpenDialogI.Execute and FileExists(OpenDialogI.FileName) then

begin

// Результат успешный - пользователь выбрал файл

// Открываем файл

AssignFile(F, OpenDialogI.FileName) ;

Reset(F);

Memol.Lines.Clear; // Очищаем редактор

while not EOF(F) do // и наполняем его

begin

ReadLn(F, S) ;

Memol.Lines.Add(S)

end;

CloseFile(F)

end

end;

18.5.1. TOpenDialog и TSaveDialog - диалоги открытия и сохранения файлов

Эти компоненты имеют идентичные свойства и поэтому рассматриваются вместе. Пример окна TOpenDialog показан на рис. 18.38.

Свойство FileName: string содержит маршрут поиска и выбранный файл при успешном завершении диалога. Программа может использовать это свойство для доступа к файлу с целью читать из него данные (TOpenDialog) или записывать в него (TSaveDialog). Замечу, что пользователь может ввести произвольное имя и, следовательно, указать несуществующий файл. Для записи это не имеет значения, но при чтении отсутствие файла может привести к краху программы. Чтобы избежать этого, можно проверить существование файла глобальной функцией FileExists, как это сделано в предыдущем примере, или использовать механизм обработки исключительных ситуаций.

Рис. 18.38 . Стандартное окно TOpenDialog

Свойство Filter: string используется для фильтрации (отбора) файлов, показываемых в диалоговом окне. Это свойство можно устанавливать с помощью специального редактора на этапе конструирования формы или программно, как это сделано в предыдущем примере. Для доступа к редактору достаточно щелкнуть по кнопке в строке Filter окна Инспектора объектов. При программном вводе фильтры задаются одной длинной строкой, в которой символы “|” служат для разделения фильтров друг от друга, а также для разделения описания фильтруемых файлов от соответствующей маски выбора. Например, оператор

OpenDialogI.Filter := 'Текстовые файлы|*.txt| Файлы Паскаля|*.раs';

задает две маски - для отбора файлов с расширениями раs и TXT.

Установить начальный каталог позволяет свойство InitialDir string. Например:

OpenDialogI.InitiaiDir := 'c:\program files\borland\delphi5\source';

С помощью свойства DefaultExt: String [ 3 ] формируется полное имя файла, если при ручном вводе пользователь не указал расширение. В этом случае к имени файла прибавляется разделительная точка и содержимое этого свойства.

В диалоговом окне для ручного ввода предусмотрен элемент TEdit, который при желании можно заменить на TCоmbовох. Для этого необходимо свойству FileEditStyle придать значение fsComboBox вместо умалчиваемого fsEdit. Если выбран комбинированный список, с ним можно связать протокол выбора имен. Для этого используется свойство HistoryList: TStrings, содержимое которого будет появляться в выпадающем списке. Этот список не пополняется автоматически, поэтому за его содержимым должна следить программа. Например:

if OpenDialogI.Execute then

begin

HistoryList.Add(OpenDialogI.FileName);

end;

Настройка диалога может варьироваться с помощью свойства

TOpenOption = (ofReadOnly, ofOverwritePrompt, ofHideReadOnly, ofNoChangeDir, ofShowHelp, ofNoValidate, ofAllowMultiSelect, ofExtensionDifferent, ofPathMustExist, ofFileMustExist, ofCre-atePrompt, ofShareAware, ofNoReadOnlyReturn, ofNoTestFileCre-ate, ofNoNetworkButton, ofNoLongNames, ofOldStyleDialog, of-NoDereferenceLinks) ;

TOpenOptions = set of TOpenOption;

property Options: TOpenOptions;

Значения этого свойства имеют следующий смысл:

ofReadOnly | Устанавливает переключатель Только для чтения
ofOverwritePrompt | Требует согласия пользователя при записи в существующий файл
ofHideReadOnly | Прячет переключатель Только для чтения
OfNoChangeDir | Запрещает смену каталога
ofShowHelp | Включает в окно кнопку Help
ofNoValidate | Запрещает автоматическую проверку правильности набираемых в имени файла символов
OfAllowMultiSelect | Разрешает множественный выбор файлов
ofExtensionDifferent | При завершении диалога наличие этого значения в свойстве options говорит о том, что пользователь ввел расширение, отличающееся от умалчиваемого
ofPathMustExist | Разрешает указывать файлы только из существующих каталогов
ofFileMustExist | Разрешает указывать только существующие файлы
ofCreatePrompt | Требует подтверждения для создания несуществующего файла
ofShareAware | Разрешает выбирать файлы, используемые другими параллельно выполняемыми программами
OfNoReadOnlyReturn | Запрещает выбор файлов, имеющих атрибут Только для чтения
ofNoTestFileCreate | Запрещает проверку доступности сетевого или локального диска
OfNoNetworkButton | Запрещает вставку кнопки для создания сетевого диска
ofNoLongNames | Запрещает использование длинных имен файлов
ofOldStyleDialog | Создает диалог в стиле Windows 3-х

Если разрешен множественный выбор, доступ к выбранным именам можно получить в свойстве Files: strings.

18.5.2. TOpenPictureDialog и TSavePictureDialog - диалоги открытия и сохранения изображений

Специализированные диалоги для открытия и сохранения графических файлов TOpenPictureDialog И TSavePictureDialog отличаются от

TOpenDialog и TSaveDialog двумя обстоятельствами. Во-первых, в них предусмотрены стандартные фильтры для выбора графических файлов (с расширениями bmp, ico, wmf и emf) . Во-вторых, в окна диалога включены панели для предварительного просмотра выбираемого файла.

На рис. 18.39 показано стандартное окно компонента TOpenPictureDialog.

18.5.3. TFontDialog - диалог выбора шрифта

Компонент TFontDialog создает и обслуживает стандартное окно выбора шрифта (рис. 18.41). Свойство

TFontDialogDevice = (fdScreen, fdPrinter, fdBoth) ;

property Device: TFontDialogDevice;

определяет тип устройства, для которого выбирается шрифт:

fdScreen - экран; fdPrinter - принтер; fdBoth - шрифты, поддерживаемые и экраном, и принтером.

Рис. 18.39. Стандартное окно TopenPictureDialog

Рис. 18.40. Стандартное окно TFontDialog

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

Свойство

TFontDialogOption = (fdAnsiOnly, fdTrueTypeOnly, fdEffects, fdFixedPitchOnly, fdForceFontExist, fdNoFaceSel, fdNoOEMFonts, fdNoSimulations, fdNoSizeSel, fdNoStyleSel, fdNoVectorFonts, fdShowHelp, fdWysiwyg, fdLimitSize, fdScalableOnly, fdApply-Button);

TFontDialogOptions = set of TFontDialogOption;

property Options: TFontDialogOptions;

используется для настройки диалога. Значения этого свойства имеют следующий смысл:

fdAnsiOnly | Показывает только шрифты с набором символов Windows
fdTrueTypeOnly | Показывает только TrueType-шрифты
fdEffects | Включает в окно переключатели Подчеркнутый и Зачеркнутый, а также список выбора цвета шрифта только моноширинные шрифты
fdFixedPitchOnly | Включает только моноширинные шрифты
fdForceFontExist | Предупреждает о выборе несуществующего шрифта
fdNoFaceSel | Запрещает выделение имени шрифта в момент открытия окна
fdNoOEMFonts | Запрещает выбор MS-DOS-шрифтов
fdNoSimulations | Исключает шрифты, которые синтезируются графическим интерфейсом Windows
fdNoSizeSel | Запрещает выделение размера шрифта в момент открытия окна
fdNoStyleSel | Запрещает выделение стиля шрифта в момент открытия окна
fdNoVectorFonts | Исключает векторные шрифты (шрифты для Windows версии 1.0; используются в плоттерах)
fdShowHelp | Включает в диалоговое окно кнопку Help шрифты, которые поддерживаются и экраном, и принтером
fdWysiwyg | Включает шрифты, которые поддерживаются и экраном, и принтером
fdLimitSize | Включает ограничения на размер шрифта, заданные свойствами MaxFontSize И MinFontSize
fdScalableOnly | Включает только масштабируемые шрифты (векторные и TrueType)
fdApplyButton | Включает в окно кнопку применить

Результат выбора шрифта содержит свойство Font.

18.5.4. TColorDialog - диалог выбора цвета

Компонент создает и обслуживает стандартное диалоговое окно выбора цвета, показанное на рис. 18.42.

Свойства компонента:

property Color: TColor; | Содержит выбранный цвет
property CustomColors: TStrings; | Содержит до 16 цветов, определенных пользователем. Каждая строка имеет такой формат: Со1огх=нннннн, где х - буква от а до р, определяющая номер цвета, нннннн ~ шестнадцатеричное представление цвета в формате rgb
TColorDialogOption = (cdFullOpen, cdPreventFullOpen, cdShowHelp, cdSolidColor, cdAnyColor) ; TColorDialogOptions = set of TColorDialogOption; property Options: TColorDialogOptions; | Определяет настройку окна: cdFullOpen -показывать с развернутым окном выбора цвета пользователя; cdPreventFullOpen -запретить показ окна выбора цвета пользователя; cdShowHelp - включить в окно кнопку Help; cdSolidColor - выбирать ближайший сплошной цвет; cdAnyColor -разрешить выбор не сплошных цветов

Рис. 18.41 . Стандартное окно компонента TColorDialog

18.5.5. TPrintDialog - диалог настройки параметров печати

Компонент TPrintDialog создает стандартное диалоговое окно для выбора параметров печати, показанное на рис. 18.42.

Рис. 18.42. Стандартное окно компонента TPrintDialog

Свойства компонента:

property Collate: Boolean; | Если имеет значение True, окно показывается с выбранным переключателем разобрать (collate). Если этот переключатель выбран, печать нескольких копии документа будет идти по копиям: сначала первая копия, затем вторая и т. д., в противном случае - по страницам: сначала все копии первой страницы, затем второй и т. д
property Copies: Integer; | Определяет количество копии (0 - одна копия)
property FromPage: Integer | Определяет начальную страницу печати
property MaxPage: Integers; | Определяет верхнюю границу диапазона страниц для свойств FromPage, ToPage
property MinPage: Integer; | Определяет нижнюю границу диапазона страниц для свойств FromPage, ToPage
TPrintDialogOption = (poPrintToFile, poPageNums, poSe- lection, poWarning, poHelp, poDisablePrintToFile) ; TPrintDialogOptions = set of TPrintDialogOption; property Options: TPrintDialogOptions; | Определяет настройку окна: poPrintToFile - печатать в файл; poPrintToFile - разрешает выбор диапазона страниц; poSelection - разрешает печать выбранного текста; poWarning - предупреждать пользователя о неустановленном принтере; poHelp вставить в окно кнопку Help; poDisablePrintToFile - запрещает печать в файл
TPrintRange = (prAllPages, prSelection, prPageNums) ; property PrintRange: TPrintRange; | Определяет диапазон печатаемых страниц: prAllPages - все страницы; preelection - выделенный фрагмент текста; prPageNums - страницы по номерам
property PrintToFile: Boolean; | Содержит True, если пользователь выбрал печать в файл
property ToPage: Integer; | Определяет конечную страницу печати

18.5.6. TPrinterSetupDialog - диалог настройки параметров принтера

Компонент создает окно настройки параметров принтера, вид которого зависит от типа принтера. Этот диалог взаимодействует с драйвером принтера и не возвращает в программу никакой информации, поэтому его метод Execute - процедура, а не функция.

18.5.7. TFindDialog - диалог поиска

Стандартное диалоговое окно компонента TFindDialog используется для поиска фрагмента текста (рис. 18.43).

Свойства компонента:

property FindText: String; | Указывает образец для поиска
property Left: Integer; | Содержит горизонтальную позицию левого верхнего угла места появления окна
property Options: TFindOptions; | Определяет настройку диалога (см. ниже)
property Position: TPoint; | Содержит горизонтальную и вертикальную позицию левого верхнего угла места появления окна
property Top: Integer; | Содержит вертикальную позицию левого верхнего угла места появления окна

Для компонента определен следующий тип, использующийся в свойстве options:

TFindOption = (frDown, frFindNext, frHideMatchCase, frHideWholeWord, frHideUpDown, frMatchCase, frDisableMatchCase, frDisableUpDown, frDisableWholeWord, frReplace, frReplaceAll, frWholeWord, frShowHelp) ;

TFindOptions = set of TFindOption;

Рис. 18.43 . Стандартное окно компонента TFindDialog

Его значения имеют следующий смысл:

frDown frFindNext | Устанавливает поиск вперед по тексту
frHideMatchCase | Сообщает программе, что пользователь нажал кнопку Найти далее Убирает выбор в переключателе с учетом регистра
frHideWholeWord | Убирает выбор в переключателе только слово целиком
frHideUpDown | Прячет кнопки выбора направления поиска
frMatchCase | Устанавливает выбор в переключателе с учетом регистра
frDisableMatchCase | Запрещает выбор С учетом регистра
frDisableUpDown | Запрещает выбор направления поиска
frDisableWholeWord | Запрещает выбор только слово целиком
frReplace | Используется в компоненте TReplacteDialog и указывает на необходимость замены текущего выбора
frReplaceAll | Используется в компоненте TreplaceDialog и указывает на необходимость замены всех вхождений образца поиска
frWholeWord | Устанавливает выбор в переключателе Только слово целиком.
frShowHelp | Включает в окно кнопку Help

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

TNotifyEvent, которое возникает всякий раз, когда пользователь нажимает кнопку найти далее. Обработчик события должен найти образец в тексте и показать его пользователю. Пусть, например, компонент Memol содержит отыскиваемый фрагмент и поиск идет с учетом регистра. Тогда обработчик может иметь такой вид:

procedure TFormI.FindDialoglFind(Sender: TObject);

var

SelPos: Integer;

begin

with TFindDialog(Sender) do

begin

// Ищем фрагмент в тексте

SelPos := Pos(FindText, Memol-Lines.Text);

if SelPos > 0 then

begin // Фрагмент найден - выделяем его

Memol.SelStart := SelPos - 1;

Memol.SelLength := Length(FindText);

end

else

ShowMessage ('Текст "' + FindText + '"не найден')

end;

end;

18.5.8. TReplaceDialog - диалог поиска и замены

Компонент TReplaceDialog создает и обслуживает окно поиска и замены текстового фрагмента (см. рис. 18.44).

Рис. 18.44 . Стандартное окно компонента TReplaceDialog

Класс TReplaceDialog является прямым потомком класса TFindDialog и наследует от него большинство свойств. Дополнительно в компоненте определено свойство RepiaceText: string, в котором содержится текст замены, и событие OnRepiace, которое возникает

При нажатии кнопки заменить или з аменить все.