Добавление, удаление узлов
Теперь нужно научиться добавлять в программу новые ленты новостей и сохранять их в базе новостей. Первый пункт у наc уже реализован в процедуре AddTreeNode, а для реализации второго напишем функцию, которая в случае успешного добавления возвращает результат true
function SaveNews(Adress,Group,News:string) : Boolean;
var i : integer;
Node,ValNode : IXMLNode;
begin
result:=true;
for i := 0 to XMLDoc.DocumentElement.ChildNodes.Count - 1 do begin
Node := XMLDoc.DocumentElement.ChildNodes[i];
if Node.ChildNodes['Name'].Text=News then begin
Result:=false;
Exit;
end;
end;
XMLDoc.Active:=true;
Node:=XMLDoc.DocumentElement.AddChild('News');
Node.Attributes['Date']:=DateToStr(Date);
ValNode:=Node.AddChild('Name');
ValNode.Text:=News;
ValNode:=Node.AddChild('Group');
ValNode.Text:=Group;
ValNode:=Node.AddChild('Adress');
ValNode.Text:=Adress;
XMLDoc.SaveToFile(XMLDoc.FileName);
end;
Сначала пробегаем по всем узлам базы для проверки уникальности добавляемой новости, в случае наличия последней в базе - завершаем выполнение. Иначе создаём новый узел новости и заполняем его поля (узлы). И самое главное: не забываем сохранить изменения в файл.
Осталось подключить процедуры к интерфейсу пользователя. Для этого кидаем на форму всплывающее меню TPopupMenu. Подключаем его к дереву новостей NewsList.PopupMenu:='PopupMenu1'. Добавляем в дизайнере пункт меню "Добавить новость" и описываем его обработчик события
begin
if frmAddNews.ShowModal=mrOK then
if SaveNews(frmAddNews.eAdress.Text,frmAddNews.eGroup.Text,frmAddNews.eName.Text) then
AddTreeNode(NewsList,frmAddNews.eGroup.Text,frmAddNews.eName.Text);
end;
В случае успешной записи в файл добавляем узлы дерева новостей. frmAddNews здесь дополнительная форма с тремя элементами TEdit. Выглядит как показано на рисунке:
А если пользователь хочет удалить ленту новостей или изменить? Придётся писать новые процедуры и добавлять пункты меню. Вот первая - удаление ленты новостей:
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];
if Node.ChildNodes['Name'].Text=News then begin
XMLDoc.DocumentElement.ChildNodes.Delete(i);
Break;
end;
end;
XMLDoc.SaveToFile(XMLDoc.FileName);
XMLDoc.Active:=false;
end;
Находим номер узла, у которого дочерний узел "Name" искомому тексту и удаляем его сособом, описанным в справке к TXMLDocument. Нужно ещё удалить соответствующий узел в дереве, это делаем в обработчиске события OnClick пункта меню "Удалить ленту новостей":
var News : string;
begin
News:=NewsList.Selected.Text;
DelNews(News);
NewsList.Items.Delete(NewsList.Selected);
end;
Теперь корректировка. В процедуру передаём старое название для поиска узла и новые параметры для записи:
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];
if Node.ChildNodes['Name'].Text=OldName then begin
Node.ChildNodes['Name'].Text:=NewName;
Node.ChildNodes['Group'].Text:=NewGroup;
Node.ChildNodes['Adress'].Text:=NewAdress;
Break;
end;
end;
XMLDoc.SaveToFile(XMLDoc.FileName);
XMLDoc.Active:=false;
end;
Чтобы отобразить изменения в дереве новостей удаляем старый узел и добавляем новый. Это сделано для того чтобы корректно отобразить изменения если пользователь изменяет группу. Этот код реализован в обработчике события OnClick пункта "Редактировать новость":
var sName,sGroup,sAdress : string;
begin
sName:=NewsList.Selected.Text;
if GetInfoNews(sName,sGroup,sAdress) then begin
if not Assigned(frmAddNews) then frmAddNews:=TfrmAddNews.create(self);
frmAddNews.eName.Text:=sName;
frmAddNews.eGroup.Text:=sGroup;
frmAddNews.eAdress.Text:=sAdress;
if frmAddNews.ShowModal=mrOK then EditNews(sName, frmAddNews.eName.Text,frmAddNews.eGroup.Text,frmAddNews.eAdress.Text);
NewsList.Items.Delete(NewsList.Selected);
AddTreeNode(NewsList,frmAddNews.eGroup.Text,frmAddNews.eName.Text);
FreeAndNil(frmAddNews);
end;
end;
В окно редактирования загружаются параметры ленты новостей. Для их получения используется функция GetNewsInfo
var i : integer;
Node : IXMLNode;
begin
Result:=false;
XMLDoc.Active:=true;
for I := 0 to XMLDoc.DocumentElement.ChildNodes.Count - 1 do begin
Node:=XMLDoc.DocumentElement.ChildNodes[i];
if Node.ChildNodes['Name'].Text=Name then begin
Group:=Node.ChildNodes['Group'].Text;
Adress:=Node.ChildNodes['Adress'].Text;
Result:=true;
Break;
end;
end;
XMLDoc.Active:=false;
end;
Как видно, программа пока не соответствует своему названию, но мы уже легко работаем с форматом XML а это уже много. На следующем этапе добавим в базу реальные ленты новостей и попробуем их получить, сохранить, удалить, показать новые и т.д.
продолжение следует...