问题1:将XML文件加载到TreeView后在TreeView中拖动节点,相应的XML文件怎么操作,也就是说怎么 把TreeView中的内容原保存至XML文件中?
procedure TForm1.tvChannelDragDrop(Sender, Source: TObject; X, Y: Integer);
var targetnode,sourcenode:TTreenode;
  MyHitTest : THitTests;
  XMLNode,XMLNodeS,XMLNodeT:IXMLNode;
begin
  targetnode:=tvChannel.getnodeat(x,y); //获得源节点
  sourcenode:=tvChannel.selected; //获得目标节点
  MyHitTest := tvChannel.GetHitTestInfoAt(X,Y);
  if htOnIcon in MyHitTest then begin
    Sourcenode.MoveTo(targetnode,naInsert);
    XMLNode??????//这里怎么写?
    tvXML.SaveToFile(ExtractFilePath(Application.ExeName)+'test.xml');;
  end else begin
//修改数据库中当前节点的父节点号parent_id,使其等目标节点标识号;
    if targetnode.SelectedIndex=0 then begin
      tvChannel.items.beginupdate; //禁用TreeView重绘操作
      try
        copynodeunder(tvChannel,sourcenode,targetnode); //启动移动过程
        ????这个过程怎么写? 
        tvChannel.selected:=targetnode;
      finally
        tvChannel.items.endupdate; //重新设置
      end;
    end;
  end;
end;
问题2:ClientDataSet中的记录集怎么按某字段排序?

解决方案 »

  1.   

    procedure CopyNodeUnder(treeview:TTreeview;sourcenode,targetnode:ttreenode);
    var newnode:ttreenode;
    i:integer;
    begin
      newnode:=TreeView.items.addchildfirst(targetnode,''); //建立目标项
      newnode.assign(sourcenode); //复制源项属性
      for i:=sourcenode.count-1 downto 0 do //递归调用,按倒序移动其所有子项
        CopyNodeUnder (treeview,sourcenode.item[i],newnode);
      treeview.items.delete(sourcenode); //删除源项
    end;
    这个过程操作TreeView是这样的,我会写,但操作XMLDocument的就不会写了,请高手赐教。
      

  2.   

    第一个问题自己解决了,不知道第二个问题怎么没人答复,还得自己琢磨
    procedure TFrmMain.SaveChannelToFile;
    var XMLNode:IXMLNode;
    XMLInt:IDOMDocument;
    XML:TXMLDocument;
    begin
      XML:=TXMLDocument.Create(Self);
      XML.Active:=True;
      XMLInt:=XML.DOMDocument;
      XMLInt.CreateElement('HTTPYIKUORSSChannel');
      XMLNode:=XML.AddChild('RSSChannel');
      SaveToXML(tvChannel.Items.Item[0],XML.ChildNodes.Nodes[0]);
      XML.SaveToFile(ExtractFilePath(Application.ExeName)+'YKChannel.xml');
      XML.Free;
    end;procedure TFrmMain.SaveToXML(tvNode:TTreeNode;XMLD:IXMLNode);
    var XMLNode:IXMLNode;
    i:Integer;
    begin
    ShowMessage(IntToStr(tvNode.Count));
      for i:=0 to tvNode.Count-1 do begin
        if tvNode.Item[i].HasChildren then begin
          XMLNode:=XMLD.AddChild('ChannelName');
          XMLNode.Attributes['Name']:=tvNode.Item[i].Text;
          SaveToXML(tvNode.Item[i],XMLNode);
        end else begin
          XMLNode:=XMLD.AddChild('Channel');
          XMLNode.Attributes['Name']:=tvNode.Item[i].Text;
          XMLNode.NodeValue:=ChannelLink(tvNode.Item[i].Data)^.nodeLink;
        end;
      end;
    end;
      

  3.   

    创建ClientDataset的索引的方式实现排序
      

  4.   

    点开TClientdataset.indexdefs,加一个索引,定义
    Clientdataset1.indexdefs[0].fields :='field1';
    TClientdataset.indexdefs[0].descfields :='fiel1';
    这样,就是一个以field1降序排列的索引了
      

  5.   

    ClientDataSet1.IndexName := 'ID' 是这个吗