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

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

Сайт: Профильное обучение
Курс: Информатика. 11 класс (Повышенный уровень)
Книга: § 16. Компоненты для работы со списками строк
Напечатано:: Гость
Дата: Суббота, 4 Май 2024, 16:43

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. Тип 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. Компонент Memо на форме:

Пример 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). Осуществляйте проверку области определения функции с выводом соответствующих сообщений.