Четверг, 18.04.2024, 10:58
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 6 из 8
  • «
  • 1
  • 2
  • 4
  • 5
  • 6
  • 7
  • 8
  • »
Форум » Delphi » Создание mp3 плеера на Delphi » Как работать с плейлистом в delphi на библиотеке BASS.DLL? (разбираем работу с плейлистом на delphi)
Как работать с плейлистом в delphi на библиотеке BASS.DLL?
Filo$oFДата: Воскресенье, 08.07.2012, 11:26 | Сообщение # 76
Лейтенант
Группа: Пользователи
Сообщений: 61
Репутация: 2
Статус: 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
А это +'...') просто приписывает в конце три точки.

Хотя я совсем не понял почему у вас всё так коряво выводит. У меня работает отлично... smile Дождесь xaramamburu он в этом более сведущ, я сам всего ничего изучаю smile

Quote
и да, чет не пойму смысл твоего сообщения, ты написал "что листбокс более 60 символов, поэтому и не влазиет" как это понимать ? Может быть ты имел ввиду менее ?
- ну, если ширина listboxa такова, что может выводить адекватно всего 40 символов, то если символов будет больше начинаются глюки. Измените ширину листбокса и отодвиньте lentime дальше. У вас время начинает отображаться с 60 символа, и в то же время название равно 60.


Сообщение отредактировал Filo$oF - Воскресенье, 08.07.2012, 11:27
 
BM_GORAДата: Воскресенье, 08.07.2012, 11:59 | Сообщение # 77
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: 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
Репутация: 26
Статус: Offline
BM_GORA,
Посчитайте количество символов на вашем скриншоте и вы увидите, что количество символов там с учетом пробелов ровно 60, а длина разная, потому что ширина различных символов разная. )))))
 
BM_GORAДата: Вторник, 02.10.2012, 17:27 | Сообщение # 79
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
хм, и в правду, но тогда это беспонтово, разрыв между концами названия слишком большой получается, тогда надо как то сделать чтоб название обрывалось в определенном месте плейлиста, а именнно гдето около времени, тоесть не по символом обрывать, а чтоб в этом месте плей листа полюбому обрывалось, вот только как это сделать я хз (

Добавлено (02.10.2012, 17:27)
---------------------------------------------
нашел проблемку, у меня текст песни и времени находящийся в листбоксе серого цвета, так вот когда я выделяю какую нибудь песню(выделяется синим цветом) то текста практически не видно, ну и такой вот вопрос, как сделать чтоб при выделении песни, цвет текста песни и времени становился белым, ну а когда выделение снимается обратно становился цветом который был до выделения ?

Сообщение отредактировал BM_GORA - Понедельник, 09.07.2012, 11:50
 
xaramamburuДата: Вторник, 02.10.2012, 20:40 | Сообщение # 80
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: 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
Репутация: 0
Статус: 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
Репутация: 26
Статус: 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;

smile
 
BM_GORAДата: Среда, 03.10.2012, 21:47 | Сообщение # 83
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
попробовал этот код, но текст все равно не меняется на белый (((

Добавлено (03.10.2012, 21:47)
---------------------------------------------
и зачем вот это нужно ? var BMPRect: TRect; у меня и без этого как бы не ругается )

 
xaramamburuДата: Четверг, 04.10.2012, 11:46 | Сообщение # 84
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
BM_GORA,
Это тоже не нужно, забыл убрать.))))))))
 
BM_GORAДата: Четверг, 04.10.2012, 23:42 | Сообщение # 85
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: Offline
так че делать то ?)) код не работает )) прога запускается , все норм, но цвет не меняется...

Добавлено (04.10.2012, 23:42)
---------------------------------------------
проверил в 2007 делфи, все равно серый цвет остается

Сообщение отредактировал BM_GORA - Четверг, 04.10.2012, 22:07
 
xaramamburuДата: Пятница, 05.10.2012, 13:55 | Сообщение # 86
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: Offline
BM_GORA,
Вот смотрите у меня этот код работает так:

Основной текст серый, а выделенный - белые буквы на синем фоне (можете в место White поставить например Red, будут красные буквы на синем фоне).
Или я что-то не понимаю?
smile
 
BM_GORAДата: Воскресенье, 07.10.2012, 09:16 | Сообщение # 87
Лейтенант
Группа: Пользователи
Сообщений: 44
Репутация: 0
Статус: 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
Репутация: 26
Статус: Offline
BM_GORA,
Скидывайте мне на почту ваш проект, вечером посмотрю. Так сказать, что то сложно. Он у вас почему то просто игнорирует первую часть кода.))))
 
xaramamburuДата: Воскресенье, 07.10.2012, 17:59 | Сообщение # 89
Полковник
Группа: Администраторы
Сообщений: 240
Репутация: 26
Статус: 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
Репутация: 0
Статус: Offline
ура, заработало )), спасибо большое ))))
 
Форум » Delphi » Создание mp3 плеера на Delphi » Как работать с плейлистом в delphi на библиотеке BASS.DLL? (разбираем работу с плейлистом на delphi)
  • Страница 6 из 8
  • «
  • 1
  • 2
  • 4
  • 5
  • 6
  • 7
  • 8
  • »
Поиск:


Copyright MyCorp © 2024Конструктор сайтов - uCoz