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

§ 16. Кампаненты для работы са спісамі радкоў

Сайт: Профильное обучение
Курс: Інфарматыка. 11 клас (Павышаны ўзровень)
Книга: § 16. Кампаненты для работы са спісамі радкоў
Напечатано:: Гость
Дата: Воскресенье, 28 Апрель 2024, 13:10

16.1. Клас TString

Пры стварэнні дадаткаў часта даводзіцца працаваць са спісамі радкоў. У C++ Builder для гэтага выкарыстоўваюцца розныя кампаненты, такія як Memo, RichEdit, ListBox, ComboBox, CheckListBox, RadioGroup і інш. Кожны з гэтых кампанентаў утрымлівае ўласцівасць, якая належыць класу TString. Клас TString створаны спецыяльна для працы са спісамі радкоў. Некаторыя метады класа TString прыведзены ў  прыкладзе 16.1.

Для вызначэння колькасці радкоў у спісе выкарыстоўваецца ўласцівасць Count. Нумарацыя радкоў у спісе пачынаецца з нуля. Звяртацца да асобнага радка набору можна як да элемента масіва, паказаўшы індэкс у квадратных дужках (Strings[3]). Індэкс выдзеленага радка ў кампанентах выбару са спісаў вызначаецца ўласцівасцю ItemIndex.

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

Прыклад 16.1. Некаторыя метады класа TString:

Метад

Прызначэнне

Add(S: String)

Дадае радок у набор даных

Clear()

Ачышчае спіс радкоў

Delete(n:int)

Знішчае элемент спісу з індэксам n

Exchange(n1:int, n2:int)

Мяняе месцамі радкі з індэксамі n1 і n2

IndexOf(S: String)

Для радка S вяртае яе індэкс у спісе ці -1, калі такога радка няма

Insert(n:int, S: String)

Устаўляе радок S у спіс, у пазіцыю n

LoadFromFile
(F_N: String)

Загружае набор радкоў з файла з імем F_N

Move(C_Ind:int, N_Ind:int)

Перамяшчае радкі са становішча C_Index у становішча N_Ind

SaveToFile
(F_N: String)

Захоўвае спіс радкоў у файле з імем F_N

Для працы з радкамі выкарыстоўваецца тып String, які падтрымліваецца асяроддзем C ++ Builder, значэннем такога радка з'яўляецца радок AnsiString. Нумарацыя знакаў у такім радку пачынаецца з 1. Некаторыя метады працы з тыпам String прыведзены ў дадатку.

16.2. Кампанент Мемо

Кампанент шматрадковы рэдактар Memo прызначаны для ўводу, вываду і рэдагавання шматрадковых тэкстаў. На панэлі кампанентаў Standard кампанент Memo намаляваны ў выглядзе , імя аб'екта — Memo. Кампанент Memo, які змяшчаецца на форму, атрымлівае імя MemoN, дзе N — нумар 1, 2, 3… (прыклад 16.2).

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

Асноўная ўласцівасць кампанента Memo — уласцівасць Lines, якая змяшчае тэкст акна ў выглядзе спісу радкоў і якая мае тып TStrings. Пачатковае значэнне спісу радкоў можна задаць на этапе праектавання. Для гэтага трэба націснуць кнопку  каля ўласцівасці Lines у акне інспектара аб'ектаў. Пры гэтым адкрыецца акно рэдагавання спісаў радкоў (String List Editor) (прыклад 16.4).

Пры выкананні праграмы для змены змесціва акна кампанента Memo прымяняюцца метады класа TString (гл. прыклад 16.1).

Прыклад 16.5. Змяніць праект Калькулятор з практыкавання 3 (§6). Замяніць кампанент LabeledEdit3 (для вываду выніку) кампанентам Memo. Увесці ў кампаненце Memo «журнал» дзеянняў: запісваць кожны выкананы прыклад. Дадаць кнопкі: «Сохранить», націснуўшы на якую, можна захаваць «журнал» у файл і «Очистить», націснуўшы на якую можна ачысціць змесціва акна Memo.

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

  1. Выдаліць кампанент LabeledEdit3.
  2. Уставіць кампанент Memo1.
  3. Ачысціць кампанент Memo1 з дапамогай акна рэдагавання спісаў радкоў.
  4. Змяніць апрацоўшчыкі кнопак «+», «-», «*» і «/».
  5. Дадаць на форму дыялог SaveDialog1 для захавання файла. Можна дадаць дыялог SaveTextFileDialog1, паколькі змесцівам Memo з'яўляюцца радкі і запіс будзе ажыццяўляцца ў тэкставы файл. Для таго каб па змоўчанні адкрывалася папка, якая змяшчае выкананы файл, у апрацоўшчык падзеі FormCreate упісаць каманду
    SaveDialog1 -> InitialDir =  ExtractFilePath(ParamStr(0));
  6. Напісаць апрацоўшчык OnClick для кнопкі «Сохранить».
  7. Напісаць апрацоўшчык OnClick для кнопкі «Очистить».

Прагледзець змесціва захаванага файла можна з выкарыстаннем праграмы Блокнот.

Прыклад 16.2. Кампанент Меmо на форме:

Прыклад 16.3. Некаторыя ўласцівасці кампанента Memo:

Уласцівасць

Прызначэнне

Font

Вызначае, як будзе выглядаць тэкст унутры акна Memo. Фармат усіх радкоў для дадзенага кампанента аднолькавы

Alignment

Адпавядаюць аналагічным уласцівасцям кампанентаў Label і Edit (прыклады 6.8, 6.9)

WordWrap

ReadOnly

ScrollBars

Вызначае наяўнасць палос пракруткі ў акне. Па змоўчанні ўласцівасць мае значэнне ssNone, што азначае іх адсутнасць. Можна задаваць значэнні: ssHorizontal (гарызантальная), ssVertical (вертыкальная), ssBoth (абедзве)

Калі ўключана гарызантальная паласа пракруткі, то ігнаруецца ўласцівасць WordWrap, якая адказвае на перанос слоў на новы радок (перанос радкоў ажыццяўляецца толькі на экране, новыя радкі ў спіс радкоў не дадаюцца).

Прыклад 16.4. Акно рэдагавання спісу радкоў:

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

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

void __fastcall TForm1::Button1Click
               (TObject *Sender)

{

  int a = StrToInt(LabeledEdit1 -> Text);

  int b = StrToInt(LabeledEdit2 -> Text);

  int c = a + b;

  String s = LabeledEdit1 -> Text +

       "+" + LabeledEdit2 -> Text +

       "=" + IntToStr(c);

  Memo1 -> Lines -> Add(s);

}

Апрацоўшчык падзеі OnClick для кнопкі «Сохранить».

void __fastcall TForm1::Button5Click
                TObject *Sender)

{

  if (SaveDialog1 -> Execute())

    Memo1 -> Lines ->SaveToFile

    (SaveDialog1 -> FileName);

}

Апрацоўшчык падзеі OnClick для кнопкі «Очистить».

void __fastcall TForm1::Button5Click
                (TObject *Sender)

{

  Memo1 -> Lines -> Clear();

}

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

16.3. Кампанент ListBox

Кампанент спіс — ListBox прызначаны для выбару адной або некалькіх радкоў у спісе. На панэлі кампанентаў Standard кампанент Спіс намаляваны ў выглядзе  , імя аб'екта — ListBox. Кампанент ListBox, змешчаны на форму, атрымлівае імя ListBoxN, дзе N — нумар 1, 2, 3… (прыклад 16.6).

Асноўная ўласцівасць кампанента ListBox, якая змяшчае тэкст акна ў выглядзе спіса радкоў — уласцівасць Items, належыць да тыпу TSring. Пачатковае значэнне спіса радкоў можна задаць на этапе праектавання. Для гэтага трэба націснуць кнопку каля ўласцівасці Items у акне інспектара аб'ектаў. Пры гэтым адкрыецца акно рэдагавання спісаў радкоў (String List Editor). Гэта ж акно выкарыстоўвалася для запаўнення радкоў кампанента Memo.

Пры выкананні праграмы для змены змесціва акна кампанента ListBox прымяняюцца метады класа TString.

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

Некаторыя ўласцівасці кампанента ListBox прыведзены ў прыкладзе 16.7.

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

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

  1. Змясціць на форму спіс і метку.
  2. Выкарыстоўваючы рэдактар спісаў радкоў, унесці ў спіс радкі: зіма, вясна, лета, восень.
  3. Ва ўласцівасці Columns устанавіць значэнне 2.
  4. Напісаць апрацоўшчык падзеі OnClick для кампанента ListBox:

Кампанент ListBox аўтаматычна дадасць паласу пракруткі, калі колькасць радкоў не змяшчаецца па вышыні кампанента. Калі колькасць слупкоў не ўстаноўлена (значэнне Columns па змоўчанні роўна 0), то ўзнікае вертыкальная паласа прагорткі. Калі колькасць слупкоў у кампаненце больш за нуль, то ўзнікае гарызантальная паласа пракруткі і даныя дадаюцца ў новы слупок.

Вышыня кожнага радка роўная ItemHeight. Калі трэба, каб пры даданні новага радка паласа пракруткі дакладна не ўзнікла, гэты памер трэба дадаць да вышыні кампанента.

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

Прыклад 16.7. Некаторыя ўласцівасці кампанента ListBox:

Уласцівасць

Прызначэнне

Columns

Задае колькасць слупкоў у кампаненце для адлюстравання спіса

MultiSelect

Значэнне True у гэтай уласцівасці паказвае, што можна выбраць адначасова некалькі радкоў са спіса

SelCount

Вызначае колькасць вылучаных радкоў у спісе. Уласцівасць даступна толькі для чытання і не можа быць зменена праграмна, не адлюстроўваецца ў інспектары аб'ектаў

Selected[N]

Значэнне True ў гэтай ўласцівасці паказвае, што элемент з нумарам N выдзелены ў спісе (нумарацыя радкоў у спісе пачынаецца з нуля) , не адлюстроўваецца ў інспектары аб'ектаў

ItemIndex

Індэкс вылучанага элемента, калі выбар некалькіх радкоў забаронены, не адлюстроўваецца ў інспектары аб'ектаў, па змоўчанні роўны -1

Sorted

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

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

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

void __fastcall TForm1::ListBox1Click
               (TObject *Sender)

{

  switch (ListBox1->ItemIndex) {

    case 0: {

      Label1->Caption = "Зимние месяцы:

       декабрьянварьфевраль";

      break;

    }

    case 1: {

      Label1->Caption = "Весенние месяцы:

        март, апрель, май";

      break;

    }

     case 2: {

      Label1->Caption = "Летние месяцы:

       июньиюльавгуст";

      break;

    }

     case 3: {

      Label1->Caption = "Осенние месяцы:

       сентябрь, октябрь, ноябрь";

      break;

    }

  }

} 

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

16.4. Кампанент ComboBox

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

Асноўная ўласцівасць кампанента ComboBox, гэтак жа як і ў кампанента ListBox, — гэта ўласцівасць Items, якая належыць да тыпу TSring. Пачатковае значэнне спіса радкоў можна задаць у акне рэдагавання спісаў радкоў (кнопка каля  уласцівасці Items у акне інспектара аб'ектаў).

Пры выкананні праграмы для змены змесціва акна кампанента ComboBox прымяняюцца метады класа TString.

Кампанент ComboBox не дапускае вялікага выбару і размяшчэння спіса ў некалькі слупкоў. Уласцівасці ItemIndex і Sorted ў яго такія як у  кампанента ListBox.

У кампанента вызначаны некалькі стыляў адлюстравання (прыклад 16.10).

Асноўная падзея кампанента — OnChange.

Прыклад 16.11. У тэкставых файлах 11А.txt, 11Б.txt, 11В.txt утрымліваюцца спісы актыву класаў. Пры выбары класа павінен загрузіцца спіс актыву.

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

  1. Змясціць на форму кампаненты ComboBox і ListBox.
  2. Змяніць уласцівасць Text кампанента ComboBox на «Классы».
  3. Запоўніць спіс кампанента ComboBox з дапамогай рэдактара спісаў радкоў.
  4. Напісаць апрацоўшчык падзеі OnChange для кампанента ComboBox.
Тэкставыя файлы, якія выкарыстоўваюцца пры вырашэнні задач, можна ствараць непасрэдна ў асяроддзі C++Builder. Для гэтага трэба выканаць каманду File → New  Other. У акне, якое адкрылася, (прыклад 16.12) выбраць Other → Text File. Затым выбраць тэкставы дакумент. У акне рэдактара кода з'явіцца новая ўкладка з імем New1.txt. У гэтым акне можна набраць змесціва файла і затым захаваць яго.

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

Прыклад 16.10. Стыль малюнка кампанента ComboBox вызначаецца яго ўласцівасцю Style. Некаторыя значэнні ўласцівасці Style:

  • csDropDown — устаноўлены па змоўчанні, выпадальны спіс з полем, у якім можна ўводзіць значэнне, даступнае праз уласцівасць Text;
  • csSimple — раскрыты спіс, астатняе як у csDropDown;
  • csDropDownList — выпадальны спіс без акна рэдагавання.

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

Апрацоўшчык падзеі OnChange для кампанента ComboBox.

void __fastcall TForm1::ComboBox1Change
                TObject *Sender)

{

  switch (ComboBox1->ItemIndex) {

    case 0: {

      ListBox1->Items->

      LoadFromFile("11A.txt");

      break;

    }

    case 1: {

      ListBox1->Items->

      LoadFromFile("11Б.txt");

      break;

    }

    case 2: {

      ListBox1->Items->

      LoadFromFile("11В.txt");

      break;

    }

  }

}

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

Прыклад 16.12. Стварэнне тэкставага файла:

16.5. Кампанент CheckListBox

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

Асноўная ўласцівасць кампанента CheckListBox, гэтак жа як і ў кампанентаў ListBox і ComboBox — гэта ўласцівасць Items, якая належыць да тыпу TSring.

Станы індыкатараў спіса з флажкамі вызначаюць уласцівасці State і Checked, разгледжаныя для кампанента флажок (CheckBox). Гэтыя ўласцівасці можна разглядаць як масівы, кожны элемент якога адпавядае індэксу радка.

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

Прыклад 16.14. У тэкставым файле books.txt захоўваюцца назвы кніг, наяўных у кнігарні, у тэкставым файле price.txt — кошты гэтых кніг. Стварыць дадатак, у якім карыстальнік зможа выбіраць кнігі для пакупкі. Пры змене выбару павінна падлічвацца сума пакупкі.

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

  1. Змясціць на форму кампаненты: CheckListBox1, ListBox1 і Label1.
  2. Змяніць уласцівасць Caption кампанента Label1 на «Сумма покупки 0 рублей».
  3. Напісаць апрацоўшчык падзеі OnCreat для формы, якая загружае назвы кніг з файла books.txt у кампанент CheckListBox1 і кошты з файла price.txt у кампанент ListBox1.
  4. Напісаць апрацоўшчык падзеі OnClickCheck для кампанента CheckListBox1, які падлічвае суму пакупкі.

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

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

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

void __fastcall TForm1::FormCreate
                (TObject *Sender)

{

  CheckListBox1 -> Items -> 

  LoadFromFile("books.txt");

  ListBox1 -> Items -> 

  LoadFromFile("price.txt");

}

Апрацоўшчык падзеі OnClickCheck для кампанента CheckListBox1:

void __fastcall TForm1::
CheckListBox1ClickCheck
(TObject *Sender)

{

  double s = 0;

  for (int i = 0; i < 

   CheckListBox1 -> Items -> Count;

   i++) {

    if (CheckListBox1 -> Checked[i])

      s += StrToFloat

      (ListBox1-> Items-> Strings[i]);

  }

  Label1 -> Caption = 

  "Стоимость покупки " + 

  FloatToStr(s) + " рублей";

}

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

Змесціва файлаў:

16.6. Кампанент RadioGroup

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

Пераключальнікі ў кампаненце RadioGroup задаюцца пералікам іх назваў. Назвы захоўваюцца ва ўласцівасці Items, якая належыць да тыпу TSring.

Кампанент валодае ўласцівасцямі Columns і ItemIndex, як і некаторыя з разгледжаных раней кампанентаў работы са спісамі радкоў.

Прыклад 16.16. Стварыць дадатак, які дазваляе вылічыць значэнне адной з трыганаметрычных функцый для ўведзенага аргумента.

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

  1. Змясціць на форму кампаненты LabeledEdit, RadioGroup, Label.
  2. Змяніць уласцівасць Caption у кампанента LabeledEdit1 на «Аргумент».
  3. Ачысціць уласцівасць Caption у кампанента Label1.
  4. Змяніць уласцівасць Caption у кампанента RadioGroup1 на «Функции».
  5. Змяніць уласцівасць Columns у кампанента RadioGroup1 на 2.
  6. Выкарыстоўваючы рэдактар спісаў радкоў, унесці ў спіс RadioGroup1 радкі: sin(x), cos(x), tg(x), ctg(x).
  7. Напісаць апрацоўшчык падзеі OnClick для кампанента RadioGroup1. Значэнне функцыі павінна вылічвацца толькі тады, калі ўведзена значэнне аргумента.

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

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

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

void __fastcall TForm1::
RadioGroup1Click(TObject *Sender)

{

  if (LabeledEdit1 -> Text != "") {

    double f, x;

    x = StrToFloat(LabeledEdit1 -> Text);

    switch (RadioGroup1->ItemIndex) {

      case 0: {

        f = sin(x);

        Label1 -> Caption = "sin(" + 

        LabeledEdit1 -> Text + ") =" +

        FloatToStrF(f, ffFixed, 97);

        break;

      }

      case 1: {

        f = cos(x);

        Label1 -> Caption = "cos(" + 

        LabeledEdit1 -> Text + ") =" +

        FloatToStrF(f, ffFixed, 97);

        break;

      }

      case 2: {

        f = sin(x) / cos(x);

        Label1 -> Caption = "tg(" + 

        LabeledEdit1 -> Text + ") =" +

        FloatToStrF(f, ffFixed, 107);

        break;

      }

      case 3: {

        f = cos(x) / sin(x);

        Label1 -> Caption = "ctg(" + 

        LabeledEdit1 -> Text + ") =" +

        FloatToStrF(f, ffFixed, 107);

        break;

      }

    }

  }

  else

    ShowMessage("Аргумент функции не введен");

}

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

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

1. Якія кампаненты  C++ Builder могуць працаваць са спісамі радкоў?

2. Які клас прызначаны для апрацоўкі спісаў радкоў?

3. Якая ўласцівасць дазваляе вызначыць колькасць радкоў у спісе?

4. Як атрымаць доступ да асобнага радка спіса?

5. Якія метады класа TSting дазваляюць захоўваць спісы ў файле і загружаць іх з файла?

6. Які метад класа TSting дазваляе дадаць радок у спіс?

7. Які метад класа TSting дазваляе выдаліць радок са спіса?

8. Для чаго прызначаны кампанент шматрадковы рэдактар Memo?

9. Якая ўласцівасць кампанента Memo працуе са спісам радкоў?

10. Назавіце кампаненты выбару радкоў са спіса.

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

1. Дадайце ў праект з прыкладу 16.5 наступныя магчымасці:

  1. Загрузка часопіса з файла.
  2. Зрабіце кнопкі даступнымі толькі пасля ўводу двух лікаў.
  3. Устанавіце для кампанента Memo1 вертыкальную паласу пракруткі, якая павінна з'яўляцца пасля ўводу не менш за 4 радкоў.

2. У тэкставым файле захоўваюцца цэлыя лікі. Файл загрузіць у спіс радкоў. Пры выбары колькасці са спіса выдаць яго назву на рускай (або іншай) мове.

3. Змяніце праект з прыкладу 16.11. Спачатку трэба ажыццявіць выбар паралелі. Спіс класаў на кожнай паралелі павінен захоўвацца ў тэкставым файле. Дадайце магчымасць рэдагавання спіса класа і захаванне змяненняў. Прыкладны выгляд формы.

4. У праект з прыкладу 16.14 дадайце яшчэ адзін спіс, у якім пакажыце колькасць кніг кожнага наймення. Дадайце кнопку «Закончить выбор», пры націску на якую памяншаецца колькасць набытых кніг і абнуляецца сума бягучай пакупкі. Калі колькасць кніг стала роўнай нулю, кніга павінна выдаліцца са спіса.

5. Змяніце праект з прыкладу 16.16 так, каб можна было вылічаць значэнні не толькі трыганаметрычных функцый, але і іншых: узвядзенне ў квадрат і куб, выманне квадратнага і кубічнага каранёў, вылічэнне лагарыфма і інш. Для трыганаметрычных функцый прадугледзіце магчымасць задання аргумента функцыі ў градусах (выкарыстоўвайце кампанент CheckBox). Здзяйсняйце праверку вобласці вызначэння функцыі з вывадам адпаведных паведамленняў.