Начну с того, что 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.: «Коммент почему-то в спам попал, поэтому не видела («