SNK Software
Web Studio Монополия Metaproducts Утилиты Игры
Монополию Web Studio Библиотека
Вебмастер Дельфи Работа на ПК Самоучитель
Для PHP Для Delphi
Веб-дизайн Программирование Компьютеры Девайсы Заметки
SNK Software Индустрия hardware Индустрия software
О студии Портфолио Сопровождение сайтов

Новые материалы

Девайсы:
Сравнительный обзор Nokia Lumia 920 и HTC 8X
Девайсы:
Обзор Nokia Lumia 820 – смартфона на WP8
Вебмастеру:
Настройка Apache, PHP и MySQL для Linux-VPS
Вебмастеру:
VPS на домашнем ПК: настройка сети в VM VirtualBox и Debian
Вебмастеру:
VPS на домашнем ПК: устанавливаем Linux Debian 6
Вебмастеру:
VPS на домашнем ПК: установка VM VirtualBox
Работа на компьютере:
Иные возможности текстового процессора Word
Работа на компьютере:
Вставка объектов
Работа на компьютере:
Таблицы в Word
Работа на компьютере:
Печать и сохранение документов
Работа на компьютере:
Сноски, колонтитулы, оглавление и указатели в Word

Компоненты 32-разрядного интерфейса

Мы уже рассмотрели целый ряд компонент, являющихся основополагающими при разработке программ. Все эти компоненты объединяет то, что они используются на всех графических платформах, начиная с Windows 3.x и OS/2 и заканчивая Windows XP или Linux. Однако современные (и не очень) 32-разрядные версии Windows, позволяют использовать ряд дополнительных элементов пользовательского интерфейса, являющихся стандартными для всех версий Windwos, начиная с Windows 95. В этой главе мы рассмотрим ряд компонент, представляющих данные элементы интерфейса, включая такие, как строка состояния и панель инструментов.

Коллекция картинок

Для использования в приложении различных пиктограмм, поясняющих назначение пунктов меню, а также для оформления кнопок, расположенных на панелях инструментов, удобнее всего использовать не отдельные изображения, привязанные к каждому конкретному объекту, а коллекции. В таком случае компонент будет лишь ссылаться на номер картинки в такой коллекции, представленной в VCL компонентом ImageList.

Компонент ImageList, или список изображений, расположенный на закладке Win32 палитры компонентов, является невизуальым компонентом. Иначе говоря, на экране его содержимое не отображается непосредственно, но может быть выведено на поверхности какого-либо визуального компонента. При этом элементами ImageList могут выступать изображения форматов "битовый массив" bmp или "значок" ico.

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

СОВЕТ
Подборку, включающую свыше 1000 картинок, которые можно использовать при разработке приложений, вы найдете в каталоге Clipart на прилагаемом к этой книге компакт-диске.

Кроме самих изображений, в списке могут храниться маски изображений, определяющие способ вывода самого изображения. Размеры маски должны совпадать с размерами самого изображения. Так, нулевой бит маски означает, что в данной точке изображение должно быть прозрачным (т.е. будет выведен пиксель цвета фона). Ненулевой бит указывает на то, что в данном месте должен быть выведен соответствующий ему бит изображения. За возможность обработки маски изображения отвечает свойство Masked. Если оно установлено в истину, то маска будет накладываться при выводе, а если в ложь, маска учитываться не будет.

Если при выводе изображения требуется заменить цвет фона в тех местах, где оно является прозрачным, следует использовать свойство bkColor. При значении, отличном от clNone ("бесцветный"), указанный в этом свойстве цвет будет использоваться в качестве фона на области, занимаемой изображением. Однако если свойство Masked установлено в ложь, то значение свойства bkColor не будет иметь смысла.

Если же маска как таковая не указана, то для определения прозрачной области используется цвет фона. Чтобы его указать, да и для того, чтобы вообще определить сами изображения во время разработки приложения, используют специальный редактор (рис. 13.1), который можно вызвать из контекстного меню компонента (ImageList Editor), или двойным щелчком по нему.

Редактор ImageList в Delphi
Рис. 13.1. Редактор ImageList в Delphi

При помощи редактора ImageList можно вносить новые изображения в список, удалять их, менять местами и т.д. Непосредственно после внесения можно так же задать цвет прозрачности (Transparent color), т.е. тот, который будет при выводе заменен цветом фона. Этот цвет можно выбрать из соответствующего списка, либо использовать инструмент-пипетку, доступный в области просмотра выбранного изображения (Selected Image).

Для внесения изображения в список при помощи редактора используйте кнопку Add, для замены выбранного изображения другим - Replace, а для удаления - Delete. Кнопка Clear удаляет все изображения из коллекции, а при помощи Export вы можете сохранить их все в виде одного файла. Здесь следует заметить, что сам компонент ImageList хранит все свои изображения в виде общего образа, и при экспорте именно этот образ и будет сохранен как файл bmp.

Что касается использования ImageList, то любой компонент, имеющий свойство Images (например, Menu или PopupMenu), можно ассоциировать со списком изображений, указав для данного свойства имя доступного для данной формы объекта ImageList. После этого для ссылки на изображение достаточно будет указывать его порядковый номер в списке. Он задается при помощи свойства ImageIndex, имеющегося, например, у всех пунктов меню - MenuItem.

Индикатор выполнения

Для индикации выполнения продолжительных операций - таких, как процесс копирования множества файлов, форматирования дисков и т.д., используют специальный графический индикатор, обычно представляющий собой полосу с дискретным приращением. Индикатор выполнения представлен в VCL компонентом ProgressBar, и, подобно другим рассматриваемым в этой главе компонентам, находится на закладке Win32 палитры компонентов.

Компонент ProgressBar является наследником класса TWinControl и имеет всего несколько свойств, необходимых для своего использования по назначению, а именно:

Кроме этих свойств, необходимых для непосредственного использования индикатора выполнения, так же предусмотрены свойства, влияющие на его отображение. Прежде всего, это свойство Orientation, которое влияет на пространственную ориентацию индикатора. Оно может принимать 2 значения - pbHorizontal и pbVertical, означающие размещение по горизонтали и вертикали. По умолчанию используется горизонтальное размещение, если же потребуется изменить его на вертикальное, то следует соответствующим образом изменить размеры (ширину и высоту) компонента.

Другое свойство - Smooth булевого типа, может пригодиться в том случае, если вопреки рекомендациям Microsoft по части интерфейса Windows-приложений, вы решитесь использовать не дискретную полосу индикации, а сплошную. В таком случае достаточно будет установить значение свойства Smooth в истину.

Изменять значение индикатора можно несколькими способами. Прежде всего, можно устанавливать значение непосредственно через свойство Position:

ProgressBar1.Position:=50;

Другой способ состоит в использовании уже упомянутого метода StepIt. При этом значение индикатора будет увеличено на величину, указанную в свойстве Step. Это удобно в тех случаях, когда, например, требуется выполнить заранее известное число операций (скажем, 5), примерно одинаковых по времени выполнения. В таком случае можно, оставив значения Min и Max принятыми по умолчанию, установить параметр Step в 20, и использовать метод StepIt для отображения хода выполнения:

ProgressBar1.Step:=20; for i:=1 to 5 do begin RunLongProc(i); ProgressBar1.StepIt; end;

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

Ползунок

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

Ползунок представлен компонентом TrackBar, и расположен непосредственно по соседству с компонентом ProgressBar. Это соседство не случайно, ведь хотя задачи этих компонентов и противоположны, по своей сути они оба являются компонентами, работающими с диапазонами значений. В частности, как и ProgressBar, компонент TrackBar является прямым наследником класса TWinControl. Кроме того, он так же имеет свойства Min, Max и Position. Единственным отличием пока является то, что по умолчанию для свойства Max установлено значение 10. Еще одно общее свойство - Orientation - также позволяет изменить расположение ползунка с горизонтального на вертикальное. Правда, при этом его размеры меняются автоматически.

Зато далее начинаются более существенные отличия. В частности, компонент TrackBar имеет целый ряд свойств, влияющих на его вид, в основном - на расположение его рисок. Все оставшиеся свойства этого компонента приведены в таблице 13.1.

Таблица 13.1. Свойства компонента TrackBar
СвойствоТип значенийОписание
FrequencyIntegerОпределяет величину интервала между рисками
LineSizeIntegerОпределяет величину приращения при управлении ползунком с клавиатуры клавишами-стрелками
PageSizeIntegerОпределяет величину приращения при управлении ползунком с клавиатуры клавишами PageUp и PageDown
SelEndIntegerОпределяет позицию окончания выбранного диапазона
SelStartIntegerОпределяет позицию начала выбранного диапазона
SliderVisibleBooleanОпределяет, должен ли отображаться сам ползунок
ThumbLengthIntegerОпределяет размер ползунка
TickMarksTTickMarkОпределяет расположение рисок. Допустимые значения: tmBottomRight, tmTopLeft и tmBoth
TickStyleTTickStyleОпределяет способ вывода рисок. Допустимые значения: tsNone, tsAuto и tsManual

Итак, из приведенных в таблице 13.1 свойств, 3 отвечают за вывод рисок. Это Frequency, TickMarks и TickStyle. По умолчанию риски рисуются для каждого шага приращения (Frequency:=1), по нижней стороне полосы (TickMarks:=tmBottomRight). То, что они вообще выводятся - "заслуга" свойства TickStyle, имеющего по умолчанию значение tsAuto. Если бы оно было установлено в tsNone, то рисок вообще не было бы видно. В том же случае, если для него выбрано значение tsManual, то выделено было бы только начало и конец диапазона, а промежуточные позиции можно было бы выставить при помощи метода SetTick:

TrackBar1.TickStyle:=tsManual; TrackBar1.SetTick(4); TrackBar1.SetTick(7);

В данном случае у компонента TrackBar1 было бы выставлено 4 метки - в начале, на 3-й позиции, на 7-й, и на последней. Метод SetTick - это единственный собственный метод компонента TrackBar, все же остальные его методы вполне стандартны, поскольку являются унаследованными от класса TWinControl.

Еще 2 свойства - SliderVisible и ThumbLength отвечают за сам ползунок. Так, если свойство SliderVisible установлено в ложь, то ползунка видно не будет. При этом, разумеется, пользователь ничего не сможет поделать с таким компонентом. А свойства LineSize и PageSize влияют на перемещение ползунка при помощи клавиатуры.

Таким образом, остается рассмотреть еще 2 свойства - SelStart и SelEnd, которые, в дополнение к свойству Position, определяют некие выбранные из диапазона значения, фактически, образуя вложенный диапазон. Он выделяется на шкале ползунка серым цветом. Отметим, что данные свойства можно установить только в процессе визуальной разработки или программно.

Для примера рассмотрим приложение, использующее 2 ползунка: один - для выбора значения, а другой - для установки коэффициента. Итоговое значение будет отображаться численно в заголовке окна и визуально - при помощи индикатора выполнения. Для этого создадим новое приложение и расположим на его главной форме 2 элемента TrackBar и 1 ProgressBar. Затем произведем следующие изменения ри помощи инспектора объекта:

После всех проделанных операций разместим все эти компоненты на форме таким образом, чтобы TrackBar1 находился по левому краю формы, а оставшиеся 2 компонента - правее его. Кроме того, снабдим их все поясняющими надписями при помощи меток: для TrackBar1 - "коэффициент", для TrackBar2 - "перемещение", и для ProgressBar1 - "индикация" (рис. 13.2).

Форма Delphi с 2 ползунками и 1 индикатором
Рис. 13.2. Форма Delphi с 2 ползунками и 1 индикатором

Идея нашего приложения состоит в том, чтобы пользователь, изменяя положение ползунка, помеченного как "перемещение" (TrackBar2), мог бы влиять на положение индикатора (ProgressBar1). При этом величина перемещения задается при помощи коэффициента (TrackBar1). Поскольку индикатор имеет максимальное значение 100, а количество позиций перемещения - 10, то для полного совпадения в конечной точке понадобится коэффициент 10 - для этого и было сделано выделение диапазона от 9 до 11.

Весь программный код данного приложения сводится к обработчику события onChange элемента TrackBar2. Чтобы создать такой обработчик, достаточно дважды щелкнуть по размещенному на форме объекту TrackBar2. Сам же код будет состоять из вычисления позиции для индикатора и вывода его числового значения в заголовке формы:

procedure TForm1.TrackBar2Change(Sender: TObject); begin ProgressBar1.Position:=TrackBar2.Position*TrackBar1.Position; Form1.Caption:=IntToStr(ProgressBar1.Position); end;

Результат проделанной работы можно найти в папке Demo\Part3\TrackProg.

Реверсивный счетчик UpDown

Еще один компонент, предназначенный для работы с диапазонами значений - это UpDown, известный так же как реверсивный счетчик. Внешне он представляет собой сдвоенную кнопку с двумя стрелками, используемыми для увеличения или уменьшения значения. Поскольку сам по себе этот компонент ничего не отображает, то его обычно ассоциируют с каким-либо другим оконным объектом, который может визуально отображать значение счетчика. Как правило, для этих целей используют однострочный редактор - Edit, метку типа StaticText (Label не подходит по той причине, что не является оконным компонентом), или любой другой компонент, который может выводить текст (многострочный редактор, ниспадающий список и т.д.).

Подключение счетчика к ассоциированному компоненту производится путем присваивания свойству Associate компонента UpDown имени нужного объекта. Для этого можно использовать инспектор объекта: в раскрывающемся списке напротив этого свойства будут перечислены все подходящие для этого объекты. При ассоциировании счетчик автоматически выравнивается по правой стороне выбранного объекта. Но при помощи свойства AlignButton можно сделать так, чтобы счетчик оказался по правой стороне компонента - для этого данное свойство надо установить в значение udLeft.

Еще одно свойство компонента UpDown - Orientation - уже знакомо нам по другим компонентам, предназначенным для работы с диапазонами значений. Применительно к реверсивному счетчику оно может принимать значения udVertical и udHorizontal, и меняет расположение кнопок между видами вверх-вниз и влево-вправо.

Другие свойства также нам уже известны - это Min, Max и Position. Свойство же Increment по своей сути аналогично свойству LineSize у компонента TrackBar: оно отвечает на изменение значения при нажатии пользователем на стрелки клавиатуры или при щелчке мышкой по кнопке. Правда, для реверсивного счетчика имеются некоторые отличия: во-первых, он реагирует только на нажатие стрелок вверх и вниз, а во-вторых, его реакцию на клавиатуру можно вообще отключить, если установить в ложь другое его свойство - ArrowKeys.

Наконец, последнее свойство, Thousands, отвечает за то, должны или нет использоваться разделители тысяч.

Поскольку реверсивные счетчики, чаще всего, используется совместно с однострочным редактором, то следует учитывать некоторые особенности их совместного использования. Прежде всего, пользователь может изменить текущее значение счетчика (т.е. его свойства Position) не только щелкая по кнопкам, но и введя его непосредственно в ассоциированный компонент с клавиатуры. При этом автоматически производится преобразование строки в число, и результат присваивается свойству Position. Очевидно, что при изменении значения самим компонентом UpDown, выполняется обратная ситуация: значение свойства Position преобразуется в строку и присваивается свойству Text редактора. Этим можно пользоваться для того, чтобы избегать лишних преобразований в коде программы, поскольку когда требуется получит число, то можно обратиться к свойству Position, а когда текст - к Text. Например, для элемента UpDown1, ассоциированного с Edit1, мы можем использовать такой код:

Form1.Caption:=Edit1.Text; ProgressBar1.Position:=UpDown1.Position;

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

Вместе с тем, в VCL предусмотрен специальный компонент, представляющий собой реверсивный счетчик, совмещенный с текстовым редактором. Он называется SpinEdit и расположен на закладке Samples палитры компонентов. Этот компонент не является стандартным для Windows, однако удобен тем, что не позволяет пользователю вводить какие-либо символы кроме цифр. Текущее значение этого компонента доступно только в числовом виде и представлено свойством Value. Другие свойства - MinValue и MaxValue аналогичны свойства Min и Max компонента UpDown, а свойство MaxLength, отвечающее за максимальное количество цифр, позаимствовано у компонента Edit. Ну а свойство Increment полностью соответствует таковому у счетчика UpDown.

Единственное новое свойство компонента SpinEdit - это EditorEnabled, которое позволяет запретить ввод данных непосредственно с клавиатуры. Впрочем, здесь также можно провести аналогию с парой UpDown-Edit, поскольку у однострочного редактора имеется свойство Enabled, позволяющее добиться такого же эффекта.

Редактор горячих клавиш

В VCL предусмотрены специальные средства для ввода не только диапазонов, но и других специализированных данных. Например, чтобы предоставить пользователю возможность указать сочетание горячих клавиш путем непосредственного их нажатия, в VCL предусмотрен специальный компонент - HotKey. Внешне он напоминает однострочный редактор, однако на этом, в общем-то, все сходство между этими компонентами заканчивается. Прежде всего, в качестве текста, отображаемого в окне редактора горячих клавиш, может выступать лишь текстовое представление одного из допустимых сочетаний. Соответственно, свойством, представляющим текущее значение этого компонента, является не Text, а HotKey.

ПРИМЕЧАНИЕ
Здесь следует пояснить, что сочетание клавиш, на самом деле, представляет собой тип TShortCut, являющийся диапазоном от Low(Word) до High(Word), т.е., фактически, положительным 16-битным целым. При этом каждому сочетанию соответствует то или иной числовое значение.

Кроме свойства HotKey, у компонента HotKey имеется еще 2 свойства, определяющих режим его работы и поддерживаемые сочетания клавиш. Так, свойство InvalidKeys позволяет ограничить набор допустимых сочетаний. Оно представляет собой множество типа THKInvalidKey, и может включать в себя следующие значения:

При этом следует учитывать, что если, скажем, запретить в качестве модификатора сочетание Ctrl+Alt и Shift+Ctrl то это не значит, что нельзя будет выбирать сочетания Shift+Ctrl+Alt.

Помимо запретов можно устанавливать и автоматически назначаемые модификаторы. Они применяются как значения по умолчанию. Например, в том случае, если введенный пользователем модификатор недопустим, то он будет заменен модификатором, заданном в качестве шаблона при помощи свойства Modifiers. Подобно свойству InvalidKeys, свойство Modifier представляет собой множество, состоящее из 4 значений: hkShift, hkCtrl, hkAlt и hkExt. По умолчанию используется hkAlt, т.е. неподходящий модификатор будет автоматически заменяться на Alt.

Компоненты для работы с датами

Другими специализированными компонентами, предназначенными для правки определенных типов значений, являются компоненты MonthCalendar и DateTimePicker. Оба они предназначены для упрощения ввода пользователем дат, попутно избавляя разработчика от заботы над тем, каким образом и в каком формате пользователь будет пытаться вводить даты.

Компонент MonthCalendar представляет собой календарь на 1 месяц: вверху находится поле, отображающее год и месяц в окружении 2 кнопок, позволяющих последовательно "прокручивать" месяцы. Под ним располагается строка с названиями дней недели, после чего следует собственно блок чисел. В самом низу находится строка, отображающая текущую дату, которая, к тому же будет обведена в календаре. Впрочем, как строку с текущей датой, так и выделение дня можно отключить. В то же время, можно наоборот, добавить еще вывод номеров недель (как в квартальном календаре), или ограничить диапазон допустимых значений. Все это возможно благодаря специальным свойствам этого компонента, унаследованным от класса TCommonCalendar и перечисленным в таблице 13.2.

Таблица 13.2. Свойства компонента MonthCalendar
СвойствоТипОписание
CalColorsTMonthCalColorsПозволяет определить цвета для различных элементов календаря
DateTDateОпределяет дату, являющуюся выбранной в календаре, или первую дату в диапазоне, если выбран диапазон
EndDateTDateУказывает на последнюю дату, являющуюся выбранной, если выбран диапазон дат
FirstDayOfWeekTCalDayOfWeekОпределяет первый день недели. Значение по умолчанию берется из региональных настроек Windows (для России - понедельник)
MaxDateTDateОпределяет максимальную дату, которая будет доступна в календаре
MaxSelectRangeIntegerОпределяет максимальное количество дней, которые можно выбрать в качестве диапазона дат
MinDateTDateОпределяет минимальную дату, которая будет доступна в календаре
MultiSelectBooleanОпределяет возможность выбора диапазона дат
ShowTodayBooleanОпределяет, должна ли быть видна строка, показывающая текущую дату
ShowTodayCircleBooleanОпределяет, должен ли текущий день быть отмечен в календаре
WeekNumbersBooleanОпределяет, должны или нет отображаться номера недель

Если отбросить все оформительские свойства, то наиболее пристального внимания заслуживают, прежде всего, свойство Date, а так же EndDate, если разрешен выбор диапазона дат (что достигается путем присваивания истины свойству MultiSelect). Для диапазонов важно так же свойство MaxSelectRange - по умолчанию оно установлено в 31, но, установив его, скажем, в 7, можно ограничить выбор одной неделей.

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

Компонент MonthCalendar и компонент DateTimePicker в раскрытом состоянии
Рис. 13.3. Компонент MonthCalendar и компонент DateTimePicker в раскрытом состоянии

Вместе с тем, для компонента DateTimePicker доступны только такие свойства, как CalColors, Date, DateTime, MaxDate и MinDate. Это вызвано, прежде всего, тем, что он не поддерживает возможности работы с диапазонами дат. В то же время, он имеет и ряд иных свойств, и помимо всего прочего, может быть использован для ввода не только дат, но и времени (табл. 13.3).

Таблица 13.3. Собственные свойства DateTimePicker
СвойствоТипОписание
CalAlignmentTDTCalAlignmentОпределяет выравнивание раскрывающегося календаря - по левому (dtaLeft) или по правому (dtaRight) краю
CheckedBooleanУказывает, отмечен ли переключатель (наличие переключателя определяется свойством ShowCheckbox)
DateFormatTDTDateFormatОпределяет формат вывода даты - короткий (dfShort) или полный (dfLong)
DateModeTDTDateModeОпределяет способ ввода даты - при помощи ниспадающего календаря (dmUpDown) или только стрелками (dmComboBox)
DroppedDownBooleanУказывает, раскрыт ли календарь в данный момент
FormatStringПозволяет указать произвольный формат отображения дат
KindTDateTimeKindОпределяет тип вводимых данных - дата (dtkDate) или время (dtkTime)
ShowCheckboxBooleanОпределяет, должен ли отображаться переключатель рядом с датой

Следует отметить, что свойство DateFormat имеет смысл только тогда, когда свойство Kind установлено в формат Date. А если элемент используется для ввода времени, то DateMode всегда будет иметь значение dmComboBox. При этом, когда установлен режим dmComboBox, все свойства, связанные с календарем так же теряют смысл.

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

Таблица 13.4. Шаблоны формата вывода даты и времени для свойства Format
МаскаОписание
dЧисло 1 или 2 цифрами
ddЧисло 2 цифрами. Однозначные значения дополняются 0
dddНазвание дня недели в сокращенной форме
ddddНазвание дня недели полностью
hЧас 1 или 2 цифрами, в 12-часовом формате
hhЧас 2 цифрами, в 12-часовом формате. Однозначные значения дополняются 0
HЧас 1 или 2 цифрами, в 24-часовом формате
HHЧас 2 цифрами, в 24-часовом формате. Однозначные значения дополняются 0
mМинута 1 или 2 цифрами
mmМинута 2 цифрами. Однозначные значения дополняются 0
MМесяц 1 или 2 цифрами
MMМесяц 2 цифрами. Однозначные значения дополняются 0
MMMНазвание месяца в сокращенной форме
MMMMНазвание месяца полностью
tЧасть дня (AM/PM) 1 буквой - A или P
ttЧасть дня (AM/PM) 2 буквами - AM или PM
yyПоследние 2 цифры года
yyyyГод полностью

Кроме того, можно даже добавить какой-либо поясняющий текст. Например, если в качестве шаблона указать "Сегодня dddd, dd MMMM yyyy г.", то дата будет отображаться как "Сегодня четверг, 1 сентября 2005 г.".

В дополнение к дате можно добавить время, например, благодаря шаблону типа "dd/MM/yy HH:mm" будет выводиться информация вида "01/09/05 12:30". При этом следует учитывать, что к дате следует обращаться через свойство Date, а ко времени - через свойство Time. Программно также доступно свойство DateTime, при помощи которого можно установить сразу и дату, и время:

DateTimePicker1.DateTime:=now();

Здесь функция now возвращает текущую дату и время по часам компьютера, и присваивает это значение свойству DateTime компонента DateTimePicker. При этом автоматически обновятся оба его свойства, отвечающие за хранение даты и времени отдельно, т.е. Date и Time.

Строка состояния

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

Компонент StatusBar может быть использован в 2 основных режимах - в простом, когда вся его поверхность используется для вывода одного сообщения, и в многопанельном, кодга он разделяется на отдельные области, предназначенные для вывода различной информации - панели. За режим работы отвечает свойство SimplePanel, установив которое в значение истины, мы получим простой режим. При этом текст надписи, выводимой в строку состояния, определяется свойством SimpleText.

В случае, когда необходимо вывести несколько индикаторов, для деления строки состояния на отдельные панели следует использовать свойство Panels, представляющее собой массив элементов типа TStatusPanel. Основными свойствами такой панельки являются Width и Text. Первое задает ее ширину, а второе - содержимое надписи. Так же могут пригодиться свойства Alignment и Bevel. Свойство Alignment определяет выравнивание текста в панельке, а свойство Bevel задает вид рамки. Свойство Bevel может принимать значения pbLowered, pbRaised и pbNone, задавая вогнутую, выпуклую или вообще отсутствующую рамку, соответственно.

Для создания новых панелек можно использовать инспектор объекта. Для этого достаточно щелкнуть по кнопке в строке со свойством Panels и в открывшемся окне редактирования панелек нажать кнопку Add New. При этом в списке редактирования появится новый элемент, щелкнув по которому, вы получите доступ ко всем его свойствам в инспекторе объекта.

Используя инспектор объекта, удобно создавать панельки, а при необходимости можно также задать начальные значения надписей. Но поскольку панель состояния по своей природе не должна быть статичной, то в процессе выполнения программы придется обращаться к отдельным ее элементам программно. Делается это через массив Panels, каждый элемент которого, как мы уже знаем, является объектом типа TStatusPanel:

StatusBar1.Panels[0].Text:='Программа загружена!'; //текст на 1-ой панельке StatusBar1.Panels[0].Width:=150; // изменяем ширину StatusBar1.Panels[0].Alignment:=taCenter; // выравниваем текст по центру StatusBar1.Panels[1].Text:=''; // удаляем текст 2-й панельки

Как и у других оконных элементов, оформление шрифта для строки состояния определяется при помощи свойства Font. Однако его изменения не будут иметь силы до тех пор, пока свойство UseSystemFont имеет значение истины. Дело в том, что для строки состояния используется шрифт, определенный в качестве системного в настройках Windows. При помощи свойства Font вы можете его переопределить для своей строки состояния, но чтобы задействовать изменение, требуется задействовать свойство UseSystemFont и установить его в ложь.

Наконец, строка состояния обладает еще одним, весьма полезным свойством - AutoHint. Если установить его значение в истину, то в качестве текста строки состояния (или текста ее первой панели для многопанельного варианта) будет отображаться подсказка (свойство Hint) к тому элементу, над которым находится указатель мышки. Это может быть использовано в качестве альтернативы, если показ подсказок (свойство ShowHint) у всех элементов окна отключено, или как дополнение к всплывающим подсказкам.

Панель инструментов

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

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

Таблица 13.5. Свойства компонента ToolBar
СвойствоТипОписание
HideClippedButtonsBooleanОпределяет обработку кнопок, затененных смежной панелью инструментов
ButtonCountIntegerУказывает количество кнопок, расположенных на панели
ButtonHeightIntegerОпределяет высоту элементов управления, расположенных на панели
Buttonsarray of TToolButtonСодержит массив всех кнопок, имеющихся на панели
ButtonWidthIntegerОпределяет высоту кнопок, расположенных на панели
CustomizableBooleanОпределяет возможность настройки панели пользователем
CustomizeKeyNamestringОпределяет имя раздела в реестре, в котором будет сохраняться информация о пользовательских настройках
CustomizeValueNamestringОпределяет имя записи в реестре, в которой будет сохраняться информация о пользовательских настройках
DisabledImagesTCustomImageListОпределяет коллекцию картинок для неактивного состояния кнопок (т.е. когда кнопка недоступна)
FlatBooleanОпределяет, долена ли панель быть прозрачной (в стиле MSIE 3)
HotImagesTCustomImageListОпределяет коллекцию картинок для активного состояния кнопок (т.е. в момент, когда указатель мышки находится над кнопкой)
ImagesTCustomImageListОпределяет коллекцию картинок для обычного состояния кнопок
IndentIntegerОпределяет поле по левой стороне панели
ListBooleanОпределяет вид выравнивания картинок и текста
MenuTMainMenuПозволяет связать панель инструментов с главным меню
RowCountIntegerУказывает на количество строк, по которым расположены кнопки панели
ShowCaptionsBooleanОпределяет, должны или нет отображаться текстовые подписи к кнопкам (т.е. их Caption)
TransparentBooleanОпределяет, будет ли панель прозрачной. Не оказывает влияния на сами кнопки
WrapableBooleanОпределяет, должны ли кнопки автоматически переноситься, если не помещаются в одну строку
EdgeBordersTEdgeBordersОпределяет, по каким сторонам панели должны быть видны рамки
EdgeInnerTEdgeStyleОпределяет вид внутренних рамок. Допустимые значения: esNone, esRaised и esLowered
EdgeOuterTEdgeStyleОпределяет вид внешних рамок. Допустимые значения: esNone, esRaised и esLowered

Наиболее важным для панели инструментов свойствами является такое свойство, как Images, поскольку именно коллекция картинок определяет вид кнопок. Размеров кнопок, находящихся на панели инструментов, всегда одинаковые, и задаются при помощи свойств ButtonHeight и ButtonWidth. При этом следует учитывать, что высота кнопок должна быть меньше, чем высота самой панели. Немаловажное влияние оказывают на вид панели свойства List и ShowCaption. Так, по умолчанию показ надписей отключен. Если же его включить, то текст надписи будет располагаться под картинкой, и все это будет выровнено по центру. Если же задействовать свойство List, установив его в истину, то текст и картинка будут расположены в строку, при этом текст будет справа, а картинка - слева.

Что касается собственно кнопок, типа ToolButton, то вы не найдете такого компонента на палитре инструментов. Зато их можно добавить, воспользовавшись контекстным меню панели, для чего следует выбрать пункт New Button. Самые важные свойства кнопок - это ImageIndex, определяющее номер картинки в коллекции изображений, ассоциированной с панелью, на которой находится данная кнопка, и Caption, определяющее ее текстовую подпись. Впрочем, эта самая подпись не будет видна, если только для самой панели не установлено в истину свойство List.

Кроме кнопок, на панелях инструментов часто используют разделители. Разделителями могут выступать те же кнопки, только специальным образом оформленные. Для помещения разделителя на панель из ее контекстного меню следует выбрать пункт New Separator.

Основным отличием между "просто кнопкой" и разделителем является то, что если у стандартной кнопки свойство Style установлено в значение tbsButton, то у разделителя - в tbsSeparator. Такая кнопка-разделитель в работающей программе выглядит кК пустое пространство между соседними кнопками. Если же требуется отделить группы кнопок более явно, то можно использовать другой стиль кнопки-разделителя, установив свойство Style в tbsDivider, что добавит разделителю вертикальную черту.

Помимо 3 уже рассмотренных значений, для свойства Style предусмотрено еще 2: tbsCheck и tbsDropDown. Оба они позволяет изменять вид кнопки, причем если выбран вариант tbsCheck, то она получает триггерный эффект, т.е. "залипает" при первом нажатии, и "отлипает" при следующем. Но если таких кнопок несколько, и для них еще одно свойство - Grouped - установлено в истину, то выбранной в один момент времени всегда будет только одна из кнопок группы, а все остальные будут автоматически возвращаться в обычное состояние. Текущее состояние кнопки можно узнать, обратившись к ее свойству Down: если оно установлено в истину, то кнопка нажата ("включена"), если в ложь - отжата.

Что касается стиля tbsDropDown, то он используется для создания комбинированной кнопки-меню. При этом должно быть определено другое свойство - DropdownMenu, которое ассоциирует кнопку с каким-либо имеющимся на форме контекстным меню (компонент PopupMenu).

Чтобы лучше разобраться с кнопками, создадим небольшое демонстрационное приложение. Для этого создадим новый проект и поместим на форму компонент ToolBar. Из группы Win32 нам понадобится еще один компонент - ImageList, а из группы стандартных (на закладке Standard) - PopupMenu. Теперь создадим кнопки. Для этого, используя контекстное меню компонента ToolBar (т.е. щелкая по нему правой клавишей мышки), последовательно добавим 9 элементов в такой последовательности: 1-й - кнопка (Add Button), 2-й - разделитель (Add Separator), 3-й - кнопка, 4-й - разделитель, 5-й - кнопка, 6-й - разделитель, и оставшиеся 3 - кнопки. Теперь для 2-го и 3-го разделителей, при помощи инспектора объекта, установим стиль tbsDivider. Затем для кнопки, оказавшейся между разделителями с вертикальной чертой, установим стиль tbsDropDown. После этого выберем все 3 последние кнопки, для чего используем клавишу Shift, и установим для них свойство Style в tbsCheck, а Grouped - в истину. В результате панель инструментов примет вид, показанный на рис. 13.4.

Панель инструментов с кнопками различных видов в Delphi IDE
Рис. 13.4. Панель инструментов с кнопками различных видов

Теперь следует заняться свойствами самой панели, для чего, в первую очередь, следует определить изображения. Для этого надо будет воспользоваться редактором компонента ImageList, добавив в него 6 изображений - по числу имеющихся у нас кнопок. После этого свойству Images панели инструментов присвоим значение ImageList1, т.е. коллекцию картинок. Сразу после этого все кнопки получат соответствующие иконки.

Чтобы визуально отделить панель от остальной части окна, в ее составном свойстве EdgeBorders следует установить для ebBottom значение True. Таким образом, само свойство EdgeBorders получит значение [ebTop,ebBottom], а рамка будет видна не только по верхней, но и по нижней границе панели.

Остается разобраться только с той кнопкой, для которой мы установили стиль tbsDropDown. Прежде всего, надо определить меню, которое будет раскрываться при щелчке пользователем по стрелке. Для этого мы уже поместили на форму компонент PopupMenu, так что надо лишь создать в нем несколько пунктов. После этого необходимо ассоциировать это меню с кнопкой, для чего в инспекторе объекта найдем для данной кнопки свойство DropDownMenu и установим в качестве его значения имя контекстного меню - PopupMenu1.

Результатом проделанной работы будет приложение, имеющее одну раскрывающуюся и 3 триггерные кнопки, которое можно найти в каталоге Demo\Part3\Toolbar.

Попутно следует отметить, что в том случае, если требуется использовать несколько панелей инструментов, и при этом дать пользователю возможность еще и перемещать их, то в качестве основы берется компонент ControlBar (расположен на закладке Additional палитры компонентов), и все панели помещаются не непосредственно на форму, а не этот компонент.

ПРИМЕЧАНИЕ
Помимо компонента ToolBar, в Delphi имеется еще один компонент, предназначенный для создания панелей инструментов - CoolBar. Он совмещает в себе контейнер для панелей и сами панели.

Элементы с вкладками

Элементы с вкладками представляют собой элементы управления, состоящие из нескольких страниц (листов, вкладок), на которые можно переходить, щелкая мышкой по их ярлыкам. Всего имеется 2 таких элемента - это компоненты TabControl и PageControl, причем оба они происходят от класса TCustomTabControl, и, соответственно, имеют ряд общих свойств и методов. И тот, и другой компоненты являются контейнерами для других элементов, хотя организация и управление этими элементами имеют ряд различий. Основное различие заключается в том, что TabControl представляет собой одну общую панель, имеющую закладки, в то время, как в PageControl каждая закладка является частью отдельной панели.

Но начнем все-таки с общих черт этих компонентов, для чего обратимся к таблице 13.6, содержащей все основные свойства их предка - класса TCustomTabControl.

Таблица 13.6. Общие свойства TabControl и PageControl
СвойствоТипОписание
HotTrackBooleanОпределяет, должны ли надписи закладок выделяться цветом при наведении указателя мышки
ImagesTCustomImageListУказывает на коллекцию изображений, ассоциированную с данным элементом и используемую для оформления закладок
MultiLineBooleanОпределяет, могут ли закладки размещаться в несколько рядов, если не помещаются в 1 ряд
RaggedRightBooleanОпределяет, должны ли закладки растягиваться таким образом, чтобы заполнить все пространство по ширине элемента
ScrollOppositeBooleanОпределяет вариант перемещения линий с закладками при выборе закладки в случае многорядного размещения
StyleTTabStyleОпределяет вид закладок. Допустимые значения: tsTabs (обычные), tsButtons (в виде кнопок) и tsFlatButtons (в виде плоских кнопок)
TabHeightSmallintОпределяет высоту закладок в пикселях
TabIndexIntegerУказывает на порядковый номер выбранной в настоящий момент закладки
TabPositionTTabPositionОпределяет расположение закладок. Допустимые значения: tpTop, tpBottom, tpLeft и tpRight
TabWidthSmallintОпределяет фиксированную ширину закладок в пикселях. Если установлено в 0, то ширина будет назначаться автоматически

Вместе с тем, класс TCustomTabControl, имеет еще 2 свойства, которые присутствуют у компонента TabControl, но которых нет у PageControl. Это - свойство Tabs, содержащее список названий всех закладок, и свойство MultiSelect, отвечающее за возможность выделения нескольких закладок одновременно. То, что данные свойства не поддерживаются для PageControl, объясняется их принципиальными отличиями. Зато у него имеется собственное свойство Pages, являющееся хранилищем самих страниц с закладками, а отсутствие свойства MultiSelect объясняется тем, что невозможно выбрать (и отобразить) несколько страниц одновременно.

Кроме свойства Pages, у компонента PageControl имеются еще несколько индивидуальных свойств. В частности, свойство PageCount указывает на количество страниц, а ActivePageIndex - на порядковый номер выбранной страницы. Тем самым оно, в типичном случае, дублирует свойство TabIndex, поскольку закладка является частью страницы, за тем лишь исключением, если закладки у части страниц не отображаются. Еще одно свойство - ActivePage ссылается на саму страницу как на компонент типа TabSheet.

Сам компонент TabSheet используется только как составная часть элемента PageControl. Его собственные свойства позволяют идентифицировать страницу среди других закладок. Так, свойство PageIndex позволяет узнать, какой по счету является данная страница, или же изменить ее расположение, а свойство PageControl ссылается на родительский элемент. Свойство ImageIndex позволяет назначить представляющей страницу закладке изображение, ссылаясь на его номер в коллекции изображений, ассоциированной с родительским компонентом. А при помощи TabVisible можно определить, должна или нет быть видна закладка.

Что касается работы с отдельными страницами, то для того, чтобы добавить новую страницу к компоненту PageControl, достаточно воспользоваться его контекстным меню и выбрать пункт New Page. При помощи этого же контекстного меню можно и удалить ненужные страницы. В то же время, закладки для компонента TabControl определяются другим способом - путем указания их перечня в свойстве Tabs, для чего следует использовать инспектор объекта. Если же требуется выполнить какие-либо манипуляции со страницами во время выполнения программы, то, опять-таки для TabControl это можно делать путем непосредственной правки списка Tabs:

TabControl1.Tabs.Add('Новая'); TabControl1.Tabs.Delete(1);

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

NewTabSheet: TTabSheet; ... NewTabSheet := TTabSheet.Create(PageControl1); NewTabSheet.PageControl := PageControl1;

В отличие от свойств, среди методов 2 рассматриваемых компонентов, общих наберется весьма немного. Среди них можно выделить лишь RowCount, возвращающий число строк, по которым размещены закладки, и ScrollTabs, позволяющий "прокрутить" закладки в случае, если они все находятся в 1 ряду, и полностью на нем не помещаются. Основное же число методов приходится на компонент PageControl, однако многие из них могут быть интересны лишь для детального изучения работы самого компонента.

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

function FindNextPage(CurPage: TTabSheet; GoForward, CheckTabVisible: Boolean): TTabSheet;

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

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

procedure SelectNextPage(GoForward: Boolean; CheckTabVisible: Boolean=True);

То, что последний параметр является предопределенным, говорит о том, что его можно опускать. Но если его все-таки указать и установить в значение лжи, то в том случае, если закладки для некоторых страниц действительно не отображаются, это будет единственным способом обеспечить навигацию по "скрытым" страницам.

Прочие компоненты Win32 и стиль Windows XP

Пожалуй, наиболее сложными визуальными компонентами среди всех элементов 32-разрядного интерфейса, являются TreeView и ListView. Чтобы наглядно представить себе, что они из себя представляют, запустите Проводник Windows. Фактически, левая его часть, отображающая все места хранения данных на ПК в виде иерархической структуры, иллюстрирует TreeView, а правая, с файлами и папками - ListView. При этом, подобно виду в Проводнике, компонент ListView в Delphi может отображать свое содержимое в виде списка, иконок, или таблицы. Каждый элемент представляет собой объект, имеющий собственную подпись, значок, воженные и ассоциированные объекты.

Подробнее ознакомиться с этими компонентами можно на примере приложения Resource Explorer, входящем в поставку Delphi (он находится в подкаталоге Demos\ResXplor, вложенном в тот каталог, в который производилась установка самой Delphi, например, C:\Program Files\Delphi 7\).

В противоположность компонентам TreeView и ListView, компонент XPManifest, появившийся в Delphi 7, можно назвать самым простым компонентом, причем не только среди элементов 32-разрядного интерфейса, но и вообще в VCL. Для него не имеется ни событий, ни методов, а определены лишь 2 свойства, обязательных для любого компонента - Tag и Name. Фактически, его предназначение сводится к тому, что при помещении на форму, к проекту подключается модуль XPMan, который, в свою очередь, подключает файл ресурсов WindowsXP.res. Результатом помещения компонента XPManifest на форме приложения будет то, что интерфейс программы при работе в Windows XP будет "понимать" темы оформления Windows XP, и все его компоненты во время выполнения программы будут выглядеть так, как это принято в Windows XP (рис. 13.5).

Интерфейс приложения, скомпилированного в Delphi 7 с использованием XPMan
Рис. 13.5. Интерфейс приложения, скомпилированного в Delphi 7 с использованием XPMan

Если же вы работаете с более ранней версией Delphi, или же не будете включать в состав приложения модуль XPMan, то вид элементов управления будет таким, как в предыдущих версиях Windows (рис. 13.6).

Интерфейс того же самого приложения, без использования модуля XPMan
Рис. 13.6. Интерфейс того же самого приложения, без использования модуля XPMan

В то же время, существует возможность придать виду приложения современный вид и при использовании версий Delphi, появившихся до выхода Windows XP. Для этого достаточно создать специальный файл формата XML с расширением manifest и названием, совпадающим с полным именем выполняемого файла приложения. Например, если исполняемый файл называется D6.exe, то файл, декларирующий возможность использования стилей Windows XP, будет называться D6.exe.manifest. Что касается его содержимого, то оно должно быть таким, как показано в листинге 13.1.

Листинг 13.1. XML-файл для использования стилей Windows XP

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="5.1.0.0" name="Microsoft.Windows.Shell.Gina" processorArchitecture="*" type="win32"/> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" language="*" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" /> </dependentAssembly> </dependency> </assembly>

Если применить такой файл к приложению, скомпилированному при помощи Delphi 7 без использования компонента XPManifest, то его вид ничем не будет отличаться от такового, созданного с использованием этого компонента. Несколько по-другому дела обстоят с предыдущими версиями Delphi, поскольку библиотека VCL ранних версий, разумеется, не обеспечивала поддержку теперешних стилей. В результате 2рестайлингу" будут подвержены только те компоненты, которые являются прямой проекцией стандартных компонентов Windows, т.е. только простые кнопки, текстовые поля и компоненты 32-разрядного интерфейса (рис. 13.7).

Приложение Delphi 6 с файлом manifest
Рис. 13.7. Приложение Delphi 6 с файлом manifest

Что касается компонентов, не имеющих прямых аналогов в самой Windows (различные группирующие элементы из группы Standard, а так же любые элементы, не относящиеся к компонентам Standard и Win32), будут отображаться в классическом стиле.

Примеры приложения, скомпилированного в разных версиях Delphi, с использованием XPManifest и без, можно найти в каталоге Demo\Part3\XPman.

Избранное

SNK GSCP
SNK GSCP - новая библиотека для PHP 5!
Web Studio
Web Studio и Visual Workshop
Библиотека:
Стандарты на web-технологии
Монополия
Монополия v. 2.0.2
Загрузки:
скачать программы
Продукция:
программы и книги
Техподдержка / Связаться с нами
Copyright © 1999-2013 SNK. Все права защищены.
При использовании материалов с сайта ссылка на источник обязательна.
Рейтинг@Mail.ru