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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 4 878

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

Доброго времени суток, уважаемые эксперты!
Как можно сделать ListBox в стиле AIMP'а или другого плеера? Чтобы было красиво, отображалось время и название трека, а строчкой ниже его параметры (битрейт, частота и подобное). Когда это будет, то как тогда будет лучше заганять файлы в него? Думал над TStringList и его синхронизация с плейлистом, но т.к. этот плейлист наверняка будет через DrawItem рисоваться - то он будет дёрганный, как можно вычислить всю эту информацию, занести в StringList, а затем просто вывести в Листбокс, чтобы не было зависаний?
Благодарю!

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

Вопрос задал: Жикльор (статус: 5-ый класс)
Вопрос отправлен: 2 января 2011, 12:05
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Жикльор!
Для построения подобных списков (а также различных контакт листов, списков закачек и так далее) очень часто используют следующий компонент - TVirtualTreeView (http://www.soft-gems.net/index.php?option=com_content&task=view&id=12&Itemid=38) - бесплатный, с исходниками и кучкой примеров.
В чем же главный секрет? а дело в том, что собственно сами данные и их отображение - это две различные задачи. Пускай, нужно отобразить список на 10000 файлов. Разве для этого нужно их всех загружать? нет. Нужно всего лишь 10-20 (ровно сколько, сколько влезит на один экран). А это делает всю задачу хоть чуть сложнее, но невероятно быстрее. Если Вы найдете на этом сайте мою статью о виртуальном ListView, то поймете, что при большом кол-ве элементов, добавление нового элемента не константно, и даже не пропорционально размеру, а часто пропорционально квадрату (в неумелых руках и хуже бывает).

Для примера возьмем Winamp. Он загружает только список файлов. И помечает все элементы в нем как нуждающиеся в обновлении. Как только элемент будет отображен, он ставиться в очередь на обновление. Параллельно есть дополнительный поток, который забирает с очереди элементы, вытаскивает нужные данные, заполняет специальные массивы и посылает элементу сигнал "обновись, данные есть". Этим достигается сразу несколько плюсов:
- интерфейс не тормозит.
- не запрашиваются данные по элементам, которые не нужно отображать.
- экономия памяти - так как используется ленивая загрузка (загрузка по требованию).
и много много других.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 2 января 2011, 21:48


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 2 января 2011, 18:42; участников в обсуждении: 4.
Вадим К

Вадим К (статус: Академик), 2 января 2011, 14:32 [#1]:

А почему, если список будет рисованный через DrawItem, то он обязательно будет "дерганный"? Конечно, если в процедуре отрисовки понаставить кучу циклов и сложных расчетов, то это все будет тормозить.
Галочка "подтверждения прочтения" - вселенское зло.
Жикльор

Жикльор (статус: 5-ый класс), 2 января 2011, 14:40 [#2]:

Расчеты будут! На каждый добавленный файл нужно же узнать его длительность и состояние... Так что расчеты будут, я так уже делал, и при добавлении очень большего количества файлов плеер виснет на полминуты, смотря сколько файлов.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
min@y™

min@y™ (статус: Доктор наук), 2 января 2011, 17:15 [#3]:

Проще сделать свой компонент на основе TGraphicControl и вертеть им, как хош: отрисовка компонента полностью в руках программиста, а не системы. Я, чтобы сделать именно что-то непохожее на стандартный интерфейс, делаю именно так.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Жикльор

Жикльор (статус: 5-ый класс), 2 января 2011, 17:34 [#4]:

А можешь кинуть ссылку на документацию по этому компоненту, или напиши свой простейший пример создания одного элемента в списке. Буду благодарен!))

З.Ы. Просто хочу уже сразу сделать нормальное, чтобы потом не копаться в коде и не переписывать все.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
min@y™

min@y™ (статус: Доктор наук), 2 января 2011, 17:52 [#5]:

Цитата (Жикльор):

Буду благодарен!))

Пока не кончатся новогодние праздники, не буду ничего делать НИ ЗА КАКИЕ ДЕНЬГИ. Я хочу отдохнуть. Потом напиши, поторгуемся.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
eclipse

eclipse (статус: Посетитель), 2 января 2011, 18:42 [#6]:

Не ребят! Жикльор по ходу там используется listview

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

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