Рис. 23. Элементы RadioButton в контейнере GroupBox позволяют сделать выбор.
CheckBox.
Флажок (независимый переключатель) отличается от выше описанного переключателя тем, что в группе флажков одновременно можно установить флажки в любой комбинации (в том числе могут быть установлены или сброшены все флажки).
Флажок может находиться в установленном или сброшенном состоянии. Одиночный флажок часто используется, например, для включения / выключения какого-либо режима. Флажок выглядит как прямоугольник с текстовым заголовком. Если в нем есть галочка, то обозначенная этим флажком опция включена (в этом случае также говорят, что флажок отмечен). Если прямоугольник пуст, то флажок снят, или сброшен. Дейстия с одним флажком не отражаются на состоянии других флажков, если это не было специально предусмотрено.
В Events используют свойства OnClick и OnChange, но обычно просто в программе используются состояния группы флажков и в зависимости от этого выполняются действия.
9. КОМПОНЕНТЫ ДЛЯ РАБОТЫ С ДАННЫМИ – Таблицы и Базы
Собственно, все компоненты текстового ввода/вывода рабо тают с данными, но традиционно именно Таблица предназначена для их накопления и отображения. Создать таблицу можно поместив ее на Форму и назначив число колонок через Items Editor, при этом могут быть назначены разные виды колонок для ввода разного типа данных (на практике ограничиваются обычной строковой колонкой и при необходимости преобразовани ем типов вводимых данных).
Рис. 24. Назначение колонок компоненту StringGrid через Item Editor.
В Delphi 10.3, 11, имеется как старая текстовая таблица StringGrid, так и новый введенный компонент Grid. Если работа с StringGrid такая же, как и ранее, то компонент Grid фактически представлен набором колонок, каждая из которых отображается и программируется отдельно. Чтобы добавить колонку программно теперь придется приводить новую конструкцию создания новой колонки с указанием ее ширины:
StringGrid1.AddObject(TStringColumn.Create (nil));
StringGrid1.Columns [i].Width:= 35;
Соответственно, удалить колонку можно оператором Release (после чего придется перенумеровывать колонки):
StringGrid1.Columns[i].Release;
Основные свойства таблицы остались прежние и отображены в Инспекторе объектов в свойствах Option.
Если с таблицей не предполагается работать визуально (изменять размеры строк, колонок и пр.) достаточно оставить отображение линий колонок.
Также можно убрать нововведенный элемент Заголовок – Header, который представляет собой отдельный элемент и программируется отдельно, а фактически выполняет роль окрашиваемых серым нулевых колонку и строку, предназначенных для их нумерации в более ранних версиях таблицы.
Так как нулевые колонки никуда не делись, а важность нумерации строк остается, лучше убрать этот только мешающий элемент и оставить за нулевыми колонкой и строкой функции их нумерации или обозначения; при этом становится более понятным нумерация данных, не приходится помнить, что данные 1 находятся в строке 0 и при обращении к таблице постоянно изменять: n:= n-1.
Основным способом работы с таблицей остается работа с клетками [Cells] с указанием координат – колонки Columns (с) и строки Row (r): StringGrid1.Cells [c,r], с операторами присвоения:
StringGrid1.Cells [c,r]:= «текст» или переменной str: String;
str:= StringGrid1.Cells [c,r];
Так как часто содержание Таблицы – числа, то обычным является применение изменения типов данных: StrToInt (), IntToStr (), StrToFloat (), часто с одновременным форматированием: FloatToStrF (n, ffFixed, count всего цифр, count цифр после запятой).
Данным в таблице можно поставить в соответствие данные Memo (нумерация начинается также с 0 и также первую 0-строчку можно для ясности пропустить). Так же, как и в Memo число строк в таблице может быть ограничено, что прямо указывается в Инспекторе объектов в свойстве RowCount; однако, в таблице присутствуют еще и колонки, чего нет в Memo. Поэтому при обращении к Memo и обратно приходится переходить от 1-мерности Memo к 2-мерности таблиц, записывая в Memo все подряд, а при заполнении таблицы разбивая сплошной текст на участки соответствующие строкам и колонкам.
В Memo строки могут быть большой длины (автоматический перевод на другую видимую строку WardWrap:= true не отражается на нумерации строк).
Поэтому все строки таблицы в пределах одной колонки можно совместить, вводя разделитель (например «;») и записать длинную строку.
Обратный переход потребует несколько большего кода, включающего работы со строками для выделения фрагментов строки Memo между «;» соответствующего строке таблицы.
Большие таблицы можно визуально отражать с определенной строки – TopRow и колонки – LeftRow. Часто таблица предназначено только для чтения – ReadOnly или вообще для промежуточных действий и невидима – Visible:= false.
Новый тип таблиц – Grid позволяет вводить различный типы колонок, например, с цифровым вводом, избавляясь таким образом от необходимости переопределять тип вводимых данных. При этом основным элементов таблицы является колонка, а сама таблица представляет собой по существу, набор колонок разного типа. Ширину колонок можно изменять программно или визуально мышью, а также выделив колонку определить ее ширину в Инспекторе объектов или прямо двигая границу колонки мышью. Ширину строки определяет свойство в Инспекторе объектов.
В соответствии с основной идеей Firemonkey, согласно которой каждый компонент – это также и контейнер для других элементов, TGrid представляет собой контейнер в котором можно разместить FMX-объекты как коллекции строк:
TColumn: столбец таблицы с неопределенным содержимым. Можно использовать для создания своих столбцов (с ComboBox и другими элементами);
TStringColumn: столбец содержит только строки;
TCheckColumn: в столбце будут размещаться чекбоксы;
TProgressColumn: для отображения прогресса операции;
TPopupColumn: столбец со списком выбора;
TGlyphColumn: столбец с картинками;
TDate.. и Ttime.. – специально для даты и времени;
Tinteger… Currency… Float – для различных типов чисел.
Для смешанной таблицы работают обычные для StringGrid процедуры, так, для строки «3» четырех разнотипных колонок:
StringGrid1.Cells [0,3]:= «Это строка 3»; //Колонка для строк
StringGrid1.Cells [1,3]:= ’true’; //Колонка для CkeckBox
StringGrid1.Cells [2,3]:= ’21:20»; //Колонка для ввода времени
StringGrid1.Cells [3,3]:= «123»; //Колонка для чисел
StringGrid1.Cells [4,3]:= «2»; // Колонка № Glyph из ImageList
Базы данных – одно из востребованных возможностей для программ на персональных компьютерах, на приложениях для Android используются реже, однако, разработана специальная группа компонентов Fire, также часто используется база SQLite, встроенной в приложение (группа FireDoc).
Компонент FDConnection обеспечивает соединение с базой данных, компонент FDTable – доступ к таблицам, компонент FDQuery – связь с базой данных посредством SQL запросов. Отображение данных обычно идет для ключевых элементов в Списках, а основная информация – в Таблицах.
Компоненты для Баз данных занимают большую часть палитры Palette, хотя многие не доступны для платформы Android; работа с ними часто идет вместе с компонентами для работы с Интернет и гораздо лучше проводить их на персональном компьютере.
Также, для баз данных и WEB-приложения гораздо лучше подходит язык Phyton с библиотеками.
Рис. 25. Смешанная таблица StringGrid.
10. ГЛАВНЫЙ КОМПОНЕНТ ДЛЯ ПРОГРАММИРОВАНИЯ – Button
Для активации какого-либо действия предназначен основной компонент Кнопка – Button, хотя практически у каждого компонента имеется обильный список свойств и возможностей, среди которых важнейшие: onClick, onChange и реакция на получение фокуса, вход в компонент и выход из него.
На примере Кнопки видны возможности разного визуального отображения компонентов: изменение цвета компонента и текста, размера компонента и шрифта, размытие (тень) и добавление иконки (через ImageListEditor), при этом размер иконки меняется с уменьшением кнопки (с увеличением – до размера самой иконки).
Добавление иконки (начальное значение ImageIndex:= -1 как отсутствие иконки) с помощью ImafeList.
Все эти художества, однако, не спасают компонент Кнопку и достичь обычного для Delphi вида не удается; она предстает как бледный полупрозначный плоский прямоугольник. Можно окрасить кнопку (свойство TintColor) и текст на ней, но это не намного улучшает вид кнопки, как и применение элементов из группы Effects.
Другие типы Кнопки из других групп также не лучше. Получить красивую Кнопку можно из компонента Панель, задействовав TBevelEffect для получения объемного вида, но другие эффекты не воспроизводятся, как и не меняется цвет панели; к тому же компонент Панель утратила текст на ней и цвет и для получения названия новоявленной Кнопки нужно сбросить на нее компонент Label. Кроме того, такая многоэтажная конструкция не только утяжеляет программу и сложность, но и непредсказуемо перестает работать).
Несколько лучше, чем в Delphi 10, ведут себя кнопки в Delphi 11, Android.
Рис. 26. Возможности компонентов в группе Events Инспектора объектов.
11. КОМПОНЕНТЫ ДЛЯ 2D И 3D ГРАФИКИ
11.1. КОМПОНЕНТЫ ДЛЯ ГРАФИКИ: ImageViewer, ImageControl, Image, PaintBox, Chart, Shape