Админ

вторник, 6 мая 2014 г.

Компоненты Delphi: TInfoBox

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

Постановка задачи

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


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

Другой пример — это сообщение об ошибке, которое нельзя проигнорировать, но не стоит использовать и модальный диалог, например:


Некоторое время назад я понял, что было бы удобно оформить этот элемент интерфейса в виде отдельного компонента, что и было сделано. Итак, компонент TInfoBox.

Описание компонента


Компонент является потомком TGraphicControl и визуально представляет собой прямоугольник с закруглёнными углами (необязательно), картинкой (тоже необязательно) и текстом. Он может автоматически масштабироваться в зависимости от содержания. Никаких специальных методов и событий у него нет, а свойства перечислены и кратко описаны ниже.

Ссылка для скачивания

Скачать исходник  

(обновлено 5.11.2014 — добавлено свойство Themed)

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

Published

Align: TAlign
вполне традиционное свойство.
AutoSize: Boolean
управляет автоматическим вычислением размера. Работает только если Align равно alNone, alTop или alBottom.
BorderMargins: TBorderMargins
свойство, которое управляет наличием внешних пустых полей с разных сторон вокруг компонента (на картинке выше они отмечены пунктиром — он не виден во время работы приложения). Это имеет смысл только при использовании свойства Align, если имеется несколько рядом стоящих компонентов TInfoBox, выровненных одинаково, либо рядом с компонентом TInfoBox есть какой-то другой компонент, который имеет собственные поля. Подробнее см. примеры ниже.
BorderStyle: Boolean
управляет наличием тонкой чёрной рамки вокруг компонента.
BorderWidth: TBorderWidth
ширина внутренних полей между рамкой и содержимым.
Color: TColor
цвет заливки (по умолчанию совпадает с цветом всплывающего сообщения, т. е. clInfoBk).
Font: TFont
шрифт (по умолчанию берётся системный шрифт для всплывающих окон, т. е. Screen.HintFont).
Margin: TBorderWidth
ширина внешних пустых полей вокруг компонента (см. выше описание свойства BorderMargins).
IconAlignment: TLeftRight
расположение картинки относительно текста (справа или слева).
IconHeight: Integer
высота изображения. Можно указать высоту, отличную от реальной высоты картинки, чтобы получить необычный эффект.
IconSpacing: TBorderWidth
ширина зазора между изображением и текстом.
IconType: TIconType
если это значение отлично от itNone (нет изображения) и itCustom (см. свойство Picture ниже), то можно использовать системную иконку, которая обычно выводится в сообщениях, создаваемых функциями MessageDlg/MessageBox.
IconWidth: Integer
ширина изображения. Можно указать ширину, отличную от реальной ширины картинки, чтобы получить необычный эффект.
LineSpacing: TBorderWidth
расстояние между строками (точнее, между «абзацами»). См. примеры ниже.
ParentColor: Boolean
ParentFont: Boolean
два вполне традиционных свойства.
Picture: TPicture
если IconType=itCustom, то эта картинка используется вместо стандартной иконки. Использовать можно любые изображения в пределах разумных размеров.
Strings: TStrings
текст сообщения. Каждая строка соответствует одному «абзацу».
Themed: Boolean
управляет внешним видом (по умолчанию False). Если True (и если включена поддержка тем оформления Windows, а приложение имеет манифест) то вместо обычного прямоугольника с закруглёнными углами будет использован элемент Baloon из текущей темы оформления Windows (так что этот компонент не будет выпадать из общего визуального стиля Windows XP, 7 или 8). Пример можно посмотреть в разделе «Примеры» ниже (внешний вид зависит от конкретного компьютера, в примере скриншот из Windows 7). При этом будет игнорироваться свойство Color, а BorderStyle может менять не только стиль рамки, но и внешний вид компонента целиком (тоже зависит от настроек).
Transparent: Boolean
управляет наличием заливки. Если True, то компонент «прозрачен».

Public

Вообще-то, эти свойства тоже нужно было бы сделать published. Но тогда пришлось бы писать редактор свойств, а я хотел бы этого пока избежать. Может быть, сделаю это в будущем.
Alignment[Index: Integer]: TAlignment
выравнивание «абзацев». Индекс соответствует номеру в списке Strings.
LineFont[Index: Integer]: TFont
шрифты «абзацев». Индекс соответствует номеру в списке Strings. При помощи этого свойства можно, например, создавать подзаголовки.

Примечания

Значения свойств BorderWidth, Margin, IconSpacing и LineSpacing по умолчанию не фиксированы. Они вычисляются по формуле 6*Screen.PixelsPerInch div 96, так что меняются при смене плотности точек на экране (то, что в Windows называется масштабом и задаётся в свойствах экрана).

Свойство Strings.Objects используется для хранения значений Alignment и LineFont. Не очень удачное решение — скорее всего, будет изменено позднее. Из этого, в частности, следует, что нельзя использовать это свойство как-то иначе.

Цвет фона и шрифт по умолчанию зависят от настроек Windows: цвет берётся clInfoBk, а шрифт соответствует шрифту всплывающих подсказок.

Примеры

Как пользоваться BorderMargins

У второго компонента BorderMargins=[bmLeft, bmRight, bmBottom]. Поэтому вертикальный промежуток между компонентами будет не двойной, а одинарный.

LineSpacing

Themed

 Alignment, IconType, Picture, IconSpacing и LineFont

2 комментария:

  1. Как подключить в проект этот компонент? Для тупых пожалуйста!

    ОтветитьУдалить
    Ответы
    1. Инсталлировать как любой другой нестандартный компонент. Процесс зависит от версии Delphi. Например, на старенькой Delphi 7 с английским интерфейсом это выглядит так:

      1. Скопировать файлы с расширением .pas и .dcr куда-то в постоянное место на диске. Для Delphi 7 это обычно папка Lib внутри той, куда установлена сама Delphi, например: "C:\Program Files (x86)\Borland\Delphi7\Lib". Можно сделать и отдельную папку, но тогда придётся прописывать путь к ней при установке.

      2. Открыть меню Component / Install Component..., нажать кнопку Browse рядом с полем Unit file name и найти тот самый скопированный ранее файл с расширением .pas. Если путь нестандартный (см. конец предыдущего пункта), то придётся дописать его к строке Search Path, причём вручную.

      3. После этого нажать ОК. Откроется окно инспектора пакета. Там нужно нажать поочерёдно кнопки Compile и Install для регистрации компонента в палитре. По идее, ошибок на этом шаге быть не должно, потому что компонент очень простой.

      4. После этого компонент появится в палитре на странице Samples: жёлтый квадратик с вписанным треугольником и восклицательным знаком.

      Про более новые версии Delphi сейчас не скажу: нет под рукой, но там, скорее всего, аналогично.

      Кроме того, можно вообще не добавлять его в палитру, а создавать динамически прямо в коде, но это не очень удобно: много лишнего кода.

      Удалить

Insert Emoticons
:))
:((
:D
:(
=))
b-(
:)
:P
:-o
:*
:-s
[-(
@-)
=d>
b-)
:-?
:->
X-(

К началу