⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 th_upxmlchannel.~pas

📁 realworld source code
💻 ~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 + -