![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте!
делаю запрос аудиозаписей, ответ приходит. Но как его разобрать и какой компонент лучше использовать, для выведения в программе? Основной вопрос по тексту.. Я пробовал мудрить с функциями pos, delete,copy и тд.. но только запутал себя еще больше.. Ответ такой(запрос для примера 3 трека) Цитата:
|
|
#2
|
|||
|
|||
|
Название трека идет после слова "title":"Имя артиста и название трека."
Можете с помощью цикла пробежаться по этому тексту и начинать считывать название трека именно после ' "title":" ' и признак конца будет символ " |
|
#3
|
||||
|
||||
|
Нужно по-правилам пользовать регэкспы, но мона и так разобрать, G-кодом
Код:
procedure TForm1.Button1Click(Sender: TObject);
procedure prs(ds, s1, s2: string; list: TStrings);
var
pScan, pEnd, ps1, ps2: PChar;
foundText : string;
begin
ds := Uppercase(ds); s1:= Uppercase(s1); s2:= Uppercase(s2);
ps1:= PChar(s1); ps2:= PChar(s2); pScan:= PChar(ds);
repeat pScan := StrPos(pScan, ps1);
if pScan <> nil then
begin
inc(pScan, Length(s1)); pEnd:= StrPos(pScan, ps2);
if pEnd <> nil then
begin
SetString(foundText, Pchar(ds)+(pScan-PChar(ds)), pEnd-pScan);
list.Add(foundText); pScan:= pEnd+Length(s2);
end else pScan:= nil;
end;
until pScan = nil;
end;
var
artist, title, url: TStrings;
i: integer;
s: string;
begin
artist:= TStringList.Create;
title:= TStringList.Create;
url:= TStringList.Create;
s:= Memo1.Text;
prs(s, '"artist":"', '","', artist);
prs(s, '"title":"', '","', title);
prs(s, '"url":"', '","', url);
ListBox1.TabWidth := 200;
for i := 0 to artist.Count-1 do
ListBox1.Items.Add('Artist: '+artist[i]+^I+'Title: '+title[i]+^I+'URL: '+url[i]);
artist.Free;
title.Free;
url.Free;
end; |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (10.04.2016)
| ||
|
#4
|
|||
|
|||
|
Код:
procedure test;
Var
Str, st, MyStr: String;
i,j: Integer;
begin
while (Pos(artist, dintext)<>0) Do
begin
ar:=''; tit:=''; dr:='';
i:=Pos(artist, dintext);
j:=i+length(artist);
Repeat
ar:=ar+dintext[j];
inc(j);
until ((dintext[j]='"'));
Delete(dintext, i, j-i);
i:=Pos(title, dintext);
j:=i+length(title);
Repeat
tit:=tit+dintext[j];
inc(j);
until (dintext[j]='"');
Delete(dintext, i, j-i);
i:=Pos(dur, dintext);
j:=i+length(dur);
Repeat
dr:=dr+dintext[j];
inc(j);
until (dintext[j]=',');
Delete(dintext, i, j-i);
Form1.ListBox1.Items.Add(ar+'-'+tit+','+dr);
{Form1.ListBox1.Items.Add('Track:'+ar);
Form1.ListBox1.Items.Add('Title:'+tit);
Form1.ListBox1.Items.Add('Duration:'+dr); }
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
dintext:= Memo1.Text;
artist:='"artist":"';
title:='"title":"';
dur:='"duration":';
test;
end; |
| Этот пользователь сказал Спасибо js roman1 за это полезное сообщение: | ||
Gareth (10.04.2016)
| ||
|
#5
|
|||
|
|||
|
Спасибо огромное за код!
Работает. Но как воспроизвести трек по нажатию в листбоксе? Нашёл в инете код: Код:
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var i: integer;
begin
if ListBox1.ItemIndex>=0 then
begin
i:= ListBox1.ItemIndex;
BasicPlay(link[i]);
end;
end;Что это за link, где и как его объявить ? |
|
#6
|
||||
|
||||
|
Ага, на BasicPlay значит не ругается, предположим, что link это список с текстовыми адресами, если мой пример работает, тогда замените эту строчку на BasicPlay(url[ListBox1.ItemIndex]); i можно и выкинуть, только url.Free следует выполнить лишь при выходе из программы, не раньше
З.Ы. В смысле, нужно стринГлисту url сделать глобальной, видимой из других процедур перенеся её в var-секцию юнита Последний раз редактировалось Alegun, 10.04.2016 в 13:45. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (10.04.2016)
| ||
|
#7
|
|||
|
|||
|
Сделал как вы сказали. Все ссылки, артисты и тд отоброжаются, ваш код работает. Но при попытки воспроизвести музыку выдает ошибку.
Ошибка с этого кода, 7 строка: Код:
var channel: HStream; procedure BasicPlay(FileName: AnsiString); begin Channel:= BASS_StreamCreateURL(PAnsiChar(FileName),0,0,nil,0); //Создаём файл, функция аналогична предыдущей, так что без комментариев. if not Bass_ChannelPlay(Channel, False) then //Воспроизводим MessageBox(0, 'Ошибка воспроизведения файла',0, Mb_ok); end; ![]() |
|
#8
|
||||
|
||||
|
Всё может быть, попробуйте для примера подбросить на форму едит, в него адрес эмпифришки и пробуйте её запустить удаляя лишнее, как запустится будет образец для разборки ответа
З.Ы. Можно StringReplace натравить для удаления лишних слешей Последний раз редактировалось Alegun, 10.04.2016 в 15:44. |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Gareth (10.04.2016)
| ||
|
#9
|
|||
|
|||
|
Цитата:
Код:
uses ..., superobject
....
var
Answer: ISuperObject
...
Answer:= TSuperObject.ParseStream(myHT.Document,False);
msg:=Answer.AsObject.S['title'];
|
|
#10
|
|||
|
|||
|
Извиняюсь что долго не отвечал.
Плеер работает так как мне надо= ))) Спасибо всем, особенно Alegun .Дело было в том, что удалял я не те символы с ссылки. Надо было другие слэши уждалять. С двумя слэшами как в ответе от вк "\/" не играло, я удалял этот слэш "/", а надо было этот "\" , + какого-то фига ответ был в верхнем регистре, перевел ответ на всякий случай в нижний. Плеер работает, осталось прикрутить потоки и всякие кнопочки, типа плей, пауза, стоп... В общем разобрался я как это всё работает. Теперь не составляет труда сделать с нуля=) Еще раз спасибо всем !) Тема закрыта =) |