- •5.2.5. Линейка Dialogs
- •5.4. Пример «Перевод в двоичную систему счисления»
- •Глава 6. Структурные типы данных
- •6.1. Совместимость типов
- •6.2. Массивы
- •6.2.1. Статические массивы
- •6.2.2. Физическая структура
- •6.2.3. Операции
- •6.2.4. Компоненты grid
- •6.2.5. Пример 1: умножение матрицы на строку
- •6.2.6. Динамические массивы
- •6.2.7. Пример 2. Неповторяющиеся элементы массива
6.2.2. Физическая структура
Физическая структура - это размещение элементов массива в памяти ЭВМ. Для случая двумерного массива, состоящего из (k1-n1+1) строк и (k2-n2+1) столбцов физическая структура представлена на рис. 6.3.
Рис. 6.3. Физическая структура двумерного массива из (k1-n1+1) строк и (k2-n2+1) столбцов
Многомерные массивы хранятся в непрерывной области памяти. Размер слота определяется базовым типом элемента массива. Количество элементов массива и размер слота определяют размер памяти для хранения массива. Принцип распределения элементов массива в памяти определен языком программирования. Так в FORTRAN элементы распределяются по столбцам - так, что быстрее меняется левые индексы, в PASCAL - по строкам - изменение индексов выполняется в направлении справа налево.
Количество байтов памяти, занятых двумерным массивом, определяется по формуле :
ByteSize = (k1-n1+1)*(k2-n2+1)*SizeOf(Тип)
Адресом массива является адрес первого байта начального компонента массива. Смещение к элементу массива Mas[i1,i2] определяется по формуле:
ByteNumber = [(i1-n1)*(k2-n2+1)+(i2-n2)]*SizeOf(Тип)
его адрес: @ByteNumber = @mas + ByteNumber.
Например:
var Mas : Array [3..5] [7..8] of Word;
Базовый тип элемента Word требует два байта памяти, тогда таблица 6.2 смещений элементов массива относительно @Mas будет следующей:
Таблица 6.2
Смещение (байт) |
Идентификатор поля |
Смещение (байт) |
Идентификатор поля |
+ 0 |
Mas[3,7] |
+ 2 |
Mas[3,8] |
+ 4 |
Mas[4,7] |
+6 |
Mas[4,8] |
+ 8 |
Mas[5,7] |
+ 10 |
Mas[5,8] |
Этот массив будет занимать в памяти: (5-3+1)*(8-7+1)*2=12 байт; а адрес элемента Mas[4,8]:
@Mas+((4-3)*(8-7+1)+(8-7)*2 = @Mas+6
6.2.3. Операции
Важнейшая операция физического уровня над массивом - доступ к заданному элементу. Как только реализован доступ к элементу, над ним может быть выполнена любая операция, имеющая смысл для того типа данных, которому соответствует элемент.
К операциям логического уровня над массивами необходимо отнести такие как сортировка массива, поиск элемента по ключу. Наиболее распространенные алгоритмы поиска и сортировок будут рассмотрены ниже.
6.2.4. Компоненты grid
Delphi предоставляет два табличных компонента TDrawGrid и TStringGrid, у которых есть общий предок - класс TCustomGrid. Многие свойства и методы эти компоненты наследуют у своего предка. Этот класс обладает методом TDrawCell, позволяющим отображать содержимое ячейки. Базовый класс оперирует прокруткой, выбором и линейками скроллинга.
property Col: longint; Номер сфокусированного столбца.
property ColCount: longint; Число столбцов в таблице.
property ColWidths[Index: Longint]: integer; - Ширина для каждого столбца (максимальное значение MaxCustomExtents, доступно только во время выполнения).
property DefaultColWidth: Longint - Ширина столбцов по умолчанию. Применяется при инициализации таблицы и при добавлении ячеек.
property DefaultRowHeight - Высота строки по умолчанию. Применяется при инициализации таблицы и при добавлении ячеек.
property FixedCols: Integer - Число столбцов в фиксированной области.
property FixedRows: Integer - Число строк в фиксированной области.
property Row - Номер сфокусированной строки (доступно только во время выполнения).
property RowCount - Число строк в таблице.
property RowHeights - массив высот строк (максимальное значение MaxCustomExtents, доступно только во время выполнения).
property Options;
Доступны следующие значения Options:
GoFixedHorzLine |
ячейки в фиксированной области разделяются горизонтальными линиями |
GoFixedVertLine |
ячейки в фиксированной области разделяются вертикальными линиями |
GoHorzLine |
ячейки разделяются горизонтальными линиями |
GoVertLine |
ячейки разделяются вертикальными линиями. |
GoRangeSelect |
может быть выделено множество ячеек. |
GoDrawFocusSelected |
ячейка, имеющая фокус, рисуется тем же цветом, что и выделенная, иначе выделяется рамкой из точек. |
GoRowSizing |
высота строк может изменять индивидуально. |
GoColSizing |
ширина строк может изменять индивидуально. |
GoRowMoving |
строки могут перемещать мышью |
GoColMoving |
столбцы могут перемещаться мышью. |
GoEditing |
ячейки могут редактироваться. |
GoAlwaysShowEditor |
содержимое сфокусированной ячейки сразу загружается в редактор, иначе необходимо нажать F2. |
GoTabs |
Разрешен переход между ячейками при нажатии Tab. |
GoRowSelect |
Выделение всей текущей строки. |
Компонент сетки TStringGrid разработан для того, чтобы упростить обработку строк и связанных с ними объектов.
TStringGrid предоставляет несколько дополнительных свойств, управляющих появлением сетки, а также события и методы, которые дают преимущество над табличной организацией сетки.
Компонент TStringGrid вводит возможность соединять объект с каждой ячейкой в сетке. Эти объекты могут содержать любую информацию.
property Cells[ACol, ARow: Integer]: string;
Массив строк ColCount*RowCount, которые связываются с каждой ячейкой.