Как работать с плейлистом в delphi на библиотеке BASS.DLL?
|
|
Filo$oF | Дата: Воскресенье, 08.07.2012, 11:26 | Сообщение # 76 |
Лейтенант
Группа: Пользователи
Сообщений: 61
Статус: Offline
| Про: Quote но если в названии допустим 40 символов то он почему то обрезает на 35 символе(к примеру), вот так : qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq... но стоит то обрезка на 60 символе, почему так ? У вас в названии сорок символов, так откуда программа возьмёт оставшиеся 20 если их нет?
if length(extractfilename(Listbox1.Items[index]))>60 then - эта строка проверяет сколько символов в названии и если их больше 60 то обрезает + copy(extractfilename(Listbox1.Items[index]),1,60) - эта часть отрезает от названия строку с первого по 60 символ включительно, и вставляет их в listbox А это +'...') просто приписывает в конце три точки.
Хотя я совсем не понял почему у вас всё так коряво выводит. У меня работает отлично... Дождесь xaramamburu он в этом более сведущ, я сам всего ничего изучаю
Quote и да, чет не пойму смысл твоего сообщения, ты написал "что листбокс более 60 символов, поэтому и не влазиет" как это понимать ? Может быть ты имел ввиду менее ? - ну, если ширина listboxa такова, что может выводить адекватно всего 40 символов, то если символов будет больше начинаются глюки. Измените ширину листбокса и отодвиньте lentime дальше. У вас время начинает отображаться с 60 символа, и в то же время название равно 60.
Сообщение отредактировал Filo$oF - Воскресенье, 08.07.2012, 11:27 |
|
| |
BM_GORA | Дата: Воскресенье, 08.07.2012, 11:59 | Сообщение # 77 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: Offline
| Quote (Filo$oF) - ну, если ширина listboxa такова, что может выводить адекватно всего 40 символов, то если символов будет больше начинаются глюки. Измените ширину листбокса и отодвиньте lentime дальше. У вас время начинает отображаться с 60 символа, и в то же время название равно 60. да это я понимаю, ну смотрите, если обрезка идет на 60 символе, а у меня их всего 40 то почему обрезается на 35 символе, если поидеи обрезаться недолжно ?
Сообщение отредактировал BM_GORA - Воскресенье, 08.07.2012, 12:00 |
|
| |
xaramamburu | Дата: Воскресенье, 08.07.2012, 18:17 | Сообщение # 78 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| BM_GORA, Посчитайте количество символов на вашем скриншоте и вы увидите, что количество символов там с учетом пробелов ровно 60, а длина разная, потому что ширина различных символов разная. )))))
|
|
| |
BM_GORA | Дата: Вторник, 02.10.2012, 17:27 | Сообщение # 79 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: Offline
| хм, и в правду, но тогда это беспонтово, разрыв между концами названия слишком большой получается, тогда надо как то сделать чтоб название обрывалось в определенном месте плейлиста, а именнно гдето около времени, тоесть не по символом обрывать, а чтоб в этом месте плей листа полюбому обрывалось, вот только как это сделать я хз ( Добавлено (02.10.2012, 17:27) --------------------------------------------- нашел проблемку, у меня текст песни и времени находящийся в листбоксе серого цвета, так вот когда я выделяю какую нибудь песню(выделяется синим цветом) то текста практически не видно, ну и такой вот вопрос, как сделать чтоб при выделении песни, цвет текста песни и времени становился белым, ну а когда выделение снимается обратно становился цветом который был до выделения ?
Сообщение отредактировал BM_GORA - Понедельник, 09.07.2012, 11:50 |
|
| |
xaramamburu | Дата: Вторник, 02.10.2012, 20:40 | Сообщение # 80 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| BM_GORA, Вообще полный код отрисовки выглядит примерно так: Code procedure TForm_player.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); const W = 16;H = 16;// размеры иконки begin with (Control as TListBox).Canvas do begin //очищаем область Item(а) путем заливки FillRect(Rect); //Здесь добавляем иконку размером WxH. Ее надо загрузить в Image1, //который должен находиться на форме Listbox1.Canvas.Draw(0, Rect.Top, Image1.Picture.Graphic); end; with (control as TListBox).canvas do begin //проверяем строка находится в фокусе и выделена или просто выделена if (State = [odFocused, odSelected]) or (State = [odSelected]) then begin Font.Color := clWhite;//задаем цвет шрифта для выделенного трека или того, который в фокусе Font.Size := 9;//размер шрифта Brush.Style := bsClear; SetBkMode(Handle, TRANSPARENT); //текст отрисовки TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index])); end //иначе проверяем номер выбранного трека else if I = Index then begin Font.Color := clRed;// задаем цвет шрифта играющего трека Font.Size := 9;//размер шрифта Brush.Style := bsClear; Pen.Color := clBLue;//цвет рамки Rectangle(Rect);//рисуем рамку SetBkMode(Handle, TRANSPARENT); //текст отрисовки TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index])); end //иначе во всех остальных случаях else begin Font.Color := clGray;//основной цвет шрифта в плейлисте Brush.Style := bsClear; Font.Size := 9; SetBkMode(Handle, TRANSPARENT); TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index])); end; end; end; В конце процедуры procedure TForm_Player.Player; нужно вызвать событие для перерисовки ListBox1.Repaint; иначе не убирается выделение с трека, который играл при переключении на другой трек.
|
|
| |
BM_GORA | Дата: Вторник, 02.10.2012, 23:33 | Сообщение # 81 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: Offline
| чет я не осбо понял этот код, какие то иконки, зачем то красным выделяется трек который играет, но того что я спрашивал так и не произошло ) мне нужно чтоб при выделении цвет шрифта этой строчки становился белый, а когда выделение снимается то обратно серый (типо того как на этом форуме при выделении какого нибуть текста) ))) вот мой код отрисовки на всякий случай: Code procedure TForm_player.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); const W = 16; H = 16; begin with (Control as TListBox).Canvas do begin FillRect(Rect); end; with (control as TListBox).canvas do begin Font.Color := clGray; Font.Size := 9; Brush.Style := bsClear; Brush.Color := clGray; SetBkMode(ListBox1.canvas.Handle, TRANSPARENT); if length(extractfilename(Listbox1.Items[index]))>55 then TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + copy(extractfilename(Listbox1.Items[index]),1,55)+'...') //для названия песни else TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index])); TextOut(rect.right-60, rect.top,'|'+lentime(Listbox1.Items[index]));//для времени end; end;
Сообщение отредактировал BM_GORA - Вторник, 02.10.2012, 23:33 |
|
| |
xaramamburu | Дата: Среда, 03.10.2012, 12:15 | Сообщение # 82 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| BM_GORA, Что непонятного в коде? Если вы сравните ваш код, то увидите что он является последней частью того кода который я привел. Этот кусок кода как раз и отвечает за основной текст плейлиста ( Font.Color := clGray; Font.Size := 9; - цвет шрифта серый, а размер шрифта 9).
Эта часть кода отвечает как раз зато, что вы просите.
//проверяем строка находится в фокусе и выделена или просто выделена if (State = [odFocused, odSelected]) or (State = [odSelected]) then begin Font.Color := clWhite;//задаем цвет шрифта для выделенного трека или того, который в фокусе Font.Size := 9;//размер шрифта Brush.Style := bsClear; SetBkMode(Handle, TRANSPARENT); //текст отрисовки TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index])); end Если строка выделена или находится в фокусе, то она будет выделяться по умолчанию в синем прямоугольнике, а цвет шрифта задается белый ( Font.Color := clWhite;). Специально проверял у меня все работает (шрифт меняется с серого на белый и обратно).
Эта часть кода:
//иначе проверяем номер выбранного трека else if I = Index then begin Font.Color := clRed;// задаем цвет шрифта играющего трека Font.Size := 9;//размер шрифта Brush.Style := bsClear; Pen.Color := clBLue;//цвет рамки Rectangle(Rect);//рисуем рамку SetBkMode(Handle, TRANSPARENT); //текст отрисовки TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index])); end отвечает за песню, которая в данный момент играет. Текст выделяется красным цветом и рисуется синяя рамка с белым фоном.
Эта часть кода:
//Здесь добавляем иконку размером WxH. Ее надо загрузить в Image1, //который должен находиться на форме Listbox1.Canvas.Draw(0, Rect.Top, Image1.Picture.Graphic);
позволяет вставить маленькую картинку (иконку) перед названием песни в плейлисте. Если вам это не надо, можете эту строку убрать.
Короче, если вам ненужно выделение играющего трека оставьте только эту часть кода: Code procedure TForm_player.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); const W = 16;H = 16;// размеры иконки begin with (Control as TListBox).Canvas do begin //очищаем область Item(а) путем заливки FillRect(Rect); end; with (control as TListBox).canvas do begin //проверяем строка находится в фокусе и выделена или просто выделена if (State = [odFocused, odSelected]) or (State = [odSelected]) then begin Font.Color := clWhite;//задаем цвет шрифта для выделенного трека или того, который в фокусе Font.Size := 9;//размер шрифта Brush.Style := bsClear; SetBkMode(Handle, TRANSPARENT); //текст отрисовки TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index])); end //иначе во всех остальных случаях else begin Font.Color := clGray;//основной цвет шрифта в плейлисте Brush.Style := bsClear; Font.Size := 9; SetBkMode(Handle, TRANSPARENT); TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index])); end; end; end;
|
|
| |
BM_GORA | Дата: Среда, 03.10.2012, 21:47 | Сообщение # 83 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: Offline
| попробовал этот код, но текст все равно не меняется на белый ((( Добавлено (03.10.2012, 21:47) --------------------------------------------- и зачем вот это нужно ? var BMPRect: TRect; у меня и без этого как бы не ругается )
|
|
| |
xaramamburu | Дата: Четверг, 04.10.2012, 11:46 | Сообщение # 84 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| BM_GORA, Это тоже не нужно, забыл убрать.))))))))
|
|
| |
BM_GORA | Дата: Четверг, 04.10.2012, 23:42 | Сообщение # 85 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: Offline
| так че делать то ?)) код не работает )) прога запускается , все норм, но цвет не меняется... Добавлено (04.10.2012, 23:42) --------------------------------------------- проверил в 2007 делфи, все равно серый цвет остается
Сообщение отредактировал BM_GORA - Четверг, 04.10.2012, 22:07 |
|
| |
xaramamburu | Дата: Пятница, 05.10.2012, 13:55 | Сообщение # 86 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| BM_GORA, Вот смотрите у меня этот код работает так: Основной текст серый, а выделенный - белые буквы на синем фоне (можете в место White поставить например Red, будут красные буквы на синем фоне). Или я что-то не понимаю?
|
|
| |
BM_GORA | Дата: Воскресенье, 07.10.2012, 09:16 | Сообщение # 87 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: Offline
| у меня вот этот код : Code procedure TForm_player.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); const W = 16; H = 16; begin with (Control as TListBox).Canvas do begin FillRect(Rect); end; with (control as TListBox).canvas do begin //проверяем строка находится в фокусе и выделена или просто выделена if (State = [odFocused, odSelected]) or (State = [odSelected]) then begin Font.Color := clWhite;//задаем цвет шрифта для выделенного трека или того, который в фокусе Font.Size := 9;//размер шрифта Brush.Style := bsClear; Brush.Color := clWhite; SetBkMode(ListBox1.canvas.Handle, TRANSPARENT); //текст отрисовки TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index])); end //иначе во всех остальных случаях else begin Font.Color := clBlack; Font.Size := 9; Brush.Style := bsClear; Brush.Color := clGray; SetBkMode(ListBox1.canvas.Handle, TRANSPARENT); if length(extractfilename(Listbox1.Items[index]))>55 then TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + copy(extractfilename(Listbox1.Items[index]),1,55)+'...') //для названия песни else TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index])); TextOut(rect.right-60, rect.top,'|'+lentime(Listbox1.Items[index]));//для времени end; end; end; работает вот так: http://i39.fastpic.ru/big/2012/1007/28/e01011427b433c09d1f4c9e2002b8328.jpg то-есть никак )))Добавлено (07.10.2012, 09:16) --------------------------------------------- специально основной цвет поставил черный, т.к. подумал может я дальтоник и не могу отличить серый от белого, но с черным все явно видно )
|
|
| |
xaramamburu | Дата: Воскресенье, 07.10.2012, 09:53 | Сообщение # 88 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| BM_GORA, Скидывайте мне на почту ваш проект, вечером посмотрю. Так сказать, что то сложно. Он у вас почему то просто игнорирует первую часть кода.))))
|
|
| |
xaramamburu | Дата: Воскресенье, 07.10.2012, 17:59 | Сообщение # 89 |
Полковник
Группа: Администраторы
Сообщений: 240
Статус: Offline
| BM_GORA, Замените строку: if (State = [odFocused, odSelected]) or (State = [odSelected]) на if (odSelected in State). Я не знаю почему первый вариант у вас не работает. И вместо строки: //текст отрисовки TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index])); Добавьте ваш вариант: if length(extractfilename(Listbox1.Items[index]))>55 then TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + copy(extractfilename(Listbox1.Items[index]),1,55)+'...') //для названия песни else TextOut(Rect.Left + w, Rect.Top, IntToStr(Index) + '. ' + extractfilename(Listbox1.Items[index])); TextOut(rect.right-60, rect.top,'|'+lentime(Listbox1.Items[index]));//для времени Должно работать.)))))))
|
|
| |
BM_GORA | Дата: Воскресенье, 07.10.2012, 23:38 | Сообщение # 90 |
Лейтенант
Группа: Пользователи
Сообщений: 44
Статус: Offline
| ура, заработало )), спасибо большое ))))
|
|
| |
|