Программа для чтения RSS
Итак все знают что такое RSS. Попробуем написать программу для чтения лент новостей. Используем Delphi 2010 (или любой другой). Требования к программе: возможность добавления, чтения любого числа лент новостей, группировка RSS, программа должна висеть в трее и автоматически проверять адреса на наличие новых новостей. Пока всё. Остальные требования обмозгуем в процессе написания. Итак создаём новый проект File->New->VCL Forms Application. Сразу меняем св-во формы Name на RSSReaderV2, или любое другое, кому как нравится. На форму кидаем компонент TTreeView, обзывем его NewsList. Здесь у нас будут отображаться ленты новостей.
Добавляем в проект новый модуль File->New->Unit. Здесь мы будем описывать процедуры и функции, несвязанные с интерфейсом и глобальные переменные. Первой будет функция для загрузки базы новостей. Все новости будем хранить в формате XML.
begin
Result:=false;
XMLDoc:=TXMLDocument.Create(owner);
if FileExists('news.xml') then begin
XMLDoc.FileName:='news.xml';
Result:=true;
end else MessageDLG('Не найден файл базы новостей',mtError,[mbOK],0);
end;
Как видно база новостей у нас будет храниться в файле "news.xml". Для тестирования процедур и функций создадим его в блокноте с таким содержанием:
<News>
<Name>Лента новостей 1</Name>
<Adress>Адрес1</Adress>
<Group>Группа1</Group>
</News>
<News>
<Name>Лента новостей 2</Name>
<Adress>Адрес 2</Adress>
<Group></Group>
</News>
<News>
<Name>Лента новостей 3</Name>
<Adress>Адрес 3</Adress>
<Group>Группа1</Group>
</News>
</RSSReader_v2>
Сохраним файл в папке с программой. На первое время этого достаточно, в процессе написания программы структуру доработаем.
Теперь нужно научиться загружать данные из файла в дерево новостей. Именно для этого напишем следующую процедуру:
var
i : Integer;
Node : IXMLNode;
begin
xmlDoc.Active:=true;
for i := 0 to XMLDoc.DocumentElement.ChildNodes.Count - 1 do begin
Node := XMLDoc.DocumentElement.ChildNodes[i]; AddTreeNode(tree,Node.ChildNodes['Group'].Text, Node.ChildNodes['Name'].Text);
end;
xmldoc.Active:=false;
end;
Процедура в качестве параметра принимает наше дерево и добавляет в него узлы. В цикле перебираем дочерние узлы документа, их количество хранится в св-ве XMLDoc.DocumentElement.ChildNodes.Count Как видно процедура использует вторую процедуру AddTreeNode, которая принимает два строковых параметра Node.ChildNodes['Group'].Text и Node.ChildNodes['Name'].Text и добавляет их к узлам дерева соответствующим образом. Зачем этот код вынесен в отдельную процедуру - расскажу позднее. А пока смотрим текст этой процедуры:
var
j : integer;
tnd : TTreeNode;
find : boolean;
begin
if sGroup='' then tnd:=nil
else begin
find:=false;
for j := 0 to tree.Items.Count-1 do begin
if tree.Items.Item[j].Text=sGroup then begin
tnd:=tree.Items.Item[j];
find:=true;
break;
end;
end;
if not find then tnd:=tree.Items.AddChild(nil,sGroup);
end;
tree.Items.AddChild(tnd,sName);
end;
Процедура AddTreeNode весьма проста: здесь мы проверяем значение параметра sGroup, если оно пустое, то добавляем узел в нулевой уровень. Если этот параметр имеет значение, ищем соответсвующий узел в нулевом уровне и добавляем в него дочерний если находим. Если узла с таким значением нет, создаём его. Таким образом реализуется группировка лент новостей.
Теперь создаём обработчик события OnCreate главной формы. Он выглядит следующим образом:
begin
if LoadXMLBase(self) then begin
LoadTree(NewsList);
end;
end;
Запускаем программу (F9). Вот что должно получиться.