Практическая работа №23

Тема: Сетка строк StringGrid

Цели:

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

Теоретический материал

Теперь на практике познакомимся с сеткой строк, похожей на ту, что используется в файлах MS Excel. Создайте новое приложение, установите на форму сетку StringGrid с вкладки компонентов Additional. Рядом находится еще сеточка DrawGrid. Разница между ними небольшая, но первую используют чаще. Сетка StringGrid самостоятельно прорисовывает данные в ячейках, при использовании сетки DrawGrid эти данные придется прорисовывать самостоятельно. Сетку DrawGrid обычно используют для прорисовки графики, и нужда в ней возникает намного реже, чем в StringGrid.

Как видите, сетка StringGrid очень похожа на ту, что вы видели в MS Excel. Пока еще она пуста. Выделите ее и посмотрите на свойства.

BorderStyle отвечает за стиль обрамления. Может иметь только два значения – с обрамлением и без него.

ColCount – количество колонок в сетке. По умолчанию их 5.

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

DefaultDrawing – прорисовка данных по умолчанию. Если стоит True, то компонент сам будет отображать введенные данные, иначе это придется делать программисту.

НЕ нашли? Не то? Что вы ищете?

DefaultRowHeight – высота строк по умолчанию. Установлено 24 пикселя, но этот размер великоват, поэтому строки получаются такими высокими.

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

FixedRows – количество фиксированных строк. По умолчанию тоже одна, и работает также, как и FixedCols. Как правило, эта строка служит заголовком колонок.

GridLineWidth – толщина разделительных линий. Попробуйте поставить ноль – линии исчезнут. Верните единицу.

Options – самое главное свойство компонента. Оно содержит много настроек, которые раскроются, если щелкнуть по плюсу слева от названия свойства. Эти дополнительные свойства имеют следующие назначения:

    goFixedVertLine – рисовать ли вертикальные линии у фиксированных ячеек? По умолчанию True. goFixedHorzLine – прорисовка горизонтальных линий у фиксированных ячеек. goVertLine – прорисовка вертикальных линий у всех остальных (нефиксированных) ячеек. goHorzLine – прорисовка горизонтальных линий у нефиксированных ячеек. goRangeSelect – разрешение выделять несколько ячеек. Не работает, если включен элемент goEdit. goDrawFocusSelect – разрешено выделять ячейку, которая находится в фокусе ввода. goRowSizing – разрешено изменять высоту строки перетаскиванием мышью. goColSizing – разрешено изменять ширину колонки перетаскиванием мышью. goRowMoving – можно ли мышью перемещать строки на другое место. goColMoving – можно ли мышью перемещать колонки на другое место. goEditing – можно ли редактировать сетку? То есть, вводить данные с клавиатуры. Игнорируется, если включен элементgoRowSelect. goTabs – можно ли переключаться на другие ячейки с помощью клавиши <Tab>. goRowSelect – выделяется вся строка. Если равно False, то только одна ячейка. goAlwaysShowEditor – если True, то редактировать ячейку можно сразу при выделении. Если False, то для редактирования нужно нажать <Enter> или <F2>. goThumbTracking – разрешена ли прорисовка данных в ячейках при прокрутке. Если нет, то данные будут обновлены после прокрутки.

RowCount – количество строк в сетке.

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

Практическое задание

Итак, приступим к примеру. Мы уже говорили, что по умолчанию дается слишком большая высота строк, уменьшите ее до 16 (свойство DefaultRowHeight). У нас должно быть 5 строк и 5 колонок, причем фиксированными будут по одной колонке и одной строке. Далее, пользователь должен иметь возможность вводить данные в ячейки, поэтому в разделе Options в свойстве goEditing установим True.

Теперь создаем для формы событие onShow, и вписываем следующий код:

begin

  //заполняем значениями первую строку:

  StringGrid1.Cells[0,1]:= 'Иванов';

  StringGrid1.Cells[0,2]:= 'Петров';

  StringGrid1.Cells[0,3]:= 'Николаев';

  StringGrid1.Cells[0,4]:= 'Бонд';

  //заполняем значениями первую колонку:

  StringGrid1.Cells[1,0]:= 'Год рожд.';

  StringGrid1.Cells[2,0]:= 'Место рожд.';

  StringGrid1.Cells[3,0]:= 'Прописка';

  StringGrid1.Cells[4,0]:= 'Семейное положение';

  //меняем ширину колонок

  StringGrid1.ColWidths[4]:= 120;

  StringGrid1.ColWidths[3]:= 90;

  StringGrid1.ColWidths[2]:= 90;

end;

Как видите, обращение к отдельным ячейкам здесь точно такое, как к двухмерному массиву. Первым индексом служит строка, вторым – колонка. Нумерация индексов начинается с нуля, поэтому верхняя левая ячейка будет иметь индекс [0, 0].

Свойство ColWidths[i] устанавливает ширину колонки с индексом i.

Сохраните проект, скомпилируйте его и посмотрите результат. Если ваша сетка слишком маленькая или наоборот, слишком большая, то измените ее размер, чтобы все колонки умещались в сетке.

Улучшим наш пример, добавив маску для ввода даты к столбцу "Год рождения". Делается это совсем просто – выделяете сетку, переходите на вкладку Events и генерируете событие onGetEditMask. Это событие происходит, когда пользователь редактирует сетку. Там вписываете только одну строку:

if ACol=1 then value := '99.99.9999 г.'

Если вы посмотрите на параметры этого события, то увидите, что в него передаются такие параметры, как ACol и ARow. Это – индекс текущей колонки и текущей строки. Параметр Value содержит текст маски. То есть, если пользователь редактирует колонку с индексом 1 – это вторая колонка, где указывается год рождения, мы устанавливаем маску ввода даты.

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

Задания для самостоятельной работы

Создайте программу «Сводная ведомость успеваемости студентов».

Условия:

    Шапка таблицы и фамилии студентов должны быть изначально представлены в таблице Оценки по предметам должен вводить пользователь с клавиатуры Вычисляемые столбцы: Средний балл, Количество пропусков ВСЕГО Также на форму должна выводиться информация по общей успеваемости группы и общему количеству пропусков по неуважительной причине

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, Grids, StdCtrls, Mask;

type

  TForm1 = class(TForm)

  StringGrid1: TStringGrid;

  MaskEdit1: TMaskEdit;

  Button1: TButton;

  Label1: TLabel;

  procedure FormShow(Sender: TObject);

  procedure Button1Click(Sender: TObject);

  private

  { Private declarations }

  public

  { Public declarations }

  end;

var

  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);

begin

  //заполняем значениями первую строку:

  StringGrid1.Cells[0,1]:= 'Бессуднова';

  StringGrid1.Cells[0,2]:= 'Богданов';

  StringGrid1.Cells[0,3]:= 'Болгов';

  StringGrid1.Cells[0,4]:= 'Букша';

  StringGrid1.Cells[0,5]:= 'Вербицкий';

  StringGrid1.Cells[0,6]:= 'Гарманов';

  StringGrid1.Cells[0,7]:= 'Даврушев';

  StringGrid1.Cells[0,8]:= 'Дорожкин';

  StringGrid1.Cells[0,9]:= 'Желтяков';

  StringGrid1.Cells[0,10]:= 'Карсканов';

  StringGrid1.Cells[0,11]:= 'Коньков';

  StringGrid1.Cells[0,12]:= 'Корсаков';

  StringGrid1.Cells[0,13]:= 'Лезин';

  StringGrid1.Cells[0,14]:= 'Лысенко';

  //заполняем значениями первую колонку:

  StringGrid1.Cells[1,0]:= 'ОАиП';

  StringGrid1.Cells[2,0]:= 'ООП';

  StringGrid1.Cells[3,0]:= 'Математика';

  StringGrid1.Cells[4,0]:= 'Этика и эстетика';

  StringGrid1.Cells[5,0]:= 'Физ-ра';

  StringGrid1.Cells[6,0]:= 'Радиомонтаж';

  StringGrid1.Cells[7,0]:= 'Электротехника';

  StringGrid1.Cells[8,0]:= 'Средний балл';

  StringGrid1.Cells[9,0]:= 'Пропуски по у/п';

  StringGrid1.Cells[10,0]:= 'Пропуски по н/у';

  StringGrid1.Cells[11,0]:= 'Пропуски всего';

end;

procedure TForm1.Button1Click(Sender: TObject);

var a:integer;

b:real;

begin

  a:= StrToInt(StringGrid1.Cells[1,1])

  + StrToInt(StringGrid1.Cells[2,1])

  +StrToInt(StringGrid1.Cells[3,1])

  +StrToInt(StringGrid1.Cells[4,1])

  +StrToInt(StringGrid1.Cells[5,1])

  +StrToInt(StringGrid1.Cells[6,1])

  +StrToInt(StringGrid1.Cells[7,1]);

  b:=a/7;

  StringGrid1.Cells[8,1]:=FloatToStr(b);

  a:= StrToInt(StringGrid1.Cells[1,2])

  + StrToInt(StringGrid1.Cells[2,2])

  +StrToInt(StringGrid1.Cells[3,2])

  +StrToInt(StringGrid1.Cells[4,2])

  +StrToInt(StringGrid1.Cells[5,2])

  +StrToInt(StringGrid1.Cells[6,2])

  +StrToInt(StringGrid1.Cells[7,2]);

  b:=a/7;

  StringGrid1.Cells[8,2]:=FloatToStr(b);

  a:= StrToInt(StringGrid1.Cells[1,3])

  + StrToInt(StringGrid1.Cells[2,3])

  +StrToInt(StringGrid1.Cells[3,3])

  +StrToInt(StringGrid1.Cells[4,3])

  +StrToInt(StringGrid1.Cells[5,3])

  +StrToInt(StringGrid1.Cells[6,3])

  +StrToInt(StringGrid1.Cells[7,3]);

  b:=a/7;

  StringGrid1.Cells[8,3]:=FloatToStr(b);

  a:= StrToInt(StringGrid1.Cells[1,4])

  + StrToInt(StringGrid1.Cells[2,4])

  +StrToInt(StringGrid1.Cells[3,4])

  +StrToInt(StringGrid1.Cells[4,4])

  +StrToInt(StringGrid1.Cells[5,4])

  +StrToInt(StringGrid1.Cells[6,4])

  +StrToInt(StringGrid1.Cells[7,4]);

  b:=a/7;

  StringGrid1.Cells[8,4]:=FloatToStr(b);

Label1.Caption:=FloatToStr((StrToFloat(StringGrid1.Cells[8,1])+

StrToFloat(StringGrid1.Cells[8,2])+

StrToFloat(StringGrid1.Cells[8,3])+

StrToFloat(StringGrid1.Cells[8,4]))/4);

end;

end.