Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 040

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Есть список(ListBox1) с несколькими элементами. Каждому элементу соответствует элемент из массива(массив of TID3TAG(тип сам писал)). КАК сделать удаление выделенных(нескольких) элементов и при этом сделать так чтобы элементы массива соответствовали элементам списка??????

Vova Sitnov Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

Vova Sitnov (статус: Посетитель), 3 ноября 2008, 18:07 [#1]:

Думую создать компонент для этих целей. Создать свой класс (наследствуя от TList) легко, но а как писать компонент (ниразу не делал)?
Вадим К

Вадим К (статус: Академик), 3 ноября 2008, 18:13 [#2]:

А зачем компонент? он тут точно пока не надо.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:29
Выполнено за 0.03 сек.