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, которое возникает

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