ТОП 10:

Символы (char) и строки (string), работа с ними. Функции и процедуры для работы со строками (Length, Copy, Pos, Concat, Insert, Delete, IntToStr, StrToInt, FloatToStr, StrToFloat).



Символы (char) и строки (string), работа с ними. Функции и процедуры для работы со строками (Length, Copy, Pos, Concat, Insert, Delete, IntToStr, StrToInt, FloatToStr, StrToFloat).

Char:Существуют два фундаментальных символьных типа данных: AnsiChar и WideChar .Они соответствуют двум различным системам кодировки символов. Данные типа AnsiChar занимают один байт памяти и кодируют один из 256 возможных символов расширенной кодовой таблицы ANSI, в то время как данные типа WideChar занимают два байта памяти и кодируют один из 65536 символов кодовой таблицы Unicode. Кодовая таблица Unicode — это стандарт двухбайтовой кодировки символов. Первые 256 символов таблицы Unicode соответствуют таблице ANSI, поэтому тип данных AnsiChar можно рассматривать как подмножество WideChar

Фундаментальные типы данных:

Тип данных Диапазон значений Объем памяти (байт)
AnsiChar Extended ANSI character set
WideChar Unicode character set

Обобщенный тип данных:

Тип данных Диапазон значений Формат (байт)
Char Same as AnsiChar's range 1*

ПРИМЕЧАНИЕ* - Тип данных Char является обобщенным и соответствует типу AnsiChar. Пример описания переменной символьного типа:

var Symbol: Char; String:  
Тип данных Диапазон значений Maximum length Объем памяти
ShortString backward compatibility 255 characters 2 to 256 bytes
AnsiString Extended ANSI character set ~2^31 characters 4 bytes to 2GB
WideString Unicode character set ~2^30 characters 4 bytes to 2GB

Строки типа AnsiString иногда называют длинными строками, строки типа ShortString – короткими строками.

Строковая переменная может быть объявлена:

· с помощью указания типа данных;

· с помощью зарезервированного слова string;если используется директива {$H+} (по умолчанию), то компилятор интерпретирует это как AnsiString,если используется директива {$H-}, то компилятор интерпретирует это как ShortString.

· с помощьюзарезервированного слова string, за которым следует заключенное в квадратные скобки значение максимально допустимой длины.

Рассмотрим пример:

Var Name: string; Address: ShortString; Person: string[30]; FirstName: AnsiString;…begin FirstName:= 'Natali';End;
  • Concat(S1, S2, ... , Sn): string — возвращает строку, полученную в результате сцепления строк S1, S2, ..., Sn. По своей работе функция Concat аналогична операции сцепления (+).
  • Copy(S: string, Index, Count: Integer): string — выделяет из строки S подстроку длиной Count символов, начиная с позиции Index.
  • Delete(var S: string, Index, Count: Integer) — удаляет Count символов из строки S, начиная с позиции Index.
  • Length(S: string): Integer — возвращает реальную длину строки S в символах.
  • Insert(Source: string; var S: string, Index: Integer) — вставляет строку Source в строку S, начиная с позиции Index.

 

Примеры:

Выражение Значение S
S := Concat('Object ', 'Pascal'); 'Object Pascal'
S:= Copy('Debugger', 3, 3); 'bug'
S := 'Compile'; Delete(S, 1, 3); 'pile'
S := 'Faction'; Insert('r', S, 2) 'Fraction'
  • Pos(Substr, S: string): Byte — обнаруживает первое появление подстроки Substr в строке S. Возвращает номер той позиции, где находится первый символ подстроки Substr. Если в S подстроки Substr не найдено, результат равен 0.
Выражение Результат
Pos('rat', 'grated’)
Pos('sh', 'champagne')
  • IntToStr(Value: Integer): string — преобразует целое число Value в строку.
  • StrToInt(const S: string): Integer— преобразует строку в целое число. Если строка не может быть преобразована в целое число, функция генерирует исключительную ситуацию класса EConvertError (обработка исключительных ситуаций рассматривается в главе 4).
  • Те же возможности нам помогают реализовать функции FloatToStr и StrToFloat, однако они уже позволяют работать с нецелочисленными переменными типа Double, Real и т.п.

 

Локальные объявления

Тело процедуры или функции часто начинают с объявления локальных переменных, которые используются внутри подпрограммы. Эти объявления могут также включать константы, типы, другие подпрограммы. Область видимости локальных идентификаторов ограничена подпрограммой, где они объявлены.

Процедуры и функции иногда содержат в секции локальных объявлений другие функции и процедуры, так называемые вложенные. Например:

procedure DeleteRandomSymbol(var S: string);   function RandomNumber(S: string):integer; var LenString: Integer; Begin LenString:=Length(s); Result:= Random(LenString) + 1; end;   begin Delete(S, RandomNumber(s), 1); end;

Область видимости вложенных подпрограмм ограничена подпрограммой, внутри которой они объявлены. В примере функцию RandomNumber можно вызывать только внутри процедуры DeleteRandomSymbol.

Тип возвращаемого значения

Понятие возвращаемого значения имеет смысл только тогда, когда мы говорим о функции, так как процедура не возвращает значения. Функции возвращают значения любых типов данных кроме Text и file of.

Важные тезисы:

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

function Power(X, Y: Double): Double; // X и Y - формальные параметрыbeginPower := Exp(Y * Ln(X));end; function Power(X, Y: Double): Double; // X и Y - формальные параметрыbeginResult := Exp(Y * Ln(X));end; function Min(const A, B: Integer): Integer;beginif A < B then Result := A else Result := B;end;

Если таких присваиваний несколько, то результатом функции будет значение последнего из этих операторов.

Преимущество от использования переменной Result состоит в том, что она может участвовать в выражениях как операнд внутри тела функции.

Переменная Result и имя функции всегда представляют одно и то же значение.

Пример:

function MyFunction: Integer;beginMyFunction := 5;Result := Result * 2;MyFunction := Result + 1;end;

(Можно задать вопрос, какое значение вернет функция)

Эта функция вернет значение 11.

Использование имени функции в правой части оператора присваивания приведет к рекурсивному вызову этой функции в отличие от переменной Result

Вызов процедур и функций

Параметры, которые передаются в подпрограмму при ее вызове, называются фактическими.

Вызов процедуры для выполнения осуществляется по ее имени, за которым в круглых скобках следует список фактических параметров, т.е. передаваемых в процедуру данных:

<имя процедуры> ( <список фактических параметров> );

Рассмотрим пример.

Var A, G: Double; procedure Average(const X, Y: Double; out M, P: Double);begin M := (X + Y) / 2; P := Sqrt(X * Y);end; procedure TForm1.Button1Click(Sender:Tobject);begin Average(10, 20, A, G); ShowMessage('Среднее арифметическое = ', FloatToStr(A)); ShowMessage('Среднее геометрическое = ', FloatToStr(G));End; end.

При вызове подпрограмм необходимо помнить следующее:

1. Выражения, используемые для передачи в типизированные параметры-константы и в параметры-значения должны быть совместимыми по присваиванию с соответствующими формальными параметрами.

2. Выражения, используемые для передачи в параметры-переменные и в выходные параметры должны быть одинаковых с соответствующими формальными параметрами типов, исключая непизированные параметры.

3. На место параметров, передаваемых по ссылке можно подставлять только переменные, нельзя – числа и константы.

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

5. Если вызывается подпрограмма с параметрами по умолчанию, то все фактические параметры по умолчанию, идущие перед тем параметром, который необходимо передать значение, отличное от умолчания, должны быть заполнены. Например, SomeFunction(,,X) – некорректен

Различные способы передачи параметров в подпрограмму. Передача параметров-массивов в подпрограмму. Передача параметров, значения которых заданы по умолчанию. Примеры.

Одномерные и двумерные статические массивы. Описание и обращение к элементам. Передача массивов как параметров в подпрограммы. Примеры.

Для объявления массива используется конструкция:

array [indexType1, ..., indexTypen] of baseType,

где каждый indexType – это порядковый тип, размерность которого не превосходит 2GB. Для этого можно воспользоваться идентификатором некоторого типа (например, boolean или ansichar), однако на практике обычно явно задается поддиапазон целых чисел. Число элементов массива в каждом измерении задается соотвествующим порядковым типом. Количество элементов массива равно произведению количеств элементов во всех измерениях.

Словосочетание array of является зарезевированным. Квадратные скобки после слова array являются требованием синтаксиса, а после слова of — тип элементов массива.

1. Примеры.

Простейший случай – это одномерный массив:

type TStates = array[1..50] of string; TCoordinates = array[1..3] of Integer;

После описания типа можно переходить к определению переменных и типизированных констант:

var States: TStates; { 50 strings }const Coordinates: TCoordinates = (10, 20, 5); { 3 integers }

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

3. Массив может быть определен и без описания типа:

var Symbols: array[0..80] of Char; { 81 characters }

4. Чтобы получить доступ к отдельному элементу массива, нужно в квадратных скобках указать его индекс, например

Symbols[0]

5. Объявленные выше массивы являются одномерными, так как имеют только один индекс. Одномерные массивы обычно используются для представления линейной последовательности элементов. Если при описании массива задано два индекса, массив называется двумерным, если n индексов — n-мерным. Двумерные массивы используются для представления таблицы, а n-мерные — для представления пространств. Вот пример объявления таблицы, состоящей из 5 колонок и 20 строк:

var Table: array[1..5] of array[1..20] of Double;

То же самое можно записать в более компактном виде:

var Table: array[1..5, 1..20] of Double;

Чтобы получить доступ к отдельному элементу многомерного массива, нужно указать значение каждого индекса, например

Table[2][10]

или в более компактной записи

Table[2, 10]

Эти два способа индексации эквивалентны.

Одномерные и двумерные динамические массивы. Описание и обращение к элементам. Процедура SetLength, функции Length, Low, High. Примеры.

Одним из мощнейших средств языка Delphi являются динамические массивы. Их основное отличие от обычных массивов заключается в том, что они хранятся в динамической памяти. Этим и обусловлено их название. Чтобы понять, зачем они нужны, рассмотрим пример:

Var N: Integer; A: array[1..100] of Integer; // обычный массивbegin Write('Введите количество элементов: '); ReadLn(N); ...end.

Задать размер массива A в зависимости от введенного пользователем значения невозможно, поскольку в качестве границ массива необходимо указать константные значения. А введенное пользователем значение никак не может претендовать на роль константы. Иными словами, следующее объявление будет ошибочным:

Var N: Integer; A: array[1..N] of Integer; // Ошибка!begin Write('Введите количество элементов: '); ReadLn(N); ...end.

На этапе написания программы невозможно предугадать, какие именно объемы данных захочет обрабатывать пользователь. Тем не менее, придется ответить на два важных вопроса:

  • На какое количество элементов объявить массив?
  • Что делать, если пользователю все-таки понадобится большее количество элементов?

Можно поступить следующим образом. В качестве верхней границы массива установить максимально возможное (?) количество элементов, а реально использовать только часть массива. Если пользователю потребуется большее количество элементов, чем зарезервировано, то ему можно попросту вежливо отказать. Например:

Const MaxNumberOfElements = 100;var N: Integer; A: array[1.. MaxNumberOfElements] of Integer;begin Write('Введите количество элементов (не более ', MaxNumberOfElements, '): '); ReadLn(N); if N > MaxNumberOfElements then begin Write('Извините, программа не может работать '); Writeln('с количеством элементов больше , ' MaxNumberOfElements, '.'); end else begin ... // Инициализируем массив необходимыми значениями и обрабатываем его end;end.

Такое решение проблемы является неоптимальным. Если пользователю необходимо всего 10 элементов, программа работает без проблем, но всегда использует объем памяти, необходимый для хранения 100 элементов. Память, отведенная под остальные 90 элементов, не будет использоваться ни Вашей программой, ни другими. А теперь представьте, что все программы поступают таким же образом. Эффективность использования оперативной памяти резко снижается.

Динамические массивы позволяют решить рассмотренную проблему наилучшим образом. Размер динамического массива можно изменять во время работы программы.

Динамический массив объявляется без указания границ:

array of baseType

Например:

var DynArray: array of Integer;

Работа с динамическими массивами:

1. Переменная DynArray представляет собой ссылку на размещаемые в динамической памяти элементы массива.

2. Изначально память под массив не резервируется, количество элементов в массиве равно нулю, а значение переменной DynArray равно nil.

3. Создание динамического массива (выделение памяти для его элементов) осуществляется процедурой SetLength.

SetLength(DynArray, 50); // Выделить память для 50 элементов

4. Изменение размера динамического массива производится этой же процедурой:

SetLength(DynArray, 100); // Теперь размер массива 100 элементов

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

При уменьшении размера динамического массива лишние элементы теряютяся.

При увеличении размера динамического массива добавленные элементы не инициализируются никаким значением и в общем случае их значения случайны. Однако если динамический массив состоит из элементов, тип которых предполагает автоматическую инициализацию пустым значением (string, Variant, динамический массив, др.), то добавленная память инициализируется нулями.

5. Определение количества элементов производится с помощью функции Length:

N := Length(DynArray); // N получит значение 100

6. Элементы динамического массива всегда индексируются от нуля.

7. Доступ к ним ничем не отличается от доступа к элементам обычных статических массивов:

DynArray[0] := 5; // Присвоить начальному элементу значение 5DynArray[High(DynArray)] := 10; // присвоить конечному элементу значение 10

8. К динамическим массивам, как и к обычным массивам, применимы функции Low и High, возвращающие минимальный и максимальный индексы массива соответственно. Для динамических массивов функция Low всегда возвращает 0.

9. Освобождение памяти, выделенной для элементов динамического массива, осуществляется установкой длины в значение 0 или присваиванием переменной-массиву значения nil (оба варианта эквивалентны):

SetLength(DynArray, 0); // Эквивалентно: DynArray := nil;

Однако Вам вовсе необязательно по окончании использования динамического массива освобождать выделенную память, поскольку она освобождается автоматически при выходе из области действия переменной-массива (удобно, не правда ли!). Данная возможность обеспечивается механизмом подсчета количества ссылок.

10. При присваивании одного динамического массива другому, копия уже существующего массива не создается.

Var A, B: array of Integer;begin SetLength(A, 100); // Выделить память для 100 элементов A[0] := 5; B := A; // A и B указывают на одну и ту же область памяти! B[1] := 7; // Теперь A[1] тоже равно 7! B[0] := 3; // Теперь A[0] равно 3, а не 5!End.

В приведенном примере, в переменную B заносится адрес динамической области памяти, в которой хранятся элементы массива A (другими словами, ссылочной переменной B присваивается значение ссылочной переменной A).

Как и в случае со строками, память освобождается, когда количество ссылок становится равным нулю.

var A, B: array of Integer;begin SetLength(A, 100); // Выделить память для 100 элементов A[0] := 10; B := A; // B указывает на те же элементы, что и A A := nil; // Память еще не освобождается, поскольку на нее указывает B B[1] := 5; // Продолжаем работать с B, B[0] = 10, а B[1] = 5 B := nil; // Теперь ссылок на блок памяти нет. Память освобождаетсяEnd;

11. Для работы с динамическими массивами вы можете использовать знакомую по строкам функцию Copy. Она возвращает часть массива в виде нового динамического массива.

12. Для многомерных динамических массивов:

Var A: array of array of Integer; begin SetLength(A, 100); // Выделить память для 100 элементов for I := Low(A) to High(A) do SetLength(A[I], I);End.

То есть память выделяется для каждой размерности.

12. Множества. Описание, задание, операции над множествами. Примеры.

Объявление множества

Множество — это составной тип данных для представления набора некоторых элементов как единого целого. Область значений этого типа — набор всевозможных подмножеств, составленных из его элементов, включая и пустое множество. Все элементы множества принадлежат к некоторому порядковому типу, который называется базовым типом множества. Базовый тип не может иметь больше, чем 256 возможных значений. Поэтому, в качестве базового типа выбирают либо однобайтовые порядковые типы (AnsiChar, Byte, ShortInt, Boolean, WordBool), либо их некоторое подмножество.

Описание

Для описания множественного типа используется словосочетание set of, после которого записывается базовый тип множества.

set of baseType

Пример:

type TLetters = set of 'A'..'Z';

Теперь можно объявить переменную множественного типа:

var Letters: TLetters;

Можно объявить множество и без предварительного описания типа:

var Symbols: set of Char;

Доступ

· В выражениях значения элементов множества указываются в квадратных скобках: [2, 3, 5, 7], [1..9], ['A', 'B', 'C'].

· Если множество не имеет элементов, оно называется пустым и обозначается как [ ].

· Пример инициализации множеств:

const Vowels: TLetters = ['A', 'E', 'I', 'O', 'U'];begin Letters := ['A', 'B', 'C']; Symbols := [ ]; { пустое множество }end;

Операции над множествами

При работе с множествами допускается использование операций отношения (=, <>, >=, <=), объединения, пересечения, разности множеств и операции in.

Операции сравнения (=, <>). Два множества считаются равными, если они состоят из одних и тех же элементов. Порядок следования элементов в сравниваемых множествах значения не имеет. Два множества A и B считаются неравными, если они отличаются по мощности или по значению хотя бы одного элемента.

Выражение Результат
[1, 2] <> [1, 2, 3] True
[1, 2] = [1, 2, 2] True
[1, 2, 3] = [3, 2, 1] True
[1, 2, 3] = [1..3] True

Операции принадлежности (>=, <=). Выражение A >= B равно True, если все элементы множества B содержатся во множестве A. Выражение A <= B равно True, если выполняется обратное условие, т.е. все элементы множества A содержатся во множестве B.

Выражение Результат
[1, 2] <= [1, 2, 3] True
[1, 2, 3] >= [1, 2] True
[1, 2] <= [1, 3] False

Операция in. Используется для проверки принадлежности элемента указанному множеству. Обычно применяется в условных операторах.

Выражение Результат
5 in [1..9] True
5 in [1..4, 6..9] False

Операция in позволяет эффективно и наглядно выполнять сложные проверки условий, заменяя иногда десятки других операций. Например, оператор

if (X = 1) or (X = 2) or (X = 3) or (X = 5) or (X = 7) then

можно заменить более коротким:

if X in [1..3, 5, 7] then

Операцию in иногда пытаются записать с отрицанием: X not in S. Такая запись является ошибочной, так как две операции следуют подряд. Правильная запись имеет вид: not (X in S).

Объединение множеств (+). Объединением двух множеств является третье множество, содержащее элементы обоих множеств.

Выражение Результат
[ ] + [1, 2] [1, 2]
[1, 2] + [2, 3, 4] [1, 2, 3, 4]

Пересечение множеств (*). Пересечение двух множеств — это третье множество, которое содержит элементы, входящие одновременно в оба множества.

Выражение Результат
[ ] * [1, 2] [ ]
[1, 2] * [2, 3, 4] [2]

Разность множеств (–). Разностью двух множеств является третье множество, которое содержит элементы первого множества, не входящие во второе множество.

Выражение Результат
[1, 2, 3] – [2, 3] [1]
[1, 2, 3] – [ ] [1, 2, 3]

Объявление записи

Запись — это составной тип данных, состоящий из фиксированного числа элементов одного или нескольких типов. Описание типа записи начинается словом record и заканчивается словом end. Между ними заключен список элементов, называемых полями, с указанием идентификаторов полей и типа каждого поля:

type <имя записи> = record

<список имен полей1>: тип1;

...

<список имен полей…>: тип…;

end.

 

Пример:

 

type TPerson = record FirstName: string[20]; // имя LastName: string[20]; // фамилия BirthYear: Integer; // год рождения end;

Особенности:

1. Идентификаторы полей должны быть уникальными только в пределах записи.

2. Допускается вложение записей друг в друга, т.е. поле записи может быть в свою очередь тоже записью.

Чтобы получить в программе реальную запись, нужно создать переменную соответствующего типа:

var Friend: TPerson;

Записи можно создавать и без предварительного описания типа, но это делается редко, так как мало отличается от описания полей в виде отдельных переменных.

Доступ

Доступ к содержимому записи осуществляется посредством идентификаторов переменной и поля, разделенных точкой. Такая комбинация называется составным именем. Например, чтобы получить доступ к полям записи Friend, нужно записать:

Friend.FirstName := 'Alexander';Friend.LastName := 'Ivanov';Friend.BirthYear := 1991;

Обращение к полям записи имеет несколько громоздкий вид, что особенно неудобно при использовании мнемонических идентификаторов длиной более 5 символов. Для решения этой проблемы в языке Delphi предназначен оператор with, который имеет формат:

with <запись> do <оператор>;

Однажды указав имя записи в операторе with, можно работать с именами ее полей как с обычными переменными, т.е. без указания идентификатора записи перед идентификатором поля:

with Friend dobegin FirstName := 'Alexander'; LastName := 'Ivanov'; BirthYear := 1991;end;

Операции над записями

Допускается применение оператора присваивания и к записям в целом, если они имеют один и тот же тип. Например,

Friend := BestFriend;

После выполнения этого оператора значения полей записи Friend станут равными значениям соответствующих полей записи BestFriend.

2.11.3. Записи с вариантами

Строго фиксированная структура записи ограничивает возможность ее применения. Поэтому в языке Delphi имеется возможность задать для записи несколько вариантов структуры. Такие записи называются записями с вариантами. Они состоят из необязательной фиксированной и вариантной частей.

Вариантная часть напоминает условный оператор case. Между словами case и of записывается особое поле записи – поле признака. Оно определяет, какой из вариантов в данный момент будет активизирован. Поле признака должно быть равно одному из расположенных следом значений. Каждому значению сопоставляется вариант записи. Он заключается в круглые скобки и отделяется от своего значения двоеточием.

type <имя записи> = record

<список имен полей1>: тип1;

...

<список имен полей…>: тип…;

case <поле признака>: ordinalType of

<список значений1>: (вариант1);

...

<список значений…>: (вариант…);

end,

 

где <поле признака> - корректный идентификатор, который может принимать значения порядкового типа; ordinalType – идентификатор порядкового типа; <список значений…> - список значений поля признака, разделенных ‘,’; (вариант…) – список имен полей с типами, заключенных в круглые скобки.

Пример описания записи с вариантами:

type TFigure = record X, Y: Integer; case Kind: Integer of 0: (Width, Height: Integer); // прямоугольник 1: (Radius: Integer); // окружностьend;

Обратите внимание, что у вариантной части нет отдельного end, как этого можно было бы ожидать по аналогии с оператором case. Одно слово end завершает и вариантную часть, и всю запись.

14. Основные компоненты VCL для работы со строками, массивами строк (Label, Edit, LabeledEdit, Memo, StringGrid), их свойства.

EDIT

Компонент Edit используется для ввода, вывода и редактирования строк. Отображается строка, записанная в свойстве Text. Строки могут быть достаточно длинные. Однако этот компонент не распознаёт символов конца строки и не может быть использован для работы с несколькими строками. С помощью компонента Edit можно отобразить нередактируемый текст, если свойству ReadOnly присвоить значение true.

Для изменения шрифта, используемого при записи текста, необходимо изменить значение свойства Font. Свойство CharCase используется для задания регистра символов, а свойство MaxLength позволяет ограничить длину строки.

Метод Clear применяется для удаления всего текста, а метод ClearSelection – для удаления выделенной части строки. По умолчанию введённый текст выделяется при получении компонентом фокуса ввода – это определяется значением свойства AutoSelect (если true – то выделяется). Компонент Edit можно использовать для ввода пароля. Для этого свойству PassWordChar необходимо присвоить значение символа, который будет отображаться на экране при наборе пароля.

MEMO

Компонент Memo предназначен для ввода, редактирования и отображения текста. В отличие от редактора Edit может содержать несколько строк, которые задаются либо свойством Text, либо свойством Lines. Свойство Text используется для доступа ко всему содержимому компонента, а свойство Lines – для работы с отдельными строками. Редактор Memo может содержать полосы прокрутки ScrollBars.

Многострочный редактор хранит информацию в массиве Lines типа TStrings. Для загрузки текста из файла используется метод LoadFromFile. Для сохранения информации в файле используется метод SaveToFile. При необходимости добавить, удалить, вставить строку используются методы Add, Delete, Insert. Для записи текста в процессе проектирования приложения надо открыть окно редактора String list editor кнопкой, расположенной в Инспекторе объектов у свойства Lines.

В примере редактор Memo1 очищается, и в него с помощью метода Add выводятся значения из массива целых чисел x. Так как компонент Memo работает со строками, то предварительно выполняется перевод целого числа в строку функцией inttostr:

Memo1.Lines.Clear;for i:=0 to n-1 do Memo1.Lines.Add(inttostr(x[i]));

STRINGGRID

Компонент StringGrid имеют форму таблиц, предоставляют программисту мощные возможности создания и обслуживания табличных структур данных, позволяют отображать и редактировать данные в каждой ячейке

таблица StringGrid, предназначеная для работы с текстовыми данными.

Таблица делится на две части – фиксированную и рабочую. Фиксированная часть служит для отображения заголовков столбцов/рядов и для ручного управления их размерами. Обычно фиксированная часть занимает крайний левый столбец и самый верхний ряд таблицы. Остальная часть таблицы – рабочая, она содержит произвольное число столбцов и рядов. Количество рядов и столбцов можно изменять в Инспекторе объектов и программно. По умолчанию свойства ColCount и RowCount, определяющие размеры таблицы, имеют значение 5. С помощью сложного свойства Options определяется внешний вид и функциональные свойства таблицы. Так, параметр goEditing управляет режимом редактирования. Чтобы можно было вводить в таблицу данные и редактировать содержимое ячеек, параметр goEditing надо установить в true. При работе приложения пользователь может вводить данные только в ячейки рабочей области. Однако программно может быть реализован доступ к любым ячейкам таблицы.

Свойство Cells[ACol,ARow:integer]:String обеспечивает доступ к отдельным ячейкам и представляет собой двумерный массив, содержащий строки текста ячеек таблицы. Размеры массива определяются значениями свойств ColCount и RowCount. Параметр ACol указывает колонку ячейки, а параметр ARow – её строку. Доступ к ячейкам таблицы осуществляется во время выполнения приложения. Для примера зададим нужное число строк таблицы и запишем заголовки первого и второго столбца:

StringGrid1.RowCount:=10;StringGrid1.Cells[0,0]:='Аргумент';StringGrid1.Cells[1,0]:='Функция';

Свойство Objects[ACol,ARow:integer]:TObject обеспечивает доступ к объекту, связанному с ячейкой (ACol, Arow). Это свойство применяется, в основном, для связывания изображения со строками и использования их для специфического отображения данных в таблице. Следующая строка помещает объект MyBitmap типа TBitmap в 10-ю колонку, 3-ю строку таблицы StringGrid:

StringGrid1.Objects[10,3]:= MyBitmap;

Если объект был помещен в массив Objects, он продолжит своё существование даже после того, как таблица StringGrid будет удалена. Свойство Cols[index:integer]:TString – представляет собой список строк, содержащий значения всех ячеек колонки с номером index. Это свойство используется для получения доступа к любому столбцу.

Свойство Rows[index:integer]:TString обеспечивает доступ к ряду с номером, заданным параметром index. Для примера выполним копирование первой строки StringGrid2 в четвёртую строку StringGrid1:

StringGrid1.Rows[4].Assign(StringGrid2.Rows[1]);

Аналогично можно выполнять копирование в любые компоненты, имеющие свойства класса TString, например, в ComboBox или ListBox. Компонент StringGrid позволяет выбирать значения, отображённые в ячейках, во время работы приложения. В момент выбора ячейки генерируется событие OnSelectCell, в обработчик которого передаются номера столбца ACol и строки ARow выделенной ячейки. Это событие позволяет использовать в программе значение из выбранной ячейки:

procedure TForm1.StringGrid2SelectCell(Sender: TObject; ACol,ARow: Integer; var CanSelect: Boolean);beginif (ACol in[1..3]) and (ARow in[1..3])then case ARow of1: xn:=strtofloat(StringGrid2.cells[ACol,ARow]);2: xk:=strtofloat(StringGrid2.cells[ACol,ARow]);3: hx:=strtofloat(StringGrid2.cells[ACol,ARow]);end;end; Labelededit Компонент Delphi LabeledEdit во многом похож на окно редактирования Edit с единственным отличием – в нем имеется привязанная к окну метка(Label). Наличие метки – свойства EditLabel имеющего свои подсвойства, методы, события, создает ряд удобств в использование компонента. Во-первых, практически любые окна редактирования в приложении все равно имеют связанную с ним метку, типа Label, поясняющую название окна. Но в данном случае не приходится заботиться о её размещении: с помощью свойства LabalPosition метку можно разместить снизу, сверху, слева или справа окна и она будет привязана к нему при любых перемещениях. Во-вторых, выделение символом амперсанда «&» какого-то символа надписи в свойстве EditLabel1.Caption позволяет задать для окна клавиши быстрого доступа – при нажатии пользователем клавиши Alt и клавиши выделенного символа, при этом фокус будет автоматически передаваться данному окну. В-третьих, облегчает управление доступностью окна. Например LabeledEdit1.Enabled:=not LabeledEdit1.Enabled;Изменяет доступность окна. Если окно сделано недоступным, то недоступной выглядит и связанная с ним метка, извещая пользователя, что данным окном нельзя пользоваться.Большинство свойств, методов и событий идентичны компоненту Edit.Рассмотрим основные свойства LabeledEdit EditLabel.Captoin строка текста, отображаемая меткой EditLabel.Color определяет цвет фона метки EditLabel.Font определяет атрибуты шрифта EditLabel.Layout позволяет выравнивать текст в метки по вертикалиEditLabel.ShowAccelChar определяет, как символ амперсанд «&» отображается в тексте метки EditLabel.WordWrap если True то текст переносится на новую строку, если он больше ширины метки, и высота метки позволяет разместить несколько строк LabelPosition Определяет положение метки относительно окнаLabelSpacing Расстояние в пикселях между меткой и окном edit Компонент Delphi Edit предназначен для ввода пользовательских данных и представляет собой однострочное поле.Основным свойством edit’a является text типа данных string т.е. для ввода чисел нужно использовать функции FloatToStr(дробные числа) и IntToStr(целые числа). Перенос строк в этом компоненте по сравнению с label невозможен. Текст, не поместившийся по длине в компонент, просто сдвигается влево и пользователь может курсором перемещаться по этому тексту. свойства Edit Text Содержит отображаемую компонентом строкуMaxLegth максимальная длина текста, если значение равно 0, то можно вводить неограниченное количество символовFont Свойство позволяющее устанавливать шрифт текста, размер и его цветReadOnly Если значение этого свойство равно True, то текст в поле ввода пользователь изменить не сможет AutoSize автоматически подстраивает под размер текста высоту поля, а ширина окна не меняется ни при каких условияхBevelEdgesBevelInnerBevelKindBevelOuter Эти свойства определяют эффекты объемности поля вводаBorderStyle вид рамки, поля вводаPasswordChar свойство позволяющее сделать поле для ввода пароля, по умолчанию стоит значение равное #0(нулевой символ), для отображения звездочек необходимо в это поле поставить соответствующий символ AutoSelect Если значение равно True то при получении фокуса компонентом весь текст будет выделен CharCase позволяет вводить текст определенного регистра. это свойство может принимать следуюие значения:ecUpperCase — текст преобразуется в верхний регистр;ecLowerCase — текст пишется в нижнем регистре;ecNormal(по умолчанию)- размер символом не меняется. HideSelection Если False, то выделенный текст сохраняется выделенным при потере компонента фокуса вводаРассмотрим основные события(Events) для Edit’а:OnChange – наступает при изменении текста, OnKeyDown – наступает при нажатии любой клавиши пользователем. OnKeyPress – наступает при нажатии клавиши символа. OnKeyUp – наступает при отпускании какой-либо клавиши пользователем. Методы TEdit Clear Очищает поле вводаClearSelection Удаляет выделенный текст ClearUndo Очищает буфер метода Undo CopyToClipboard Копирует выделенный текст в буфер обмена CutToClipboard Вырезает выделенный текст в буфер обмена, послеPasteFromClipboard Вставляет текст содержащийся в буфера обмена в позицию курсора SelectAll Выделяет весь текстUndo Восстанавливает текст в той форме, в которой он был перед последним получением компонента фокуса

Символы (char) и строки (string), работа с ними. Функции и процедуры для работы со строками (Length, Copy, Pos, Concat, Insert, Delete, IntToStr, StrToInt, FloatToStr, StrToFloat).

Char:Существуют два фундаментальных символьных типа данных: AnsiChar и WideChar .Они соответствуют двум различным системам кодировки символов. Данные типа AnsiChar занимают один байт памяти и кодируют один из 256 возможных символов расширенной кодовой таблицы ANSI, в то время как данные типа WideChar занимают два байта памяти и кодируют один из 65536 символов кодовой таблицы Unicode. Кодовая таблица Unicode — это стандарт двухбайтовой кодировки символов. Первые 256 символов таблицы Unicode соответствуют таблице ANSI, поэтому тип данных AnsiChar можно рассматривать как подмножество WideChar

Фундаментальные типы данных:

Тип данных Диапазон значений Объем памяти (байт)
AnsiChar Extended ANSI character set
WideChar Unicode character set

Обобщенный тип данных:

Тип данных Диапазон значений Формат (байт)
Char Same as AnsiChar's range 1*

ПРИМЕЧАНИЕ* - Тип данных Char является обобщенным и соо







Последнее изменение этой страницы: 2017-02-08; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.204.169.76 (0.044 с.)