§ 18. Кампаненты для работы з табліцамі

18.1. Кампанент StringGrid

Кампанент табліца радкоў — StringGrid прызначаны для апрацоўкі даных, прадстаўленых у таблічнай форме. На панэлі кампанентаў Additional кампанент StringGrid намаляваны ў выглядзе , імя аб'екта — StringGrid. Кампанент StringGrid, змешчаны на форму, атрымлівае імя StringGridN, дзе N — нумар 1, 2, 3... (прыклад 18.1)

Кампанент StringGrid прызначаны ў першую чаргу для адлюстравання ў табліцы тэкставай інфармацыі. Аднак яго можна выкарыстоўваць і для адлюстравання графічнай інфармацыі. Уласцівасці кампанента прыведзены ў прыкладзе 18.2. За многія ўласцівасці кампанента StringGrid адказвае ўласцівасць Options (гл. Дадатак).

Даныя табліцы могуць быць даступныя, як толькі для чытання, так і для рэдагавання. Пры ўстаноўцы кампанента на форму, ячэйкі табліцы ў першым слупку і першым радку фіксаваныя і недаступныя для рэдагавання, астатнія ячэйкі можна рэдагаваць. Фіксаваныя ячэйкі выкарыстоўваюцца ў асноўным для подпісаў загалоўкаў слупкоў і радкоў. Пры з'яўленні палос пракруткі фіксаваныя ячэйкі застаюцца на месцы.

У кампаненце StringGrid рэалізавана адрасаванне кожнай асобнай ячэйкі па яе нумары слупка і радка[1]. Змесціва ячэйкі (i, j), дзе i — нумар слупка, j — нумар радка, мае выгляд:

StringGrid1 -> Cells[i][j] 

Нумары слупкоў і радкоў пачынаюцца з 0. Слупок і радок з нумарам нуль па змоўчанні належаць фіксаванай зоне.

У момант выбару карыстальнікам ячэйкі надыходзіць падзея OnSelectCell. У апрацоўшчык гэтай падзеі перадаюцца нумары слупка (ACol) і радка (ARow) выдзеленай ячэйкі, а таксама лагічны параметр CanSelect — дапушчальнасць выбару. Параметр CanSelect можна выкарыстоўваць для забароны вылучэння ячэйкі, задаўшы яго значэнне false. А параметры ACol і ARow могуць выкарыстоўвацца для нейкай рэакцыі праграмы на вылучэнне карыстальніка.

Прыклад 18.3. Стварыць праект, у якім пры выбары ячэйкі табліцы, у ёй будзе прапісвацца адрас.

Этапы выканання задання

  1. Размясціць на форме кампанент StringGrid.
  2. Устанавіць ва ўласцівасці DrawingStyle значэнне gdsClassic.
  3. Задаць колер для фіксаваных і рэдагуемых ячэек.
  4. У падзеі OnCreate для формы падпісаць радкі і слупкі.
  5. Напісаць апрацоўшчык падзеі OnSelectCell, у якім неабходна прапісваць яе адрас.

Кампанент StringGrid можна ўжываць для вырашэння задач, якія выкарыстоўваюць двухмерныя масівы.

Прыклад 18.4. Стварыць праект, у якім будзе вылічвацца сума элементаў двухмернага масіва. Элементы масіва задаюцца выпадковым чынам.

Этапы выканання задання

  1. Размясціць на форме кампанент StringGrid, а таксама кампаненты: LabeledEdit (2), Label, BitBtn (2), Memo.
  2. Прыбраць фіксаваныя радкі і слупкі (значэнні ўласцівасцей FixedCols і FixedRows роўныя 0).
  3. Для кнопкі BitBtn 2 устанавіць значэнне Enabled — false.
  4. У падзеі OnClick для кампанента BitBtn1 (Random) змяніць памеры табліцы ў адпаведнасці з уведзенымі значэннямі і запоўніць ячэйкі табліцы выпадковымі лікамі. Пасля запаўнення табліцы зрабіць даступнай кнопку "Сумма".
  5. У падзеі OnClick для кампанента BitBtn2 (Сумма) палічыць суму элементаў табліцы і вывесці яе значэнне ў кампанент Label1.

Часам пры працы патрабуецца ачысціць усе ячэйкі табліцы ад тэксту. Метаду, які гэта робіць для табліцы, няма. Можна ў цыкле звярнуцца да кожнай ячэйцы і прысвоіць ёй значэнне пустога радка або выкарыстоўваць метад, які ачышчае значэнне слупка:

for (int i = StringGrid1 -> FixedCols; 
    i < StringGrid1 -> ColCount; i++)
    StringGrid1 -> Cols[i] -> Clear();



[1] Звярніце ўвагу на тое, што першым паказваецца нумар слупка, а другім  нумар радка (па аналогіі з адрасаваннем ячэек у Excel)

Прыклад 18.1. Кампанент StringGrid на форме:

Прыклад 18.2. Уласцівасці кампанента StringGrid.

Уласцівасць

Апісанне

ColCount

Колькасць слупкоў

RowCount

Колькасць радкоў

DefaultColWidth

Шырыня слупкоў

DefaultRowHeight

Вышыня радкоў

FixedCols

Колькасць зафіксаваных слупкоў злева

FixedRows

Колькасць зафіксаваных радкоў зверху

GridLineWidth

Таўшчыня лініі, якая абмяжоўвае ячэйкі

Options

Вызначаюць групу параметраў кампанентаў

Font

Шрыфт адлюстравання змесціва ячэек

Color

Колер табліцы

FixedColor

Колер фіксаваных ячэек

DrawingStyle

Стыль адлюстравання табліцы

Уласцівасці Color і FixedColor працуюць, калі ва уласцівасці DrawingStyle абрана значэнне gdsClassic.

Пры неабходнасці ўстаноўкі шырыні і вышыні асобных слупкоў і (або) радкоў выкарыстоўваюць уласцівасці:

  • RowHeights — масіў, які змяшчае вышыні радкоў. Гэта значыць, напрыклад, RowHeights[5]  вышыня радка з індэксам 5.
  • ColWidths  масіў, які змяшчае шырыні слупкоў. Гэта значыць, напрыклад, ColWidths[5]  шырыня радка з нумарам 5.

Значэнні для гэтых уласцівасцей наладжваюцца ў апрацоўшчыку падзеі OnCreate для формы, гэтак жа, як і надпісы загалоўкаў, якія размяшчаюцца ў радках і слупках фіксаванай зоны табліцы.

Прыклад 18.3. Форма на этапе праектавання:

Апрацоўшчык падзеі OnCreate для формы.

void __fastcall TForm1::
FormCreate(TObject *Sender)

{

  for(int i = 1;

  i < StringGrid1 -> ColCount; i++)

    StringGrid1 -> Cells[i][0] =

    "столбец " + IntToStr(i);

  for(int i = 1;

  i < StringGrid1 -> RowCount; i++)

    StringGrid1 -> Cells[0][i] =

    "строка " + IntToStr(i);

}

Апрацоўшчык падзеі OnSelectCell для табліцы.

void __fastcall TForm1::

StringGrid1SelectCell(TObject *Sender,

int ACol, int ARow, bool &CanSelect)

{

  StringGrid1 -> Cells[ACol][ARow] =

  IntToStr(ACol) + ";" + IntToStr(ARow);

}

Дадатак у час працы:

Прыклад 18.4. Форма на этапе праектавання:

Апрацоўшчык падзеі OnClick для кнопкі BitBtn1.

void __fastcall TForm1::BitBtn1Click
               (TObject *Sender)

{

  n = StrToInt(LabeledEdit1 -> Text);

  m = StrToInt(LabeledEdit2 -> Text);

  StringGrid1 -> RowCount = n;

  StringGrid1 -> ColCount = m;

  for (int i = 0; i < m; i++)

  for (int j = 0; j < n; j++)

    StringGrid1 -> Cells[i][j] =

      rand() % 20;

  BitBtn2 -> Enabled = true;

}

Апрацоўшчык падзеі OnClick для кнопкі BitBtn2.

void __fastcall TForm1::

BitBtn2Click(TObject *Sender)

{

  int s = 0;

  for (int i = 0; i < m; i++)

    for (int j = 0; j < n; j++)

      s += StrToInt(StringGrid1 

          -> Cells[i][j]);

  Label1 -> Caption = "Sum = " + IntToStr(s);

}

Дадатак у час працы: