|
Вопрос # 2 040/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Есть список(ListBox1) с несколькими элементами. Каждому элементу соответствует элемент из массива(массив of TID3TAG(тип сам писал)). КАК сделать удаление выделенных(нескольких) элементов и при этом сделать так чтобы элементы массива соответствовали элементам списка??????
 |
Вопрос задал: Vova Sitnov (статус: Посетитель)
Вопрос отправлен: 3 ноября 2008, 17:53
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Vova Sitnov!
Тут наибольшая проблема - синхронизировать отображение и представление в памяти. Когда кол-во элементов станет под тысячу - начнуться ещё проблему - всё это будет медленно добавляться.
Поэтому наиболее правильный вариант - перейти на использование ListView в виртуальном режиме для отображения + свой класс на основе TList для хранения данных.
О том, как сделать виртуальный листвью - можно почитать на этом сайте в разделе статьи мою статью. По второму пункту - если ничего не придумаете, пишите, попробуем сочинить кусочек кода.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 3 ноября 2008, 18:02
Оценка за ответ: 5
|
Ответ #2. Отвечает эксперт: min@y™
Предлагаю не мудрить с массивом, а объекты типа TID3TAG прицеплять к элементам TListBox. Для этого TID3TAG должен быть классом.
Для добавления строки с обхектом в список, можно использовать метод ListBox.Items.AddObject():
function AddObject(const S: string; AObject: TObject): Integer; virtual;
или ListBox.AddItem():
procedure AddItem(Item: String; AObject: TObject);
Доступ к этим объектам:
var
Tag: TID3TAG;
Index: Integer;
begin
//.......
for Index:= 0 to ListBox.Count - 1 do
begin
Tag:= TID3TAG(ListBox.Items.Objects[Index]);
// Действия над Tag
end;
//.......
end;
Удаление выделенных строк вместе с закреплёнными за ними объектами:
var
Index: Integer;
begin
for Index:= ListBox.Count - 1 downto 0 do // Именно downto!!!
if ListBox.Selected[Index]
then begin
if Assigned(ListBox.Items.Objects[Index])
then TID3TAG(ListBox.Items.Objects[Index]).Free();
ListBox.Items.Delete(Index);
end;
end;
З.Ы. АХТУНГ! Код не отлаживал!
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 3 ноября 2008, 18:16
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 3 ноября 2008, 18:13; участников в обсуждении: 2.
|
Vova Sitnov (статус: Посетитель), 3 ноября 2008, 18:07 [#1]:
Думую создать компонент для этих целей. Создать свой класс (наследствуя от TList) легко, но а как писать компонент (ниразу не делал)?
|
|
Вадим К (статус: Академик), 3 ноября 2008, 18:13 [#2]:
А зачем компонент? он тут точно пока не надо.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|