
Полная версия:
Программирование для Android и работа с датчиками в среде Delphi 11
– из вкладки Grids: обычная StringGrid текстовых данных;
– вкладка Shapes: с уже готовыми фигурами для графиков;
– из вкладки Colors: возможно, ColorBox;
– из вкладки Effects: BevelEffect для создания бордюра компонента Panel, и TinnerGlowEffect для придания видимости ком- поненту Edit;
– компоненты вкладки Layouts нужны для выравнивания содержащихся других компонентов, хотя традиционно эту роль выполняет компонент Panel.
Таким образом, основные рабочие компоненты сосредоточены на вкладке Standart и большинство предназначено для ввода/вывода информации, причем текстового характера.
Типичные компоненты для ввода текста:
– Метка – Label,
– Окошко – Edit,
– компонент многостраничного ввода – Memo,
– Списки – List.
Свойства компонентов можно задавать в Инспекторе объектов или кодом, соответствующим свойствам. При добавлении на Форму компонент появляется в соответствующем Форме стиле, поэтому приходится для каждого компонента убирать все элементы стиля (ставить false во всех свойствах StyledSettings) и создавать свой собственный стиль, нужный именно этому ком- поненту; также можно установить видимый стиль компонента (StyleLookup), обычно его можно пропустить или ставить всегда соответствующим данному компоненты.
Общие свойства (размеры, стиль, положение, видимость, доступность, фокусируемость, позиция и отступы, свойство «только для чтения», свойства шрифта и пр.) описаны выше, также имются некоторые собственные свойства и способы работы с каждым отдельным компонентом.
8. КОМПОНЕНТЫ для ВВОДА И ВЫВОДА ТЕКСТА
8.1. КОМПОНЕНТ МЕТКА – Label
Компонент Label – предназначен для текстовой информации, например, заголовков, но подойдет и для ввода/вывода любого короткого текста. При использовании как заголовка ему лучше придать значение выравнивание Align: Top или Bottom и растянуть на всю Форму, не забыв центрировать текст в TextSetting (изначально свойство представлено как leading).
Общие StyledSetting обычно приходится убирать (false) и ставить собственные в TextSettings, свойства ротации и анимации вряд ли нужны.
Важное свойство: AutoSize – автоматический размер под текст, который можно и не ставить, а лучше сделать побольше размер в высоту и ширину.
Также важно свойство WordWrap = true в TextSettings, которое автоматически переводит не вмещающийся текст на строчку ниже (нумерация строчек в Memo при этом не меняется!).
Свойства компонента можно задавать и кодом. Работа с компонентом состоит обычно в передаче и считывании текста:
Label1.Text:= «Вводимый текст»; //текст в кавычках»»
Label1.Text:= str; // str – строковая переменная
str:= Label1.Text;
Label1.Text. Empty = «»;
Начальный текст обычно задается в Инспекторе объектов, как и его характеристики, которые можно поменять программно в ходе работы приложения.
Из длинного списка свойств и действий, предлагаемого подсказкой после ввода названия компонента и точки, означающей ввод свойств или действий, на самом деле используется обычно только ввод и вывод текста, а чаще всего Label используется вообще однократно при создании приложения для заголовков или подписей.

Рис. 19. Предлагаемые программно свойства и действия для компонента Label.
8.2. Компоненты ввода текста и чисел: Edit, ComboEdit, NumberBox
Edit
Компонент Edit, наверно, наиболее используемый в работе (наряду с Кнопкой – Button, которая и задает действия с ним).
Если в обычном Delphi 7 это обычное белое окошко, то в Delphi 11 это фактически не видимый элемент, с едва заметным подчеркиванием, которое приходится доводить до видимости компонентом из вкладки Effects – InnerGlowEffect.
Если учитывать, что компонент используется для ввода и приходится буквально тыкать в него пальцем на экране, то это становится критичным.

Рис. 19. 3 вида компонента Edit в различном оформлении.
Основным свойством компонента, Edit, передающим введённую информацию, является свойство Text типа String. Вводимый Text можно ввести при создании компонента или затем программно. Не помещающийся текст остается доступен программно, но не виден на экране. Для работы с числами можно перевести текст в число: целое: X:= StrToInt (Edit1.Text); дробное: = StrToFloat (Edit1.Text);
Так как при вводе в компонент используются как текстовые данные цифры, то часто важно установить тип вызываемой при обращении к компоненту клавиатура: KeyboardType – изначальный Default общей клавиатуры заменить на ввод цифр – DecimalNumberPad.
Также можно ограничить максимальное вводимое число знаков (MaxLength) и задать фильтры для ввода символов.
Для ограничения ввода отслеживаются вводимые символы:
Реакция Edit на клавиши: KeyPress:
if key = #13 // клавиша
case Key of
«0».. «9», #8:; // цифры и BackSpace
#13: Edit3.SetFocus; // переместить на Enter
«-’: if Length (Edit2.Text) <> 0 then Key:= #0; //ничего не отображать за выходом из рамок окна
else Key:= #0; // остальные символы не отображать.
end;
Можно также:
procedure TForm1.Edit1KeyDown (Sender: TObject; var Key: Word);
var
KeyChar: Char; Shift: TShiftState);
begin
if ((KeyChar <«0») or (KeyChar> «9») or (Length (Edit1.Text)> =11))
and (KEY <> 8) and (KEY <> 46) then //8 и 46 код клавиш Backspace и Del
begin
KeyChar:= #0;
if (Length (Edit1.Text)> =11) = false then
ShowMessage («Допускаются только цифры!»)
else
ShowMessage («Длина текста превысила 11 знаков!»)
end; end;
Или:
procedure TForm1.Edit1KeyPress (Sender: TObject; var Key: Char);
begin
case Key of
«0».. «9», #8:; // цифры и
// Замена точки или запятую десятичной дроби на правильный разделитель – DecimalSeparator
«.»,»,»
begin
Key:= FormatSettings.DecimalSeparator;
//проверка правильности разделителя
if pos (Key, Edit1.Text) <> 0
then Key:= #0;
end;
#13: Edit2.SetFocus; //
else Key:= #0; // Остальные символы запрещены
end;
Проще, однако, установить фильтр ввода данных:
Edit1.FilterChar:= «0123456789»;
Или: keyPress: if key = VK_Eskape (Enter) then…
Или на Edit1KeyPress: if Key=»,» then Key:=».»;//Замена на лету
Ограничить ввод можно свойством ReadOnly, а также свой ствами Enabled и CanFocus; CheckSpelling – контроль правописания.
Задействовав свойство Password (true), можно заменить входящий текст видимыми точками, сделав компонент для ввода пароля.
Выделить часть текста можно:
Edit1.SetFocus; Edit1.SelStart:= 1; Edit1.SelLength:= 1;
С компонентом можно также связать Кнопки, щелкнув по нему правой кнопкой мыши и выбрав в Item Editor, например, кнопку очистки.
ComboEdit представляет собой строку редактирования, комбинированную с кнопкой, аналогично тому, как объединен редактор текста и кнопка выпадающего списка в стандартном элементе ComboBox.
NumberBox.
Для ввода непосредственно чисел не нужно использовать преобразования IntToStr (n), существуют специальные компоненты для ввода чисел (тип Single): NumberBox и SpinBox со свойством Value, при этом для отображения в качестве текста имеется свое свойство:
Label1.Text:= NumberBox1.Text;
Label1.Text:= SpinBox1.Text;
Также следует определить ValueType (Integer/Float) в Object Inspector (однако, при выборе Integer преобразование IntToStr все равно не действует без дополнительного Round). DecimalDigits отображает число десятичных знаков. Свойства HorzIncrement и VertIncrement: шаг приращения. Свойство Value компонента относится к Single, но даже выставив X как Integer в Object Insoector придется изменять тип: y:= round (x).

Рис. 20. Добавление в компонент Edit других компонентов.
SpinBox
SpinBox – окно редактирования, может отображать только число, с кнопками для увеличения и уменшения отображаемого значения.
ComboTrackBar
У ComboTrackBar – cвойства те же, и отображение каретки для ComboTrackBar (свойства Visible и CanShow) и режим выпадающего списка.
ComboEdit
Строка редактирования, комбирированная с кнопкой выпадающего списка (DropDownCount), с возможностью ввода строк текста (свойство Items). ComboEdit1.Items.Add (String) добавляет строчку; можно добавить строчку и цифру: ComboEdit1.Items.AddPair (String: String, Value: String).
TdateEdit, TtimeEdit, TCalendar
Позволяют в вид диалога выбрать дату, время. Строка ввода при получении фокуса отображает диалог выбора, результат передается в свойство DateTime (вместе или раздельно).
8.3. КОМПОНЕНТ СПИСОК – ListBox
Компонент ListBox представляет собой Список элементов. Свойства: Count – число элементов списка; Items – массив строк списка; ItemIndex – номер элемента в списке (-1 если ничего не выбрано); text – все содержимое компонента; Sorted – сортировка элементов.
В свойстве items нажав на три точки (…) можно открыть String List Editor и заполнить список (начинается с 0).
Добавить элемент списка можно командой:
ListBox.Items.Add («Вводимый текст»);
причем можно вставить и объект: ListBox.AddObjectsToList ();
Свойство AlternatingRowBakground позволяет окрасить через один.
Свойство columns разделит список на колонки.
Cвойство ShowCheckboxes покажет флажки.
Cвойство ListStyle – горизонтальный или вертикальный;
MultiSelectStyle – разрешает множественный выбор.
Заполнять многостраничный список строками из Memo:
ListBox1.Items:= Memo13.Lines;
Можно каждую строчку, выделив мышью или в Items Editor, форматировать отдельно: тип, размер, цвет шрифта… Или программно:
listbox1.ListItems[n].StyledSettings:= listbox1.ListItems [n].StyledSettings – [TStyledSetting. Family, TStyledSetting.Size];
listbox1.ListItems[n].Font. Family:=«Tahoma’;
listbox1.ListItems[n].Font.Size:= 14;
Главные функции работы с ListBox:
listbox1.ListItems[n].Font. Family:= «Tahoma’;//Шрифт
listbox1.ListItems[n].Font.Size:=;//Размер шрифта
istBox1.ItemHeight; // Высота строки
istBox1.Items. LoadFromFile («Имя_Файла»);//Загрузка файла
ListBox1.Items.SaveToFile («Имя_Файла»); //Сохранить файл
ListBox1.Items.Add («Новая Строка»); //Строка в конец списка
ListBox1.Items.Insert (i, «Новая_Строка»); // Добавление строки перед строкой с номером i
ListBox1.Text – все данные списка;
Индекс строки: i:= ListBox3.ItemIndex;
Получить текст выделенной строки:
str:= ListBox1.Items[ListBox1.ItemIndex];
Доступ к элементу списка:
ListItems [Index] или ItemByIndex (Index);
или with ListBox1 do s:= Items [ItemIndex];
Выделить все: SelectAll; Снять выделение: ClearSelaction;
Поменять местами элементы: Excange [Item1, Item2];
Удаление строки: ListBox1.Items.Delete (i);
Сортировка списка: ListBox1.Sorted:= True;
Поставить в соответствие строкам Списка ячейки Таблицы:
with ListBox1, StringGrid1 do Cells [i, j]:= Items [ItemIndex];
Прокрутить список (выбранная строка вверху):
ListBox1.ScrollToItem(ListBox1.ItemByIndex (n);

Рис. 21. Заполнение строчек ListBox (2 колонки).
Свойство Events: OnClick – основное для работы с компонентом, при этом на первое касание строки она выделяется (серым), на второе – выполняется запрограммированное действие.
Загрузить компонент данными можно и таким образом:
for i:= 0 to ADevices.Count-1 do
begin
Item:= TListBoxItem.Create (ListBox1);
Item.StyleLookup:= ’listboxitembottomdetail’;
Item. ItemData. Text:= ADevices[i].DeviceName;
Item. ItemData.Detail:= ADevices[i].Address;
ListBox1.AddObject (Item);
end;
Здесь также видна возможность редактирования стиля списка:
Item.StyleLookup:= ’listboxitembottomdetail’;
Позволяет загружать список из строки и уменьшенной подстроки:
Item. ItemData. Text:= ADevices[i].DeviceName;
Item. ItemData.Detail:= ADevices[i].Address;
Свойство Bitmap позволяет ассоциировать с элементом картинку.
Полная очистка списка осуществляется методом Clear, обновление:
var
ListBoxGroupHeader: TListBoxGroupHeader;
begin
ListBox1.BeginUpdate;
ListBox1.Clear;
ListBoxGroupHeader:= TListBoxGroupHeader.Create (ListBox1);
ListBoxGroupHeader. Text:=«Files for Sending.»;
ListBox1.AddObject (ListBoxGroupHeader);
ListBox1.EndUpdate;
end;
Можно индивидуально формировать строки списка, в том числе ширину и высоту строк (Общие свойства в Object Inspector – ItemWith и ItemHeight будут отображать нули).
Компонент часто используют для ввода списка, например, файлов:
var
n: Integer;
s, sd: String;
ListBoxGroupHeader: TListBoxGroupHeader;
begin
//Очищаем Memo и ListBox
Memo1.Lines.Clear;
ListBox1.BeginUpdate;
ListBox1.Clear;
ListBoxGroupHeader:= TListBoxGroupHeader.Create (ListBox1);
ListBoxGroupHeader. Text:=«Files List.»;
ListBox1.AddObject (ListBoxGroupHeader);
ListBox1.EndUpdate;
//Ищем и вносим в ListBox1 все *.txt файлы из downlowd
n:=0;
sd:= '/storage/emulated/0/Download’;
for s in TDirectory.GetFiles (sd, «*.txt’) do
begin
n:=n+1;
ListBox1.Items.Add (Copy (s, Length (sd) +2,100));
listbox1.ListItems[n].StyledSettings:= listbox1.ListItems [n]. StyledSettings – [TStyledSetting. Family, TStyledSetting.Size]; //Формат
listbox1.ListItems[n].Font. Family:=«Tahoma’;
listbox1.ListItems[n].Font.Size:= 14;
end;
if n = 0 then
ShowMessage («Нет *.txt файлов в Download!»)
else
ShowMessage («Обнаружено ‘ + IntToStr (n) + «файлов).
Использован вариант перечисления: for s in, а путь к директории объявлен прямо: '/storage/emulated/0/Download’, что возможно при объявлении разрешений на чтение файлов из внешних источников; перед открытием файлов ListBox обновляется, это нужно делать внутри методов:
ListBox1.BeginUpdate;
*****************
ListBox1.EndUpdate;
8.4. КОМПОНЕНТ ComboBox
Компонент ComboBox представляет собой комбинацию Списка и Поля редактирования, что позволяет вводить данные как с клавиатуры, так и по индексу списка, выбрать данные в списке, удалить элемент списка. Он занимает всего одну строчку, в отличие от ListBox.
Count число элементов списка; DropDownCount – количество элементов в раскрытом списке; Text – текст находящийся в поле редактирования (ввода); Items – массив строк списка; ItemIndex – номер элемента в списке (-1 если ничего не выбрано); Sorted – сортировка элементов. В свойстве items можно открыть String List Editor и запол нить список (начинается с 0).
Команда ComboBox1.Items.Add («Вводимый текст») добавит элемент списка; а команда ComboBox1.Items.Clear – очистит список. Вместо стиля текста имеется свойство Style Name.

Рис. 22. Компонент ComboBox с картинкой и указателем «V».
Аналогично, можно использовать компонент PopupBox:
PopupBox1.Items.Add («Item1»);
Компонент может загружать / сохранять данные в файл.
Компонент StatusBar обычно выровнен по нижней части формы и отображает информацию о приложении по мере его запуска: ProgressBar1.Value:= ProgressBar1.Value + n;
Компонент ToolBar предоставляет пользователю панель инструментов или набор команд, которые можно использовать для активации определенных функций в программном обеспечении. Элементы управления панелью инструментов часто используются в программах для обработки грамматики или текста и обычно предоставляют пользователю быстрый доступ к часто используемым функциям, таким как выделение текста жирным шрифтом, курсивом…
8.5. ListView
FireMonkey введен еще один компонент для просмотра списка, который можно использовать для хранения и представления различных типов элементов – ListView.
Элементы в виде списка могут иметь одну или несколько функций:
Заголовок или текст (используя элемент Item. Text);
Связанное изображение (с помощью Item.Bitmap);
Значок, с помощью Items. Appearance;
Прикрепленная графическая или текстовая кнопка, с помощью Item. ButtonText.
Можно настроить внешний вид представления списка, изменив расположение элементов списка, включая заголовок, связанное изображение, текстовые сведения или значок аксессуара.
В ListView есть режим редактирования, в котором можно выбрать один или несколько элементов.
Элементы в TListView можно добавлять либо путем привязки к источнику данных, либо с помощью кода: ListView.Items.Add для добавления в конец, или внедрить внутрь: ListView.Items.Insert.
Удалить строку: TListView.Items.Delete (i);
Изменить текст в выбранной ячейке на текст в Edit:
ListView1.Items.Item [n]:= Edit1.Text;
Число в строку: i.ToString;
Имеется уточняющее свойство: Detail;
Для заполнения, вставки, сортировки списка используют:
ListView1.BeginUpdate…..EndUpdate.
Свойство OnFilter позволяет тонко обращаться с элементами.
Свойство ItemAppearance (в Onject Inspector) позволяет определить: колонтитулы, внешний вид и поведение компонента:
подсвойство ItemAppearance – пояснительный рисунок, наличие основного и детализированного текста, наличие управляющей кнопки в режиме просмотра;
подсвойство ItemEditAppearance – поведение элемента в режиме редактирования.
В коде программы вместо этих свойств используют: ItemAppearanceName и ItemEditAppearanceName.
8.6. МНОГОСТРОЧНЫЙ ТЕКСТОВОЙ КОМПОНЕНТ Memo
За неимением компонента RichEdit его функции исполняет Memo, имеющая практически те же свойства и действия (кроме форматирования текста); по внешнему виду это простое белое поле.
Нужно установить свой стиль шрифта (в TextSettings, отменив все в StyledSettings); CheckSpelling определяет возможность проверки орфографии; обязательно укажите в настройках WordWrap = true, чтобы не вмещающийся в строчку текст автоматически переходил на строчку вниз. Прокрутка не вмещающегося на экране текста установлена в свойствах автоматически.
Для простого вывода информации нужно установить запрет редактирования: ReadOnly:= true.
Основное свойство компонента: Lines, в которое вводится текст при создании компонента или программно (что является основным):
– текст добавит команда Memo1.Lines.Add («Вводимый текст»);
– получить строчку текста по индексу: str:= memo1.Lines [n];
– скопировать весь текст:
Memo1.SelectAll; Memo1.CopyToClipboard;
Компонент Memo удобен также как база данных. Он может хранить большое количество информации, а заполнить его очень просто, скопировав в Lines в Object inspector при создании компонента строчки, созданные в обычном Word, при этом шрифт сам примет все значения, установленные для Memo.
Можно достаточно просто установить обмен информацией с компонентом Таблица, поставив его Cells [] в соответствие строкам Memo (счет начинается с 0 для обоих компонентов).
Для того, чтобы придать данным из Memо 2-мерный тип, характерный для Таблицы, можно отделить друг от друга части текста в строке, предназначенные для строк (или колонок) Таблицы, например (;), а при загрузки Таблицы использовать функции работы с текстом: копирования части текста до определенного элемента (;), позицию этого элемента, удаление предыдущей части текста для копирования следующей части текста.
Но если в Delphi 7 количество строк в Memo может составлять несколько тысяч, то в ситуации с Android число строк может быть ограничено; при этом можно сохранить и большее число строк, но при обращении Memo1.Lines [101] и более может происходить сбивка адресации и неуправляемые действия.
Для просмотра строчек вне видимости, автоматически предусмотрены установки по скроллингу.
Несомненным достоинством компонента является наличие собственого свойства сохранения и загрузки в файл (без проблем – во внутреннюю область):
Memo1.Lines.SaveToFile (GetHomePath + '/Имя файла. txt’);
Memo1.Lines. LoadFromFile (GetHomePath + '/Имя. txt’);
Другие функции работы с текстом в Memo:
Memo1.ClearSelection; // удалить выделенный текст
Memo1.CutToClipboard; // вырезать в буфер обмена
Memo1.CopyToClipboard; // скопировать в буфер обмена
Memo1.PasteFromClipboard; //вставить из буфера обмена
Memo1.SelText; //функция возвращает текстовую строку выделенного текста
Memo1.Undo; // отмена последнего изменения
Memo1.Lines.Delete (0); //удаление 0 строки
Memo1.SelStart:= 0; //начальное положение выделения
Memo1.SelLength:= 15; //Длина выделенного текста
Если необходимо всегда видеть выделенный текст, даже при переходе управления на другой элемент управления, то установите свойство HideSelection в false.
8.7. КОМПОНЕНТЫ ВЫБОРА CheckBbox и RadioButton
Компоненты CkeckBox и RadioButton используются для выбора уже известных условий.