Текст книги "Delphi: реальности программирования для смартфонов"
Автор книги: Виталий Донцов
Жанр: Компьютеры: прочее, Компьютеры
Возрастные ограничения: +12
сообщить о неприемлемом содержимом
Текущая страница: 2 (всего у книги 6 страниц) [доступный отрывок для чтения: 2 страниц]
4. Типы данных в Delphi 10.3
Типы данных, как обычно, объявляются перед началом программы (до begin) используя инициацию var:
var
x,y:Integer;
m: Double;
n: Float;
str1:String; // Строковая переменная.
Mas: array [1…100] of String; // Массив одномерный из 100 строк, начало с 0
Ar: array [0..9] of array [0..9] integer; // Многомерный массив, начало с 0.
D: array of real; // Динамический массив
MyChar: Char; // Тип для хранения простого символа.
R: TRect; //Область, ограниченную R. Left, R. Up, R. Right, R.Down.
Численные значения: Word, Integer, Doable, Float, Real; учитывая, что точность составляет 5—6 знаков, обычно используют Integer для целочисленных и Double для чисел с запятой, которые могут быть представлены также в формате Е: 3.14E+2 = 3.14E+00 = 3.14; 23.5Е-2 = 0.235. Для округления числа «x» удобно использовать Round (x), округляющий до ближайшего целого; также можно использовать для выделения целой части Trunk (x) и дробной части Frac (x).
Для ряда функций нужно добавить пакет math в User начала программы. Доступны многие математические функции, в том числе: абсолютное значение abs (х), квадрат sqr (x) и корень квадратный из х: sqrt (x); для степенной функции преобразование: xn = exp (n*ln (x); корень n-й степени из x = exp (1/n*lnx). Имеется также функция возведения XY: Power (x,y):
var
Z: Real;
begin
Z:= Power (0.25, 0.5); {Z:= 0.5}
end;
Функция получения вероятного числа: Random (n), по умолчанию пустые скобки () – вероятное число от 0 до 1; при «n» целочисленном – целочисленное значение от 0 до «n-1».
Символы представлены типом Char: Type: Char = #0..#255; Char:= «3». Код символа можно узнать по функции Chr (n). Код ANSI: #0…255. UNICODE: первые 256 символов = ANSI. Chr (66) = B; Char (67) = C.
var
myChar: Char;
begin
myChar:= «G»; // Назначение из символьной константы
ShowMessage («Символ G = ' + myChar); //Получаем «Символ G = G»
myChar:= #65; // Назначение из целочисленной константы
ShowMessage («#65 = ' + myChar); // Получаем «#65 = А»
end;
Присваивание значения требует двоеточия перед равенством: n:= 10; обычное равенство (=) используется в булевых значениях сравнения (true/false): if n = 10 then… Неравенство: X <> Y.
Массивы: важная часть программ для накопления данных. Могут быть:
– одномерные: Mas: array [1…100] of String; // все начинаются с 0.
– многомерныe: Ar: array [0..9] of array [0..9] of integer;
– динамический массив: D: array of real.
Перед использованием динамического массива устанавливается его длина (начинается с 0): setLeangth (D,20). Закрытие массива: D_M: =nil. элементы массива начинаются с 0, исключая строковой массив, начинающийся с 1.
Доступ к массиву по его индексу: n:= D [21]; соответственно: D [21]:= n. Для заполнения массива обычно применяется конструкция цикла:
for n:= 1 to 100 do
begin
D [n]:= n-1; //Нумерует компоненты массива D [100], начиная с 0
end;
Можно найти максимальное и минимальное значение и среднее по массиву: MaxIntVal (D); MinVal (D): double); Mean (D):double), копировать массив в другой с определенного компонента: D:= copy (D, 0, 20) и др.
Строки: ShortString: 255 символов и занимает в памяти 2 байта; String = AnsiString: 1031 символ. AnsiString или WideString содержат большое количество символов. В типе AnsiString символы кодируются в коде ANSI, а в типе WideString в коде Unicode. Общим типом является тип String. String [n] – ограничивает длину строки.
Со строками можно проводить множество операций:
– найти в строке субстроку, ее индекс: n:= Pos (subStr, str);
– копировать строку str c позиции index и числом знаков count: str1:= copy (str, index, count);
– аналогично удалить часть строки по индексу delete (str, index, count);
– вставить субстроку: insert (str1, str0, index);
– длину строки можно узнать как: length (str).
Для выравнивания строк полезна функция вставки пустых символов: StringOfChar (»», count); если использовать моноширинный шрифт, то получим идеально выровненные в столбик строчки.
SelStart и SelLength устанавливают позицию 1-го символа и длину записи, SelText – выделенный текст, весь текст выделяет SelectAll; ClearSelection очищает выделенный текст; Clear очищает текст, Undo возвращает предыдущее действие.
Для копирования текста используют CopyToClipBorad, для вставки Paste, для замены символов StringReplace (). Перед копированием целесообразно выделить текст для копирования; так, Memo.CopyToClipBorad ничего не копирует, для копирования всего содержимого компонента Memo нужно предварительно выделить его содержимое:
Memo.SelectAll;
Memo.CopyToClipBorad
Перевод каретки: string1 + #13#10 + string2 (перевод каретки и конец строки с переносом string2 на другую строку).
Изменение типов проводится очень часто, обычно для передачи строкового значения в числовое и наоборот, используют: StrToInt; InToStr; StrToFloat (str); для форматирования: FloatToStrF (n, ffGeneral или ffFixed, count знаков всего, count знаков после зпт). Вместо Float используют Double.
Дата и Время. Имеется значительное число возможностей работы с датой, но обычно достаточно узнать настоящую дату DateToStr (Now): и текущее время: DateTimeToStr (Now).
Форматы представления даты:
dd/mm/yy hh: mm: ss = 09/02/49 01:02:03
mmm = Feb
mmmm = February
ddd = Tue
dddd = Tuesday
ddddd = 09/02/2049
dddddd = 09 February 2049
hhampm = 01AM
t = 01:02
tt = 01:02:03
dd/mm/yyyy = 09/02/2049
dd/mm/yy hh: mm: ss = 09-02-49 01_02_03
mmm = FEB
mmmm = FEBRUARY
ddd = WED
dddd = WEDNESDAY
ddddd = 09-FEB-49
dddddd = WEDNESDAY 09 of FEBRUARY of 1949
hhampm = 01morning
t = 01_02_03
tt = 01 _ 02 _ 03. 004
dd/mm/yyyy = 09-02-1949
Для отсчета времени в Delphi 10.3 имеется такой же компонент, как и ранее: Timer, запускающийся при присвоении функции Timer. Enable:= true и выключаемый присвоением …false; имеет единственное действие, повторяемое через задаваемый промежуток времени (в мСек). Однако, кроме малой точности (50 мСек) при достаточно нагруженной программе он действует крайне медленно, может тормозить в 2 раза и несколько секунд включаться, так что практически мало пригоден (хотя вне Android работает вполне точно и хорошо). Для получения времени между 2-мя событиями в Delphi 10.3 удобнее всего использовать функции даты-времени:
Разница 2-х времен в Сек:
// На Кнопку Start
var
str, h, m, s: String;
t1:Integer;
begin
str:= DateTimeToStr (Now); // Начальное время
h:= Copy (str, 12, 2);// Отсекаем Дату и сразу берем значение Часы
m:= Copy (str, 15, 2);
s:= Copy (str, 18, 2);
t1:= StrToInt (h) *3600 + StrToInt (m) *60+ StrToInt (s); //Текущее время в сек
Edit1.Tex:= IntToStr (t1);
end;
// На Кнопку Stop
var
str, h, m, s: String;
t, t1, t2:Integer;
begin
str:= DateTimeToStr (Now); // Конечное время
h:= Copy (str,12,2);
m:= Copy (str,15,2);
s:= Copy (str,18,2);
t2:= StrToInt (h) *3600 + StrToInt (m) *60+ StrToInt (s);
t1:= StrToInt (Edit1.text);
t:= t2 – t1;
Edit3.Text:= IntToStr (t); // Итоговое прошедшее время
end;
Можно также использовать функцию разбора времени на составляющие:
var
Hour, Min, Sec, Msec: Word;
begin
DecodeTime (Now, Hour, Min, Sec, Msec);
Edit1.Text:=IntToStr (Hour) +IntToStr (Min) +IntToStr (Sec) + IntToStr (Msec);
end;
5. Вкладки компонентов
Базовые компоненты находятся на вкладке Standard, вкладка Additional используется значительно меньше, так как ее элементы практически дублируют вкладку Standart; из вкладки System можно использовать компонент Timer (с отмеченными ограничениями), вкладка Win 32 исчезла.
Компонент Таблица представлен во вкладке Grids двумя таблицами – обычной строковой StringGrid и Grid в котором можно использовать самые разные типы данных и вставлять другие компоненты, также отдельный компонент Заглавие – Header.
Желание разнообразить возможности рисования обернулись их резким усложнением, однако, появилась вкладка Shapes, где представлены различными компонентами: прямоугольник, круг, овал, дуга, линия, подпись и другие типичные элементы рисунков, свойства которых можно задавать программно и рисовать или создавать графики.
Компоненты графиков представлены единственным PlotGrid с сеткой и осями координат, на котором фактически нужно рисовать график вручную.
Вкладку Effects, задуманная для придания красивого вида элементов, использовать можно разве что для того, чтобы сделать хоть как-то видимым компонент Edit. Различные эффекты мигания, скручивания, жалюзи и пр., как и ротация, доступная практически для всех элементов, предназначены для анимации (как и вкладка Animations, вкладка Styles и вкладки для 3D вида компонентов), к которой сам Delphi как раз не предназначен, и работать на смартфоне будет в лучшем случае очень медленно. Для прикладных программ это вообще дурной тон.
Видимо, вкладка LiveBinding, нововведение авторов языка Firemonkey, отслеживающая «жизнь» компонентов и их связь между собой, также вряд ли подойдет для привыкших к обычному программированию.
Вкладка Color представлена множеством компонентов для работы с цветом, часто взаимодействующими между собой, и также скорее подходят для анимации, чем для прикладных программ. Определенный интерес представляет возможно простой ColorBox. Для создания цветового градиента с целью приданию графику вида «зеленая и красная области» подойдут два компонента Rectangle (прямоугольник) из вкладки Shapes, на которые накладываются другие прямоугольники уже как графики данных.
Как уже отмечалось, важными элементами приложения являются компоненты их вкладки Layouts, отвечающие за выравнивание компонентов, в них находящихся, хотя со времен первых вариантов Delphi эту функцию успешно играет компонент Панель – Panel, которая, к сожалению, лишилась теперь свойств цвета и текста, как и элементов бордюра.
Вкладка Common Control представлена рабочими элементами – TabControl и MultiView.
Важнейшая вкладка Dialogs в Delphi 10.3 отсутствует (вернее, не доступна для платформы Android).
Целый ряд вкладок предназначен для работы с Базами данных, в том числе SQL и специальная с широкими возможностями – Fire, вместе с вкладками для работы в Интернет.
Особое значение для Android имеют компоненты работы с элементами смартфона: камерой, сенсорами, аудиоплеером, интернетом, Bluetooth (вкладка Systems), что, впрочем, гораздо лучше делает сам смартфон. Для работы нужно включить флажок в: Project – Options – Uses Permissions.
Важнейшей, однако, остается вкладка Standard, в которой сосредоточены компоненты ввода и вывода текста и цифровых данных и действий над ними.
Для обычной рутинной работы для каждого приложения понадобятся:
– из вкладки Standard: Label (метка), Edit (окошко), Memo (многостраничный текстовый компонент, аналог отсутствующего Rich Edit), Button (кнопка), CheckBox или RadioButton для выбора условий, ListBox (списки), ImageControl вместе с ImageList Panel для ввода иконок и картинок;
– из вкладки Addinional: PlotGrid для графиков, NumberBox для ввода числовых значений, ComboEdit для сложного ввода, и возможно MediaPlayer;
– из вкладки Grids: обычная StringGrid для текстовых данных;
– вкладка Shapes: с уже готовыми фигурами неоценима для создания графиков;
– из вкладки Colors: возможно, ColorBox;
– из вкладки Effects: BevelEffect для создания бордюра компонента Panel, и TinnerGlowEffect для придания видимости компоненту Edit;
– компоненты вкладки Layouts нужны для выравнивания содержащихся других компонентов, хотя традиционно эту роль выполняет компонент Panel.
Таким образом, основные рабочие компоненты сосредоточены на вкладке Standart и большинство предназначено для ввода/вывода информации, причем текстового характера.
Типичные компоненты для ввода текста:
– Метка – Label,
– Окошко – Edit,
– компонент многостраничного ввода – Memo (RichEdit отсутствует),
– Списки – List.
Свойства компонентов можно задавать в Инспекторе объектов или кодом, соответствующим свойствам. При добавлении на Форму компонент появляется в соответствующем Форме стиле, поэтому приходится для каждого компонента убирать все элементы стиля (ставить false во всех свойствах StyledSettings) и создавать свой собственный стиль, нужный именно этому компоненту; также можно установить видимый стиль компонента (StyleLookup), обычно его можно пропустить или ставить всегда соответствующим данному компоненты.
Общие свойства (размеры, стиль, положение, видимость, доступность, фокусируемость, позиция и отступы, свойство «только для чтения», свойства шрифта и пр.) описаны выше, также имеются некоторые собственные свойства и способы работы с компонентами.
6. Компоненты для ввода и вывода текста
6.1. Компонент Метка – Label
Компонент Label – предназначен для текстовой информации, например, заголовков, но подойдет и для ввода/вывода любого короткого текста. При использовании как заголовка ему лучше придать значение выравнивание Align: Top или Bottom и растянуть на всю Форму, не забыв центрировать текст в TextSetting (изначально свойство представлено как leading).
Общие StyledSetting обычно приходится убирать (false) и ставить собственные в TextSettings, свойства ротации и анимации вряд ли нужны.
Важны также свойства: ReadOnly (запрещает вход и изменение текста, хотя программно можно изменять текст) и AutoSize – автоматический размер под текст, который можно и не ставить, а лучше сделать побольше размер в высоту и ширину.
Также важно свойство WordWrap = true в TextSetting, которое автоматически переводит не вмещающийся текст на строчку ниже.
Свойства компонента можно задавать и кодом. Работа с компонентом состоит обычно в передаче и считывании текста:
Label1.Text:= «Вводимый текст»; //текст в кавычках
Label1.Text:= str; // str – строковая переменная
str:= Label1.Text;
Label1.Text. Empty = «»;
Начальный текст обычно задается в Инспекторе объектов, как и его характеристики, которые можно поменять программно в ходе работы приложения.
Из длинного списка свойств и действий, предлагаемого подсказкой после ввода названия компонента и точки, означающей ввод свойств или действий, на самом деле используется обычно только ввод и вывод текста, а чаще всего Label используется вообще однократно при создании приложения для заголовков или подписей.
Рис. 15. Предлагаемые программно свойства и действия для компонента Label.
6.2. Компонент Окошко – Edit.
Компонент Edit, наверно, наиболее используемый в работе (наряду с Кнопкой – Button, которая и задает действия с ним).
Если в обычном Delphi это обычное белое окошко, то в Delphi 10.3 это фактически не видимый элемент, с едва заметным подчеркиванием, которое приходится доводить до видимости компонентом из вкладки Effects – InnerGlowEffect; если учитывать, что компонент используется для ввода и приходится буквально тыкать в него пальцем на экране, то это становится критичным.
Рис. 16. Вид компонента Edit в различном оформлении и состоянии.
Основное свойство компонента Edit, естественно, вводимый Text, который можно ввести при создании компонента или затем программно.
Так как при вводе в компонент используются как текстовые данные цифры, часто важно установить тип вызываемой при обращении к компоненту клавиатура: KeyboardType – изначальный Default общей клавиатуры заменить на раскладку ввода цифр – DecimalNumberPad.
Также можно ограничить максимальное вводимое число знаков (MaxLength) и задать фильтры для ввода символов.
Для ограничения ввода отслеживаются вводимые символы:
Реакция Edit на клавиши: KeyPress:
if key = #13 // клавиша <Enter> then…;
case Key of
«0».. «9», #8:; // цифры и BackSpace
#13: Edit3.SetFocus; // переместить на Enter
«-’: if Length (Edit2.Text) <> 0 then Key:= #0; //ничего не отображать за выходом из рамок окна
else Key:= #0; // остальные символы не отображать.
end;
Или: на keyPress: if key = VK_Eskape (Enter) then…
Можно также:
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:; // цифры и <Backspace>
// Замена точки или запятую десятичной дроби на правильный разделитель – DecimalSeparator
«.»,»,»
begin
Key:= FormatSettings.DecimalSeparator;
//проверка правильности разделителя
if pos (Key, Edit1.Text) <> 0
then Key:= #0;
end;
#13: Edit2.SetFocus; // <Enter> переместиться в поле Edit
else Key:= #0; // Остальные символы запрещены
end;
end;
Впрочем, гораздо проще установить фильтр ввода данных, который можно вставить в соответствующее свойство в Инспекторе объектов, или ввести программно:
Edit1.FilterChar:= «0123456789»;
Также, Edit часто задействуют для счета каких-либо действий (в т.ч. времени по компоненту Timer), что позволяет процедурой onChange (на изменение) раздела Events Инспектора объектов запустить какое-либо действие при достижении определенного счета или условия.
Хотя все компоненты имеют процедуру onClick фактически это прерогатива компонента Кнопка – Button. К тому же, некоторые элементы реагируют на Click по ним открывая свойство не onClick, а onChange, а вкладка Events почему-то часто плохо работает и не открывается сразу.
Ограничить ввод можно свойством ReadOnly, а также свойствами Enabled и CanFocus; свойство CheckSpelling позволяет задействовать контроль правописания.
Задействовав свойство Password (true), можно заменить входящий текст видимыми точками, сделав компонент для ввода пароля.
В компонент можно также вставить Кнопки, щелкнув по нему правой кнопкой мыши и выбрав в Item Editor.
Рис. 17. Добавление в компонент Edit других компонентов.
6.3. Компонент Список – ListBox
Компонент ListBox представляет собой Список элементов. Свойства: Count – число элементов списка; Items – массив строк списка; ItemIndex – номер элемента в списке (-1 если ничего не выбрано); Sorted – сортировка элементов.
В свойстве items нажав на три точки (…) можно открыть String List Editor и заполнить список (начинается с 0). Добавить элемент списка можно командой ListBox.Items.Add («Вводимый текст»), причем можно вставить и объект: ListBox.AddObjectsToList (),
Свойство AlternatingRowBakground позволяет окрасить через один элементы списка в другой цвет, что улучшает вид и поиск элементов. Свойство columns разделит список на колонки; свойство ShowCheckboxes покажет флажки; ListStyle – горизонтальный или вертикальный стиль; MultiSelectStyle – разрешает множественный выбор элементов.
Рис. 18. Заполнение элемента ListBox при создании с помощью Items Editor.
К сожалению, в палитре Palette мы не найдем удобного компонента Dictionary, превосходящего по удобству и скорости компонент Списки.
6.4. Компонент ComboBox
Компонент ComboBox представляет собой комбинацию Списка и Поля редактирования, что позволяет вводить данные как с клавиатуры, так и по индексу списка, выбрать данные в списке, удалить элемент списка.
Count число элементов списка; DropDownCount – количество элементов в раскрытом списке; Text – текст находящийся в поле редактирования (ввода); Items – массив строк списка; ItemIndex – номер элемента в списке (-1 если ничего не выбрано); Sorted – сортировка элементов.
В свойстве items можно открыть String List Editor и заполнить список (начинается также с 0). Команда ComboBox1.Items.Add («Вводимый текст») добавит элемент списка; ComboBox1.Items.Clear – очистит список. Вместо стиля текста имеется общий стиль Style Name.
Рис. 19. Компонент ComboBox с флажками в 2 колонки, вертикальный.
FireMonkey введен еще один компонент для просмотра списка, который можно использовать для хранения и представления различных типов элементов – ListView. Он отображает коллекцию элементов в списке, оптимизированном для быстрой и плавной прокрутки.
Элементы в виде списка могут иметь одну или несколько следующих функций внешнего вида:
– Заголовок или подробный текст (например, с использованием элемента Item. Text;
– Связанное изображение (например, с помощью элемента Item.Bitmap;
– Значок, например, с помощью Items. Appearance;
– Прикрепленная графическая или текстовая кнопка, например, с помощью Item. ButtonText.
Можно настроить внешний вид представления списка, изменив расположение элементов списка, включая заголовок, связанное изображение, текстовые сведения или значок аксессуара.
В TListView есть режим редактирования, в котором можно выбрать один или несколько элементов.
Элементы в TListView можно добавлять либо путем привязки к источнику данных, либо с помощью кода: TListView.Items.Add.
Аналогично, можно использовать компонент PopupBox:
PopupBox1.Items.Add («Item1»);
PopupBox1.Items.Add («Item2»);
Компонент StatusBar обычно выровнена по нижней части формы и отображает информацию о приложении по мере его запуска.
Компонент ToolBar предоставляет пользователю панель инструментов или набор команд, которые можно использовать для активации определенных функций в программном обеспечении. Элементы управления панелью инструментов часто используются в программах для обработки грамматики или текста и обычно предоставляют пользователю быстрый доступ к часто используемым функциям, таким как выделение текста жирным шрифтом, курсивом или подчеркивание.
Внимание! Это не конец книги.
Если начало книги вам понравилось, то полную версию можно приобрести у нашего партнёра - распространителя легального контента. Поддержите автора!Правообладателям!
Данное произведение размещено по согласованию с ООО "ЛитРес" (20% исходного текста). Если размещение книги нарушает чьи-либо права, то сообщите об этом.Читателям!
Оплатили, но не знаете что делать дальше?