Читать книгу Программирование для Android и работа с датчиками в среде Delphi 11 - Виталий Иванович Донцов - Страница 8
6. ТИПЫ ДАННЫХ В DELPHI Android
ОглавлениеТипы данных, как обычно, объявляются перед началом самым программы (до begin) используя инициацию var:
var
x,y:Integer;
m: Double;
str1:String; // Строковая переменная.
Mas: array [1..100] of String; // Массив одномерный из 100 строк, начало с 1
Ar: array [0..9] of array [0..9] integer; // Многомерный массив,
D: array of real; // Динамический массив
MyChar: Char; // Тип для хранения простого символа.
R: TRect; //Область, ограниченную R. Left,.Top,.Right,.Bottom;
Point: TPointF;.
Численные значения: Word, Integer, Single, Double, Real; учитывая, что точность составляет 5—6 знаков, обычно используют Integer для целочисленных и Double для чисел с запятой, которые могут быть представлены также в формате Е: 3.14E+2 = 3.14E+00 = 3.14; 23.5Е-2 = 0.235. Для округления числа «x» удобно использовать Round (x), округляющий до ближайшего целого (например, превратить Single в Integer); также можно использовать для выделения целой части Trunc (x) и дробной части Frac (x); Ceil (X) – до целого в большую сторону; Floor (X) – до целого в меньшую сторону;
Для ряда функций нужно добавить пакет math в User начала программы. Доступны многие математические функции, в том числе: абсолютное значение abs (х), квадрат sqr (x) и корень квадратный из х: sqrt (x); для степенной функции преобразование: xn = exp (n*ln (x); корень n-й степени из x = exp (1/n*ln (x), хотя имеется также и функция возведения 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; //все начинаются с 1.
– многомерны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 (Строка, Старое значение, новое значение, Флаг [rfReplaceAll, rfIgnoreCase]). Перед копированием целесообразно выделить текст для копирования; Memo.CopyToClipBorad ничего не копирует, для копирования всего содержимого компонента Memo нужно предварительно выделить его содержимое:
Memo.SelectAll; Memo.CopyToClipBorad
Перевод каретки: string1 + #13#10 + string2 (перевод каретки и конец строки с переносом string2 на другую строку).
Изменение типов проводится очень часто, обычно для передачи строкового значения в числовое и наоборот, используют: StrToInt; InToStr; StrToFloat (str); для форматирования: FloatToStrF (str, ffGeneral или ffFixed, count знаков всего, count знаков после запятой. Для Single: x:=Round (x). Для преобразования строки/байты в UTF-8:
bytes:= TEncoding.UTF8.GetBytes (str);
str:= TEncoding.UTF8.GetString (bytes);
TEncoding.ANSI.GetString (Byte);//String из Byte
Строки Java. Для обращения к Java напрямую используют модуль Uses Androidapi. Helpers. Так можно преобразовывать строки:
function JStringToString (const JStr: TJString): String;
function StringToJString (const Str: String): JString;
То же для StrToJCharSequence и StrToJURI.
Дата и Время. Имеется значительное число возможностей работы с датой, но обычно достаточно узнать настоящую дату DateToStr (Now): и текущее время: TimeToStr (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—12 имеется такой же компонент, как и ранее: Timer, запускающийся при присвоении функции Timer. Enable:= true и выключаемый …false; имеет единственное действие, повторяемое через задаваемый промежуток времени (в мСек). Однако, кроме малой точности (50 мСек) при достаточно нагруженной программе он действует крайне медленно, так что практически часто мало пригоден (хотя вне Android работает вполне точно и хорошо). Для получения времени между 2-мя событиями удобнее использовать функции даты-времени:
var // На Кнопку Start
str, h, m, s: String; t1:Integer;
begin
str:= DateTimeToStr (Now); // Начальное время
h:= Copy (str,, 2);// Отсекаем Дату и сразу берем Часы
m:= Copy (str, 15, 2);
s:= Copy (str, 18, 2);
t1:= StrToInt (h) *3600 + StrToInt (m) *60+ StrToInt (s);
Edit1.Text:= IntToStr (t1); //Текущее время в сек
end;
var // На Кнопку Stop
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;
в мСек:= Hour*60*60*1000 + Min*60*1000 + Sec*1000 + Msec;
TGUID
GUID (Globally Unique Identifier) в Delphi является8-битным идентификатором и используется для уникальной идентификации объектов или компонентов приложения. Обычно представляется в формате шестнадцатеричного числа из 32 цифр, разделенных дефисами. В Windows редактор библиотеки типов автоматически генерирует GUID для новых интерфейсов; также можно сгенерировать GUID, нажав CTRL + SHIFT + G. Пример с GUID:
var
MyGuid1: TGUID;
begin
// Создание нового GUID из строки текста
MyGuid1:= StringToGUID (» {00020400-0000-0000-C000—000000000046}»);
//Отображение в Memo заданного GUID
Memo1.Lines.Add («Заданный GUID: ' + GUIDToString (MyGuid0));
end;
Пример создания Массива (на 2 элемента):
const
MyGuid1 =» {99BDAB12-B1B6—41B0—9BF1—2C1DB3D8EC70}»;
MyGuid2 =» {8C7CD303—8D81—469B-99ED-E1F163E9036F}»;
const
MyArray: array [0..1] of TGUID = (MyGuid1, MyGuid2);
begin
***************
end;
Элемент массива можно создать и запитать им, например, элемент ALRealToAudio из AudioLab, который может получать данные из массива:
x:= StrToInt(Memo2.Lines [i]);
MyArray[0].Create (x);
ALRealToAudio1.InputPins.Pins[0].IsConnectedByIDs (MyArray);
Целый ряд компонентов имеет выход с GUID, что позволяет им взаимодействовать также и с заранее не определенными данными компонентов.