Delphi: реальности программирования для смартфонов - Виталий Иванович Донцов 2 стр.



Рис. 12. Стили и их изменение.


Для компонентов имеется также свойство прозрачность: Opacity, по умолчанию 1.0  полная непрозрачность компонента.

Для всех практически компонентов имеется свойство поворота на выбранное число градусов. Практически это свойство значения не имеет, кроме того, при повороте становятся невнятными свойства позиции и пр.

Еще одна проблема со смартфонами: клавиатура закрывает печатаемый текст. Для того, чтобы Видимость текста не заслонялась клавиатурой на сайте разработчиков можно найти модуль vkbdhelper.pas, и подключить к проекту: можно видеть, что пишите и в каком компоненте.

Еще один «подарок» от Delphi 10.3  в режиме Android не доступны Dialog, поэтому обращение к файлам и пр. возможно только путем кода.

Крайне неудобно использовать Panel: она оказывается практически не видна и фактически может использоваться только как контейнер для различных компонентов на ней; она не может изменять цвет, и текст на ней отсутствует. Использование Effects позволяет получить бордюр (только выпирая панель вверх), но это фактически и все. Основное применение Панели  содержать компоненты в себе и выравниваться в Форме (хотя выравнивание вплоть до Client доступно и другим компонентам). Нагрузка Панели различными Effects кроме всего прочего не только утяжеляет программу, но иногда ведет к непредсказуемым влияниям на ее элементы.

3. Общие свойства компонентов

В Delphi 10.3 больше свойств для компонентов, чем в Delphi 7, но на практике оказывается, что наиболее важные у наиболее используемых компонентов отсутствуют, что проявляется в неприглядном виде Кнопок, невидимости Панелей и Окошек и пр. Авторы языка FireMonkey посчитали, что первичное плоское изображение компонентов нужно изменить в соответствии с необходимым дополнительными компонентами, доступными в группе Effects, в которой располагаются десятки компонентов-свойств.

На деле, практически все компоненты группы Effects предназначены для специальных эффектов типа мерцания, медленного исчезновения, жалюзи, скручивания и других мало пригодных для прикладных программ эффектов (а для разработки анимации и игр Delphi 10.3 все еще недостаточно эффективен и медленно работающий). Лишь некоторые из эффектов доступны и эффективны для обычных компонентов: TBevelEffect  эффект фаски (оптимально для Panel) и TInnerGlowEffect  внутреннее свечение, возможно: TReflectionEffect отражение, TGlowEffect  наружное свечение, TShadowEffect  тень и TBlurEffect  размытие. Для задействования эффекта нужно перетащить компонент на форму и через Structure «подчинить» эффект визуальному компоненту управления.


Рис. 13. Стили компонентов и добавление иконки через ImageList Editor.


На примере Кнопки видны возможности визуального отображения компонентов: изменение цвета компонента и текста, размера компонента и шрифта, размытие (тень) и добавление иконки (через ImageListEditor, при этом большая и расположенная с краю иконка неприглядна, увеличивает размер кнопки и практически для смартфона не применима). Видно также, что все эти художества не спасают компонент Кнопку и достичь обычного для Delphi вида не удается. Другие типы Кнопки из других групп также ничем не лучше. Получить красивую Кнопку можно из компонента Панель, задействовав TBevelEffect для получения объемного вида, но другие эффекты не воспроизводятся, как и не меняется цвет панели; к тому же компонент Панель утратила текст на ней (!) и для получения названия новоявленной Кнопки нужно сбросить на нее компонент Label. Все это резко утяжеляет программу, замедляет ее и иногда вообще отменяет написанный под компонент код.

Другой пример: Окошко (Edit): если в нем нет текста, то компонент практически не виден (как на рисунке 13 сразу под ImageList), поэтому приходится сбрасывать на нее TInnerGlowEffect, который проявляется как уже ясно видимое подчеркивание.

Общие свойства компонентов видны из рисунка выше. Из множества свойств нужно менять лишь некоторые, остальные желательно не трогать.


Для компонентов обычно доступны:

 наиболее важное свойство: Align  выравнивание; в Android на смартфоне важно, чтобы компоненты не «ехали» на разных экранах. Из множества типов выравнивания общеприменимы: Вверх, Вниз, Вправо, Влево и Client, растягивающий компонент на весь контейнер (Панель, Форму и пр.), обычно используют несколько панелей вплотную и выравнивание Вверх и Вниз, а между ними  Client. Также имеется выравнивание Scale, впрочем, изменение размеров происходит автоматически для разных экранов.

 изменение размеров (и auto Size для Label),

 изменение цвета, в том числе градиентная заливка,


Рис. 14. Инспектор свойств компонентов.


 изменение размера, цвета и типа шрифта (часто центрируют его, так как изначально он расположен с краю  leading). Также для текстовых компонентов имеется свойство WordWrap (установите как true) для автоматического переноса на следующую строку не умещающегося текста; для просмотра не умещающегося на компоненте текста предусмотрено свойство ShowScrollBars и EnabledScroll = true, а также соответствующий компонент для скроллинга, что, впрочем, часто не работает, а текст видимый на экране при программировании, не помещается на экране смартфона (поэтому нужно часто просматривать текущий результат программирования на реальном подключенном устройстве, а не на виртуальных моделях),

 добавление иконки (через ImageList Editor), без возможности ее сдвига,

 видимость и доступность (Visible и Enable = true/false), причем иногда «недоступная» кнопка продолжает работать,

 возможность фокусируемости на данный компонент и «Read оnly»,

 стиль (обычно приходиться изменять установленный для всей формы стиль на подходящий для данного компонента),

 свойства Position (X и Y) от края контейнера (Панели, Формы) и отступы Margin  справ, слева, сверху и снизу,

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

4. Типы данных в Delphi 10.3

Типы данных, как обычно, объявляются перед началом программы (до begin) используя инициацию var:

var

Mas: array [1100] 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; учитывая, что точность составляет 56 знаков, обычно используют 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); для степенной функции преобразование: x

n

YPower (x,y)

varbeginend

Функция получения вероятного числа: Random (n), по умолчанию пустые скобки ()  вероятное число от 0 до 1; при «n» целочисленном  целочисленное значение от 0 до «n-1».


Символы представлены типом Char: Type: Char = #0..#255; Char:= «3». Код символа можно узнать по функции Chr (n). Код ANSI: #0255. UNICODE: первые 256 символов = ANSI. Chr (66) = B; Char (67) = C.

varbeginend

Присваивание значения требует двоеточия перед равенством: n:= 10; обычное равенство (=) используется в булевых значениях сравнения (true/false): if n = 10 then Неравенство: X <> Y.


Массивы: важная часть программ для накопления данных. Могут быть:

 одномерные: Mas: array [1100] 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).

Для отсчета времени в Delphi 10.3 имеется такой же компонент, как и ранее: Timer, запускающийся при присвоении функции Timer. Enable:= true и выключаемый присвоением false; имеет единственное действие, повторяемое через задаваемый промежуток времени (в мСек). Однако, кроме малой точности (50 мСек) при достаточно нагруженной программе он действует крайне медленно, может тормозить в 2 раза и несколько секунд включаться, так что практически мало пригоден (хотя вне Android работает вполне точно и хорошо). Для получения времени между 2-мя событиями в Delphi 10.3 удобнее всего использовать функции даты-времени:

Разница 2-х времен в Сек:

// На Кнопку varbeginend// На Кнопку varbeginend

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 для ввода иконок и картинок;

Назад Дальше