![]() |
|
| Правила Форума редакция от 22.06.2020 |
|
|||||||
|
|
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже. |
|
![]() |
|
|
Опции темы | Опции просмотра |
Language
|
|
|
#1
|
|
Неактивный пользователь
Пол:
Регистрация: 31.01.2008
Сообщений: 37
Репутация: 4
|
Задача такая: используя ссылку котировок валют с сайта Центробанка, например:
http://www.cbr.ru/scripts/XML_daily....req=02/03/2007 отобразить данные в компоненте DBGrid своего проекта. C web-компонентами раньше не работал, ума ни приложу как это сделать. Подскажите плиз, кто знает... |
|
|
|
| Реклама: | вкусный букет краснодар заказать | Магазин бытовой техники: морозильный ларь бирюса б 285кх - переходи на сайт ТАЙМТВ! | Лучшие замороженные пюре: фруктовое пюре купить оптом - заказывай на сайта АГРОБАР! | Магазин бытовой техники: газовые плиты - переходи на сайт ТАЙМТВ! | шарики голтовочные |
|
|
#2
|
|||||||||||||||||||
|
На форму кинь мемо, едит и компонент из Indy - IdHTTP
Далее парсинг
__________________
Хочу машину, дачу и бабу в придачу. |
||||||||||||||||||||
|
|
|
| Сказали спасибо: |
|
|
#3
|
|
Неактивный пользователь
Пол:
Регистрация: 31.01.2008
Сообщений: 37
Репутация: 4
|
"Что-то не получается:
Project Project2.exe raised exception class EIdHTTPProtokolException with Message 'HTTP/1.1 400 Bad Request' Может еще какие опции надо подкрутить в этом IdHTTP?" Извиняюсь, вопрос снят, просто ссылка битая была. Большое спасибо! А как можно отобразить не в memo, а в DBGride в виде двух колонок: Валюта - цена? Какой компонент добавить к DataSource? Последний раз редактировалось Terio; 05.02.2008 в 16:02.. |
|
|
|
|
|
#4
|
|
Лучше использовать не DBgrid (Я его только для работы с удаленными БД использую и ДатаСорс кидается на таблицу в БД для связи с DBGrid(В свойствах потом показывается после выбора Базы Данных и выбора таблиц с датаСорцом)).
Проще использовать StringGrid на вкладке "Additional"
__________________
Хочу машину, дачу и бабу в придачу. |
|
|
|
|
|
|
#5
|
|
Неактивный пользователь
Пол:
Регистрация: 31.01.2008
Сообщений: 37
Репутация: 4
|
В DBGrid можно отображать локальный файл XML через связку DataSource-ClientDataSet.
Не помню как, но точно делал это. По идее, StringGrid намного проще. Но никак у меня не получается StringGrid-ом. Какое его свойство цеплять гетом на idHTTP? Как вообще реализовать табличное отображение этого XML-файла? Последний раз редактировалось Terio; 05.02.2008 в 18:02.. |
|
|
|
|
|
#6
|
|
irkyt, добавь этот кусок кода к тому что у тебя уже есть, предварительно кинь на форму StringGrid
Код:
var s,s_val:string;
num_cel:integer;
begin
s:=memo1.Text;
s_val:=s;
stringgrid1.FixedCols:=0; //Фиксированные столбцы =0
stringgrid1.FixedRows:=0; //Фиксированные строки =0
stringgrid1.ColCount:=2; //Столбцов всего 2
stringgrid1.RowCount:=1; //Изначально строк всего 1
num_cel:=0;
while pos('<Name>',s)>1 do
begin
{Парсим страницу}
s:=copy(s,pos('<Name>',s),length(s)-pos('<Name>',s));
s_val:=copy(s_val,pos('<Value>',s_val),length(s_val)-pos('<Value>',s_val));
s:=copy(s,pos('<Valute ID="',s),length(s)-pos('</Valute>',s));
s_val:=copy(s_val,pos('<Valute ID="',s_val),length(s_val)-pos('</Valute>',s_val));
stringgrid1.Cells[0,0]:='Австралийский доллар'; {Почему-то не понял почему не выводится(может сам найдешь ошибку в цикле, пришлось ручками}
{Выводим все это в StringGrid}
stringgrid1.Cells[0,num_cel+1]:=(copy(s,pos('<Name>',s)+6,pos('</Name>',s)-(pos('<Name>',s)+6)));
stringgrid1.Cells[1,num_cel]:=(copy(s_val,pos('<Value>',s_val)+7,pos('</Value>',s_val)-(pos('<Value>',s_val)+7)));
inc(num_cel); //Увеличиваем на 1 номер строки
stringgrid1.RowCount:=num_cel; //Делаем это и для StringGrid
end;
end;
__________________
Хочу машину, дачу и бабу в придачу. |
|
|
|
|
| Сказали спасибо: |
|
|
#7
|
|
Неактивный пользователь
Пол:
Регистрация: 31.01.2008
Сообщений: 37
Репутация: 4
|
Все работает, большое спасибо! Я еще календарь добавиол вместо edita, вообще красота, работает быстро, удобно!
Понял, что с парсингом XML у меня напряг, подскажите пожалуйста какую-нить статью, чтобы в этой теме получше разобраться. Последний раз редактировалось Terio; 07.02.2008 в 11:44.. |
|
|
|
|
|
#8
|
|
Насчет статей па парсингу, навряд ли что-то найдете, а вот работу со строками и операции insert,copy,pos,length(),delete и т.д, можно почитать
__________________
Хочу машину, дачу и бабу в придачу. |
|
|
|
|
|
|
#9
|
|
Неактивный пользователь
Пол:
Регистрация: 31.01.2008
Сообщений: 37
Репутация: 4
|
Немного подкорректировал код. Действительно, в цикле была небольшая ошибка (Valute ID начинается раньше Name, и цикл делаю именно по нему).
Вот что получилось: Код:
procedure TForm3.Button1Click(Sender: TObject);
var d,s,s_val:string;
num_cel:integer;
MyDate: tDateTime;
begin
//MonthCalendar1.Date:=StrToDate(Edit1.Text);
MyDate:=MonthCalendar1.Date;
d:=DateToStr(MyDate);
edit1.text:=d;
memo1.Lines.Text:=idhttp1.Get('http://www.cbr.ru/scripts/XML_daily.asp?date_req='+edit1.text);
s:=memo1.Text;
s_val:=s;
stringgrid1.FixedCols:=0; //Фиксированные столбцы =0
stringgrid1.FixedRows:=1; //Фиксированные строки =1
stringgrid1.ColCount:=2; //Столбцов всего 2
stringgrid1.RowCount:=2; //Изначально строк всего 2
StringGrid1.Rows[0].Strings[0]:='Валюта';
StringGrid1.Rows[0].Strings[1]:='Курс (руб.)';
num_cel:=1;
while pos('<Valute ID="',s)>0 do
begin
{Парсим страницу}
s:=copy(s,pos('<Valute ID="',s));
s:=copy(s,pos('<Name>',s),length(s)-pos('<Name>',s));
s_val:=copy(s_val,pos('<Valute ID="',s_val));
s_val:=copy(s_val,pos('<Value>',s_val),length(s_val)-pos('<Value>',s_val));
{Выводим все это в StringGrid}
stringgrid1.Cells[0,num_cel]:=(copy(s,pos('<Name>',s)+6,pos('</Name>',s)-(pos('<Name>',s)+6)));
stringgrid1.Cells[1,num_cel]:=(copy(s_val,pos('<Value>',s_val)+7,pos('</Value>',s_val)-(pos('<Value>',s_val)+7)));
inc(num_cel); //Увеличиваем на 1 номер строки
stringgrid1.RowCount:=num_cel; //Делаем это и для StringGrid
end;
end;
Последний раз редактировалось Terio; 08.02.2008 в 16:57.. |
|
|
|
| Сказали спасибо: |
|
|
#10
|
|
Да, действительно
![]() Просто писал "на коленках" можно сказать. Сам понял, что ошибся немного
__________________
Хочу машину, дачу и бабу в придачу. |
|
|
|
|
|
|
#11
|
|
Неактивный пользователь
Пол:
Регистрация: 31.07.2007
Сообщений: 5
Репутация: 1
|
В принципе если воспользоваться парсером от Microsoft, то код можно сделать более изящным. Информацию о классах и методах можно получить в MSDN. В примере используется 5 версия парсера. Перед использованием необходимо импортировать COM-библиотеку "Microsoft XML, v5.0" (файл msxml5.dll) Пример нормально будет работать для жесткого порядка тэгов в получаемом xml. Код:
var
Document: IXMLDOMDocument2;
sData: string;
I: Integer;
...
Document := CoDOMDocument50.Create;
try
Document.Async := False;
Document.load('http://www.cbr.ru/scripts/XML_daily.asp?date_req=' + sDate);
for I := 0 to Document.childNodes.Length - 1 do
begin
<Наименование> := Document.childNodes[I].childNodes[3].nodeValue;
<Коэффициент> := Document.childNodes[I].childNodes[2].nodeValue;
<Курс> := Document.childNodes[I].childNodes[4].nodeValue;
end;
finally
Document := nil;
end;
...
|
|
|
|
![]() |
Похожие темы
|
||||
| Тема | Автор | Раздел | Ответов | Последнее сообщение |
| Журнал: "Guadros" /"Genefas" / "Toallas" (en punto de cruz) | IGLENA | Вышивка | 5 | 06.02.2026 17:47 |
| Журнал: "Knitting" / "EasyKnitting" / "Knitscene" | stupikosha | Вязание | 161 | 11.05.2025 21:20 |
| Где в опере хранятся пароли и личные данные, сохраненные "жезлом"? | jhfgry | Архив | 5 | 06.11.2006 01:56 |
|
|