Когда-то я уже начинал писать цикл статей, посвящённых решению некоторых простых задач. Последняя статья того цикла была написана 5 лет тому назад. Примерно тогда же я завёл на компьютере (теперь уже в модном «облаке») папку, в которой стал собирать написанные мною в разное время фрагменты программ, модули, исходники компонентов и прочие материалы, которые я постоянно использую в своей работе. Возможно, кое-что из этого могло бы быть полезно кому-нибудь ещё.
Постановка задачи
При проектировании пользовательского интерфейса иногда оказывается разумным вывести подсказку или сообщение для пользователя непосредственно в форме. Поясню на примере:
В данном случае предполагается, что у пользователя нет времени искать подсказки в документации или в справочной системе приложения.
Другой пример — это сообщение об ошибке, которое нельзя проигнорировать, но не стоит использовать и модальный диалог, например:
Некоторое время назад я понял, что было бы удобно оформить этот элемент интерфейса в виде отдельного компонента, что и было сделано. Итак, компонент TInfoBox.
Описание компонента
Компонент является потомком TGraphicControl и визуально представляет собой прямоугольник с закруглёнными углами (необязательно), картинкой (тоже необязательно) и текстом. Он может автоматически масштабироваться в зависимости от содержания. Никаких специальных методов и событий у него нет, а свойства перечислены и кратко описаны ниже.
Ссылка для скачивания
Свойства компонента
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, а шрифт соответствует шрифту всплывающих подсказок.
Цвет фона и шрифт по умолчанию зависят от настроек Windows: цвет берётся clInfoBk, а шрифт соответствует шрифту всплывающих подсказок.
Примеры
Как пользоваться BorderMargins
У второго компонента BorderMargins=[bmLeft, bmRight, bmBottom]. Поэтому вертикальный промежуток между компонентами будет не двойной, а одинарный.
Как подключить в проект этот компонент? Для тупых пожалуйста!
ОтветитьУдалитьИнсталлировать как любой другой нестандартный компонент. Процесс зависит от версии 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 сейчас не скажу: нет под рукой, но там, скорее всего, аналогично.
Кроме того, можно вообще не добавлять его в палитру, а создавать динамически прямо в коде, но это не очень удобно: много лишнего кода.