|
Вопрос # 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™ (статус: Доктор наук), 2 января 2011, 17:15 [#3]:
Проще сделать свой компонент на основе TGraphicControl и вертеть им, как хош: отрисовка компонента полностью в руках программиста, а не системы. Я, чтобы сделать именно что-то непохожее на стандартный интерфейс, делаю именно так.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Жикльор (статус: 5-ый класс), 2 января 2011, 17:34 [#4]:
А можешь кинуть ссылку на документацию по этому компоненту, или напиши свой простейший пример создания одного элемента в списке. Буду благодарен!))
З.Ы. Просто хочу уже сразу сделать нормальное, чтобы потом не копаться в коде и не переписывать все.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
min@y™ (статус: Доктор наук), 2 января 2011, 17:52 [#5]:
Цитата (Жикльор):
Буду благодарен!))
Пока не кончатся новогодние праздники, не буду ничего делать НИ ЗА КАКИЕ ДЕНЬГИ. Я хочу отдохнуть. Потом напиши, поторгуемся.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
eclipse (статус: Посетитель), 2 января 2011, 18:42 [#6]:
Не ребят! Жикльор по ходу там используется listview
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|