C++ Builder: Работа с TStringList

Начну с того, что TStringList – очень занимательный класс. Он наследует TStrings. А еще расширяет его такими возможностями как сортировка строк и запрет на добавление дублей.

В постике хочу разобрать добавление/удаление и замену (это вместо редактирования).

Поехали.
Для заполнения списка можно либо добавлять строки поштучно, вот так:

TStringList *text_line= new TStringList;
text_line->Add(new1);

Здесь new1 – строка.

Либо сразу «распаковать» в список текстовый файл. Вот так:

TStringList *text_line= new TStringList;
text_line->LoadFromFile("Текст.txt");

Здесь «Текст.txt» название файла, расположенного в одной папке с программой.

Удалять можно вот так:

text_line->Delete(num1);

Здесь num1 – номер строки (нумеруются с 0, учтите этот момент).

Редактирование строк TStringList не поддерживает.

Зато поддерживает изменение их порядка (при помощи свойства Exchange). Таким образом, для того, чтоб «отредактировать» строку нам нужно:

        а) узнать номер этой строки;
        б) сформировать строку, которая должна быть получена в результате (можно скопировать имеющуюся, например так:
String new1 = text_line[0][num];

здесь num – номер строки; а потом, в случае необходимости, ее отредактировать);

      в) добавить сформированную строку в конец списка;
      г) поменять местами новую и старую строки;
      д) удалить старую строку.

Собственно говоря, «редактирование» (а на деле замену строк) можно делать при помощи такой функции:

TStringList* new_Exchange(int num, String new1)   //функция замены строк в массиве строк
{
  text_line->Add(new1);          //добавление строки в конец массива строк
  int num1 = text_line->Count;   //получение количества строк
  --num1;                        //установка номера последней строки (нумерация с 0)
  text_line->Exchange(num,num1); //замена строк - последняя становится выделенной, выделенная - последней
  text_line->Delete(num1);       //удаление последней строки
  return text_line;
}

Здесь num – номер строки, которую необходимо заменить; а new1 – непосредственно строка, на которую и производится эта замена.

Upd от HAS

Редактирование строк

TStringList* lst = new TStringList;
int first = lst->Add(«first»);
lst->Strings[first] = «new first»;
cout << "value of first elem: " <Strings[first];
delete lst;

Избавление от дубликатов

lst->Sorted = true;
lst->Duplicates = dupIgnore;

Получение текущей позиции при добавлении

int num1 = line->Add(new1);

Пока все )

13 comments on “C++ Builder: Работа с TStringList

    1. Я не поняла вопрос… Вам какой-то конкретный нужно найти? Перебирайте вкладки, если не знаете, где именно он находится — и смотрите. Поиска там нет )))

    1. Запишите обработчик в конкретное событие, в вашем случае, нажатие отдельной кнопки. Ну, или я опять не поняла вопрос )))

  1. Интересует область видимости этой функции.
    Нажал кнопку.
    Строки записались в обработчик.
    Другой кнопкой уже не достать эти строки в этом обработчике?

    1. Выделите несколько кнопок — откройте Object Inspector — создайте общее событие. Один вариант. Второй — напишите функцию. Вызывайте ее при обработке событий (когда и как удобно).
      И извините за поздний ответ — не видела коммента =(

  2. Благодарю за ваши статьи! Уже не раз пригодились!
    Подскажите, как мне загрузить из файла строки без повторений?
    или как вы назвали это «запрет на добавление дублей»?

    1. И вам спасибо, на добром слове.
      На счет дублей — попробуйте как-то так:

      1
      
      text_line->Duplicates=dupIgnore;

      А вообще

      TDuplicates = (duplgnore, dupAccept, dupError);

      dupIgnore —- запрещает добавление повторных элементов;
      dupAccept — разрешает добавление повторных элементов;
      dupError — запрещает добавление повторных элементов и генерирует исключительную ситуацию.

  3. Вообще все неправильно.
    1. TStringList поддерживает редактирование строк, в частности:
    TStringList* lst = new TStringList;
    int first = lst->Add(«first»);
    lst->Strings[first] = «new first»;
    cout << "value of first elem: " <Strings[first];
    delete lst;

    2. Метод Add уже возвращает позицию добавленного элемента, поэтому ваш код:
    text_line->Add(new1);
    int num1 = text_line->Count;
    должен выглядеть так:
    int num1 = line->Add(new1);

    3. Ну а чтобы максимально быстро избавиться от дубликатов, то перед пользование списком надо сделать так:
    lst->Sorted = true;
    lst->Duplicates = dupIgnore;
    правда нарушится порядок строк, зато это гораздо быстрее, чем игнорирование дубликатов без сортировки. Ну а если все же надо сохранить порядок строк, то можно, наверное, попробовать прицепить CustomSort

    1. забыл вставить форматирование и код немного поплыл, но думаю вполне остался понятным

  4. Хорошо, что вы написали)
    Я ща все добавлю — может кому поможет )

    P.S.: «Коммент почему-то в спам попал, поэтому не видела («

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *