📄 th_upxmlchannel.~pas
字号:
unit TH_UpXMLChannel;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, xmldom, XMLIntf, IdBaseComponent, IdComponent, IdTCPConnection,RzTray,
IdTCPClient, IdHTTP, ScktComp, msxmldom, XMLDoc,RzListVw, ComCtrls,ActiveX,StrUtils;
type
TUpXMLChannel = class(TThread)
private
ItemNum:integer;
procedure ViewXML(XMLNode: IXMLNode;TreeNode:TTreeNode);
procedure GetXML(XMLUrl:String;Name:String);//TreeNode:TTreeNode);
protected
procedure Execute; override;
public
{ public declarations}
constructor Create(i:integer);
end;
type
TAddListXMLChannel = class(TThread)
private
{ Private declarations }
RzLV:TRzListView;
protected
procedure Execute; override;
public
constructor Create(RzListV:TRzListView);
end;
type
TViewXMLChannel = class(TThread)
private
function TreeViewLoadXML(XMLNode: IXMLNode):string;
function TreeViewLoadXML2(XMLNode: IXMLNode):string;
protected
procedure Execute; override;
public
end;
var
CS:TRTLCriticalSection;
XMLCount,XMLCount1:integer;
implementation
uses
FM_RSS,UN_CSS,FM_Splash;
constructor TUpXMLChannel.Create(i:integer);
begin
ItemNum:=i;
FreeOnTerminate := True; // 自动删除
InitializeCriticalSection(CS); //初始化临界区
inherited Create(False); // 直接运行
end;
procedure TUpXMLChannel.Execute;
var
i:integer;
begin
inherited;
CoInitialize(nil);
try
for i:=0 to UpItem-1 do
begin
if ItemNum<=ItemCount then
ViewXML(XMLNames,FMRss.RzTreeView1.Items[ItemNum])
else
Break;
end;
FMRSS.RzTrayIcon1.ShowBalloonHint('更新完成','更新完成', bhiInfo);
except
FMRSS.RzTrayIcon1.ShowBalloonHint('更新完成','更新完成', bhiInfo);
end;
end;
procedure TUpXMLChannel.GetXML(XMLUrl,Name: String);
var
Mark,XMLFileName:String;
i:integer;
DownLoadXML:TIDHTTP;
WriteXML:TFileStream;
begin
for i:=1 to Length(XMLURL) do
begin
Mark:=MidStr(XMLURL,i,1);
if (Mark<>'=')and(Mark<>'/')and(Mark<>'\')and(Mark<>':')and(Mark<>'?')and(Mark<>'*')and(Mark<>'&')and(Mark<>'%') then
XMLFileName:=XMLFileName+Mark;
end;
WriteXML:=TFileStream.Create(ExtractFilePath(Application.ExeName) + 'Feed\'+XMLFileName+'.xml',fmCreate);
DownLoadXML:=TIDHTTP.Create(nil);
try
DownLoadXML.HandleRedirects:= True;
DownLoadXML.Get(XMLURL,WriteXML);
FMRSS.RzTreeView1.Items[ItemNum].Text:=FMRSS.RzTreeView1.Items[ItemNum].Text+#10;
DownLoadXML.Disconnect;
DownLoadXML.Free;
WriteXML.Free;
except
DownLoadXML.Disconnect;
DownLoadXML.Free;
WriteXML.Free;
DeleteFile(ExtractFilePath(Application.ExeName) + 'Feed\'+XMLFileName+'.xml');
end;
end;
procedure TUpXMLChannel.ViewXML(XMLNode: IXMLNode;TreeNode:TTreeNode);
var
Item:TTreeNode;
i,k,l,m:integer;
SList:TStringList;
SourceNode,ItemsParent: TTreeNode;
NodeURL,XMLFileName,Mark,Channel_Name:String;
TrueURL:Boolean;
begin
EnterCriticalSection(CS);
TrueURL:=False;
SList:=TStringList.Create;
SList.Clear;
SourceNode:=FMRSS.RzTreeView1.Items[ItemNum];
ItemsParent:=FMRSS.RzTreeView1.Items[ItemNum].Parent;
k:=FMRSS.RzTreeView1.Items[ItemNum].Index;
while ItemsParent<>nil do
begin
SList.Add(inttostr(ItemsParent.index));
ItemsParent:=ItemsParent.Parent;
end;
SList.Delete(SList.Count-1);
while SList.Text <>'' do
begin
XMLNode:=XMLNode.ChildNodes.Nodes[strtoint(SList.Strings[SList.Count-1])];
SList.Delete(SList.Count-1);
end;
XMLNode:=XMLNode.ChildNodes.Nodes[k];
if XMLNode.NodeName='Channel' then
begin
NodeURL:=XMLNode.NodeValue;
TrueUrl:=True;
Channel_Name:=XMLNode.Attributes['Name'];
end;
if LeftStr(FMRSS.RzTreeView1.Items[ItemNum].Text,1)=' ' then
TrueUrl:=False;
XMLNode:=FMRss.XML3.Node.ChildNodes.Nodes[0];
SList.Free;
LeaveCriticalSection(CS);
if TrueUrl then
begin
FMRSS.RzTreeView1.Items[ItemNum].ImageIndex:=10;
FMRSS.RzTreeView1.Items[ItemNum].SelectedIndex:=10;
FMRSS.RzTreeView1.Items[ItemNum].Text:=' '+FMRSS.RzTreeView1.Items[ItemNum].Text;
Sleep(600);
FMRSS.RzTrayIcon1.ShowBalloonHint('正在更新频道...',Channel_Name, bhiInfo);//FMRss.RzStatusPane1.Caption:='正在更新: '+FMRSS.RzTreeView1.Items[ItemNum].Text;
GetXML(NodeUrl,NodeUrl);
FMRSS.RzTreeView1.Items[ItemNum].ImageIndex:=3;
FMRSS.RzTreeView1.Items[ItemNum].SelectedIndex:=3;
end;
ItemNum:=ItemNum+1;
end;
{ TAddListXMLChannel }
constructor TAddListXMLChannel.Create(RzListV: TRzListView);
begin
RzLv:=RzListV;
FreeOnTerminate := True; // 自动删除
inherited Create(False)
end;
procedure TAddListXMLChannel.Execute;
var
i,k,l:integer;
Item:TListItem;
begin
for i:=0 to titlename1.Count-1 do
begin
Item:=rzlv.Items.Add;
Item.Caption:='';
Item.SubItems.Add(Titlename1.Strings[i]);
if TitleName5.Strings[i]='N' then
begin
Item.SubItems.Add('未读');
Item.ImageIndex:=2;
l:=l+1;
end
else
begin
Item.SubItems.Add('已读');
Item.ImageIndex:=1;
k:=k+1;
end;
if TitleName2.Count=TitleName1.Count then
Item.SubItems.Add(TitleName2.Strings[i])
else
Item.SubItems.Add(' ');
if TitleName3.Count=TitleName1.Count then
Item.SubItems.Add(Titlename3.Strings[i])
else
Item.SubItems.Add(' ');
end;
Cou:=titlename1.Count;
T_Name:=FMRss.RzTreeView1.Selected.Text ;
CSSMenu();
FMRss.RzStatusPane1.Caption:='频道:'+FMRss.RzTreeView1.Selected.Text +' 总共有:'+inttostr(FMRss.RzListView1.Items.Count)+'条新闻'+' 其中:'+inttostr(k)+'条已读 '+inttostr(l)+'条未读';
end;
{ TViewXMLChannel }
procedure TViewXMLChannel.Execute;
begin
XMLCount:=0;
XMLCount1:=0;
try
XMLCount:=StrToInt(TreeViewLoadXML(FMSplash.XML1.Node.ChildNodes.Nodes[0]));
except
end;
try
XMLCount1:=StrToInt(TreeViewLoadXML2(FMSplash.XML2.Node.ChildNodes.Nodes[0]));
except
end;
FMSplash.ProgressBar1.Max:=XMLCount+XMLCount1;
end;
function TViewXMLChannel.TreeViewLoadXML(XMLNode: IXMLNode): string;
var
i:integer;
begin
for i:=0 to XMLNode.ChildNodes.Count-1 do
begin
if XMLNode.ChildNodes.Nodes[i].NodeName='ChannelName' then
begin
XMLCount:=XMLCount+1;
TreeViewLoadXML(XMLNode.ChildNodes.Nodes[i]);
end;
if XMLNode.ChildNodes.Nodes[i].NodeName='Channel' then
begin
XMLNode.ChildNodes.Nodes[i].NodeValue;
XMLCount:=XMLCount+1;
end;
end;
Result:=inttostr(XMLCount);
end;
function TViewXMLChannel.TreeViewLoadXML2(XMLNode: IXMLNode): string;
var
i:integer;
begin
for i:=0 to XMLNode.ChildNodes.Count-1 do
begin
if XMLNode.ChildNodes.Nodes[i].NodeName='folder' then
begin
XMLCount1:=XMLCount1+1;
TreeViewLoadXML2(XMLNode.ChildNodes.Nodes[i]);
end;
if XMLNode.ChildNodes.Nodes[i].NodeName='favorite' then
begin
XMLNode.ChildNodes.Nodes[i].ChildNodes.Nodes[0].NodeValue;
XMLNode.ChildNodes.Nodes[i].ChildNodes.Nodes[1].NodeValue;
XMLCount1:=XMLCount1+1;
end;
end;
Result:=inttostr(XMLCount1);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -