Печатать книгуПечатать книгу

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

Сайт: Профильное обучение
Курс: Інфарматыка. 11 клас (Павышаны ўзровень)
Книга: § 18. Кампаненты для работы з табліцамі
Напечатано:: Гость
Дата: Суббота, 19 Апрель 2025, 12:39

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);

}

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

18.2. Кампанент DrawGrid

Кампанент DrawGrid выкарыстоўваецца для стварэння табліцы, якая можа ўтрымліваць графічныя малюнкі. На панэлі кампанентаў Additional кампанент DrawGrid намаляваны ў выглядзе , імя аб'екта — DrawGrid. Кампанент DrawGrid, змешчаны на форму, атрымлівае імя DrawGridN, дзе N — нумар 1, 2, 3… (прыклад 18.5).

Гэты кампанент падобны кампаненту StringGrid, які з'яўляецца наследнікам ад DrawGrid. У DrawGrid прысутнічаюць усе ўласцівасці, метады, падзеі кампанента StringGrid, акрамя тых, што адносяцца да тэксту, г. зн. акрамя уласцівасцей Cells, Cols, Rows.

Кампанент DrawGrid (таксама StringGrid) мае канву, на якой можна размяшчаць малюнкі. Для занясення малюнкаў у ячэйкі DrawGrid выкарыстоўваюць апрацоўшчык падзей OnDrawCell. Гэта падзея надыходзіць для кожнай ячэйкі табліцы ў момант яе перамалёўкі. Размяшчаючы ў апрацоўшчыку падзеі OnDrawCell праграмны код, можна размалёўваць ячэйкі, выводзіць малюнкі і рабіць тэкставыя надпісы. Табліца сама пастаянна выклікае гэтую падзею для таго, каб адмаляваць свае ячэйкі. Прамаляваць малюнак можна, выкарыстоўваючы метады канвы StratchDraw або CopyRect.

Апрацоўшчык OnDrawCell мае параметры (прыклад 18.6).

Прыклад 18.7. Стварыць праект, у якім пры выбары ячэйкі табліцы, будзе альбо зафарбоўвацца ячэйка, альбо прамалёўвацца малюнак. Калі сума нумара радка і нумар слупка няцотныя, то адбываецца закраска ячэйкі, інакш прамалёўваецца малюнак.

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

  1. Размясціць на форме кампанент DrawGrid.
  2. Выдаліць фіксаваныя радкі і слупкі.
  3. Устанавіць для табліцы 5 радкоў і 5 слупкоў.
  4. Устанавіць шырыню і вышыню слупка роўнай 60.
  5. У падзеі OnCreate для формы загрузіць малюнак у бітавы вобраз.
  6. Напісаць апрацоўшчык падзеі OnDrawCell, у якім замалёўваць ячэйкі.

Калі ўласцівасць DefaultDrawing кампанента DrawGrid мае значэнне true (устаноўлена па змоўчанні), то замалёўвацца будуць толькі выдзеленыя ячэйкі табліцы. Як толькі вылучэнне зменіцца, ячэйка становіцца зафарбаванай тым колерам, які ўстаноўлены па змоўчанні. Калі для ўласцівасці DefaultDrawing устанавіць значэнне false, то пасля змены выдзеленай ячэйкі размалёўка папярэдніх ячэек не мяняецца.

Кампанент DrawGrid зручна выкарыстоўваць для стварэння гульняў на клеткавым полі. Для праграміравання гульні спатрэбіцца матрыца стану гульні. У такой матрыцы будзе захоўвацца абстаноўка гульні на бягучым хаду. Пасля выканання ходу абстаноўка мяняецца, адпаведныя змены запісваюцца ў матрыцу стану і адбываецца абнаўленне кампанента DrawGrid. Матрыца стану гульні можа выкарыстоўвацца для захавання гульні і наступнай яе загрузкі.

Прыклад 18.8. Падрыхтаваць поле гульні ў крыжыкі-нулікі для двух гульцоў.

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

  1. Размясціць на форме кампанент DrawGrid і кнопку.
  2. Выдаліць фіксаваныя радкі і слупкі.
  3. Колькасць радкоў і слупкоў роўна 3.
  4. Для захоўвання матрыцы стану гульні апісаць двухмерны масіў pole з 3 радкоў і 3 слупкоў. Стан клеткі будзем апісваць адным з трох значэнняў: 0 — клетка пустая, 1 — у клетцы крыжык, 2 — у клетцы нулік.
  5. Напісаць апрацоўшчык падзеі OnCreat для формы, у якім варта загрузіць два бітавых вобраза — малюнкі для крыжыка і нуліка.
  6. Напісаць апрацоўшчык падзеі OnSelectCell, у якім неабходна змяніць значэнне элемента масіва pole для абранай клеткі. Для вызначэння таго, што маляваць у клетцы на бягучым кроку будзем выкарыстоўваць знакавую пераменную znak, якая будзе мяняць сваё значэнне пасля кожнага ходу. Спачатку znak = 'X';
  7. Напісаць апрацоўшчык падзеі OnDrawCell, у якім трэба маляваць у ячэйцы малюначак, які адпавядае матрыцы стану.
  8. Напісаць апрацоўшчык падзеі OnClick для кнопкі, у якім неабходна абнуліць масіў. Пасля абнулення масіва перамаляваць табліцу на форме. Каманда DrawGrid1 -> Refresh(); выклікае апрацоўшчык падзеі OnDrawCell.

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

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

Прыклад 18.6. Параметры апрацоўшчыка OnDrawCell:

  • ACol, ARow — індэксы слупка і радка;
  • Rect — прамавугольнік у рамках ячэйкі, зададзенай індэксамі ACol і ARow;
  • State — стан ячэйкі:

-  gdSelected — ячэйка вылучаная;
- gdFocused — ячэйка мае фокус уводу;
- gdFixed — ячэйка ставіцца да фіксаванага радка ці слупка.

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

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

void __fastcall TForm1::

FormCreate(TObject *Sender)

{

  ris -> LoadFromFile("fly.bmp");

}

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

void __fastcall TForm1::
DrawGrid1DrawCell(TObject *Sender,

int ACol, int ARow, TRect &Rect, 
TGridDrawState State)

{

  if (State.Contains(gdSelected)) {

    if ((ACol + ARow) % 2) {

      DrawGrid1 -> Canvas -> Brush

       -> Color = clSkyBlue;

      DrawGrid1 -> Canvas ->

       FillRect(Rect);

    }

    else

      DrawGrid1 -> Canvas ->

      StretchDraw(Rect, ris);

  }

}

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

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

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

void __fastcall TForm1::

FormCreate(TObject *Sender) 

{

  znak = 'X';

  kr -> LoadFromFile("k.bmp");

  nl -> LoadFromFile("n.bmp");

}

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

void __fastcall TForm1::

DrawGrid1SelectCell(TObject 
*Sender, int ACol,
int ARow,  bool &CanSelect)

{

  if (pole[ACol][ARow] == 0)

    if (znak == 'X') {

      pole[ACol][ARow] = 1;

      znak = 'O';

    }

    else {

      pole[ACol][ARow] = 2;

      znak = 'X';

    }

}

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

void __fastcall TForm1::

DrawGrid1DrawCell(TObject 

*Sender, int ACol, int ARow,

 TRect &Rect, TGridDrawState State) 

{

  switch (pole[ACol][ARow]) {

    case 1: {

      DrawGrid1 -> Canvas -> 

      StretchDraw(Rect, kr);

      break;

    }

    case 2: {

      DrawGrid1 -> Canvas -> 

      StretchDraw(Rect, nl);

      break;

    }

  }

}

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

void __fastcall TForm1::

BitBtn1Click(TObject *Sender)

{

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

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

      pole[i][j] = 0;

  DrawGrid1 -> Refresh();

}

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

Пытанні да параграфа

1. Які кампанент выкарыстоўваецца для работы з данымі, якія прадстаўлены ў выглядзе табліцы?

2. Які апрацоўшчык падзей выкарыстоўваецца для вылучэння ячэйкі табліцы?

3. Які кампанент выкарыстоўваецца для прадстаўлення графічных даных у таблічнай форме?

4. Які апрацоўшчык выкарыстоўваецца для прамалёўкі ячэйкі табліцы?

5. З дапамогай якой каманды можна выклікаць апрацоўшчык падзеі OnDrawCell?


Практыкаванні

1. Стварыце праект для вырашэння задачы. Дадзены двухмерны масіў A[m][n]. Палічыць суму:

    1. элементаў, у якіх сума нумара радка і нумара слупка роўная ліку х. Лік x уводзіцца;
    2. элементаў, якія менш нумара свайго радка;
    3. элементаў, якія больш нумара свайго слупка;
    4. элементаў, у якіх модуль рознасці нумара радка і нумара слупка роўны ліку x (дадаць поле для ўводу колькасці x);
    5. элементаў, якія размешчаны на галоўнай і пабочнай дыяганалях.

2. Аб'яднайце рашэнне ўсіх задач з практыкавання 1 у адзін праект. Выбар нумара задачы ажыццяўляць з выпадальнага спіса. Пры выбары нумара задачы, выводзіць у Memo яе ўмову.

Стварыце праект для вырашэння задачы. Дадзены двухмерны масіў A[m][n]. Вывесці:

  1. нумар слупка, сума элементаў якога максімальная;
  2. нумар радка, сума элементаў якога мінімальная;
  3. нумары радкоў, у якіх ёсць элементы, роўныя максімальнаму элементу табліцы;
  4. нумары слупкоў, у якіх ёсць элементы, роўныя мінімальнаму элементу табліцы;
  5. нумары радкоў, у якіх ёсць роўныя элементы;
  6. нумары слупкоў, у якіх усе элементы розныя;
  7. нумары радкоў, сумы элементаў у якіх роўныя паміж сабой.

3. Стварыце праект, у якім можна будаваць дыяграмы па даных у табліцы. Для пабудовы дыяграм неабходна выкарыстоўваць кампанент Chart.

4. Дапішыце ў прыклад 18.7 праверку выйгрышу на бягучым ходзе. У выпадку выйгрышу выводзіць адпаведнае паведамленне.

5*.  Дадайце ў праект прыкладу з 18.7 магчымасць гульні з камп'ютарам. Камп'ютар гуляе нулікамі.

6. Стварыце праект, у якім можна падрыхтаваць поле для гульні «Марскі бой». Поле, якое вы стварылі, захаваць у тэкставы файл.