Начну с того, что 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);
Пока все )
slist->Strings[j]
и редактируй себе как хочешь
TStringList наследует все функции класса Strings)
Как найти компонент на палитре компонентов?
Я не поняла вопрос… Вам какой-то конкретный нужно найти? Перебирайте вкладки, если не знаете, где именно он находится – и смотрите. Поиска там нет )))
А как повесить удаление или редактирование на отдельный кнопарь?
Запишите обработчик в конкретное событие, в вашем случае, нажатие отдельной кнопки. Ну, или я опять не поняла вопрос )))
Интересует область видимости этой функции.
Нажал кнопку.
Строки записались в обработчик.
Другой кнопкой уже не достать эти строки в этом обработчике?
Выделите несколько кнопок – откройте Object Inspector – создайте общее событие. Один вариант. Второй – напишите функцию. Вызывайте ее при обработке событий (когда и как удобно).
И извините за поздний ответ – не видела коммента =(
Благодарю за ваши статьи! Уже не раз пригодились!
Подскажите, как мне загрузить из файла строки без повторений?
или как вы назвали это “запрет на добавление дублей”?
И вам спасибо, на добром слове.
На счет дублей – попробуйте как-то так:
А вообще
Вообще все неправильно.
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
забыл вставить форматирование и код немного поплыл, но думаю вполне остался понятным
Хорошо, что вы написали)
Я ща все добавлю – может кому поможет )
P.S.: “Коммент почему-то в спам попал, поэтому не видела (“