要求用最快速的方法生成
解决方案 »
- adoconnection.execute('exec cunchuguocheng');有没有 在delphi 里执行后不要等待 它的返回;?
- Delphi怎么传入一个数组指针呢?
- 100分求好的【需求分析】文档,内容不限!
- 过年想换个新手机(旧的用了4年了),问一下k-java功能有什么用,moto c350v 有这功能吗?
- 我的installshield shield 4.0 for borland 不支持中文,急???
- delphi 6 好用还是 delphi 7 中秋快乐!!!!
- 使用servers控件wordapplication worddocument,如何在delphi中捕获word中的改变??
- 报表打印,分页打印
- 谁能告诉我这是为什么 ?
- Softcam是什么技术?怎样用DELPHI实现?
- 如何在Delphi中更改表结构?
- 请问如何删除从数据库读取的DBGrid的选种内容阿?
CompartStr: String=' ';
var
CurrentNode : TTreeNode;
Q_Temp,Q_TempWorker : TADOQuery;
NodeText ,DepID,CompartChar ,char ,Num: String;
I,J : Integer;
begin
for J:=0 to Node.Count-1 do
begin
CurrentNode:=Node[J];
NodeText := CurrentNode.Text;
DepID:=Copy(NodeText,Pos('[',NodeText)+1,Pos(']',NodeText)-Pos('[',NodeText)-1);
NodeText:=Copy(NodeText,1,Pos('[',NodeText)-1);
char:='';
for I:=0 to Node.Level-1 do
begin
char := char + CompartStr;
end;
CompartChar:=Char;
//写入文件
if CurrentNode.HasChildren then
begin
XmlStr.Add(CompartChar+' <Dep>');
XmlStr.Add(CompartChar+' <DepName>'+NodeText+'</DepName>');
end
else
begin
Q_Temp:= TADOQuery.Create(Application);
Q_Temp.Connection:=frm_START.ADOCON_LOADVer;
Q_Temp.SQL.Text:='SELECT Count(*) AS Num FROM WorkerToWork WHERE Dep01=:Dep01';
Q_Temp.Parameters.ParamByName('Dep01').Value:= DepID;
Q_Temp.Open;
Num:= Q_Temp.FieldByName('Num').AsString;
XmlStr.Add(CompartChar+' <Dep>');
XmlStr.Add(CompartChar+' <DepName>'+NodeText+'('+Num+')</DepName>');
end;
if CurrentNode.HasChildren then
begin
AddXmlStrings(CurrentNode);
end
else
begin
Q_TempWorker:= TADOQuery.Create(Application);
Q_TempWorker.Connection:=frm_START.ADOCON_LOADVer;
Q_TempWorker.SQL.Text:= 'SELECT Worker.Worker01 AS WorkerID ,Worker.Worker03 AS WorkerName FROM Worker JOIN WorkerToWork ON Worker.Worker01=WorkerToWork.Worker01 WHERE WorkerToWork.Dep01=:Dep01 ORDER BY Worker.Worker01';
Q_TempWorker.Parameters.ParamByName('Dep01').Value:= DepID;
Q_TempWorker.Open;
while not Q_TempWorker.Eof do
begin
XmlStr.Add(CompartChar+' <Worker>');
XmlStr.Add(CompartChar+' <WorkerName>'+Q_TempWorker.FieldByName('WorkerName').AsString+'</WorkerName>');
XmlStr.Add(CompartChar+' <WorkerID>'+Q_TempWorker.FieldByName('WorkerID').AsString+'</WorkerID>');
XmlStr.Add(CompartChar+' </Worker>');
Q_TempWorker.Next;
end;
Q_TempWorker.Free;
end;
XmlStr.Add(CompartChar+' </Dep>');
end;
我没有更好的办法,只有自己来处理写。
procedure Tfrm_OrganizeM.W1Click(Sender: TObject);
var
NodeText: String;
begin
XmlStr:=TStringList.Create;
with tvOrganize do
begin
NodeText := Items[0].Text;
NodeText:=Copy(NodeText,1,Pos('[',NodeText)-1);
end;
//写入文件
XmlStr.Add('<?xml version="1.0" encoding="gb2312" ?> ');
XmlStr.Add('<?xml-stylesheet type=''text/xsl'' href=''Worker.xsl''?>');
XmlStr.Add('<Text>');
XmlStr.Add(' <TextName>公司花名册</TextName>');
XmlStr.Add(' <Dep>');
XmlStr.Add(' <DepName>'+NodeText+'</DepName>');
AddXmlStrings(tvOrganize.Items[0]);
XmlStr.Add(' </Dep>');
XmlStr.Add('</Text>');
XmlStr.SaveToFile('花名册.xml');
ShellExecute(0, 'open', PChar('花名册.xml'), nil, nil, SW_SHOW) ;
XmlStr.Free;
{Xml格式:
<Dep>
<DepName> DepName </DepName>
//----------------------------
<Dep>
<DepName> DepName </DepName>
...
<Worker>
<WorkerName> WorkerName </WorkerName>
<WorkerID> WorkerID </WorkerID>
</Worker>
</Dep>
//----------------------------
<Worker>
<WorkerName> WorkerName </WorkerName>
<WorkerID> WorkerID </WorkerID>
</Worker>
</Dep>
}
end;
var
ChildNode: TTreeNode;
begin
if not Assigned(Node) then Exit;
Result := Indent + '<Child Name"'+ Node.Text '" ImageIndex="' + IntToStr(Node.ImageIndex) + '">'#13#10;
ChildNode := Node.GetFirstChild;
while Assigned(ChildNode) do begin
Result := Result + TreeNodeToXml(ChildNode, Indent + IndentStr);
ChildNode := ChildNode.GetNextSibling;
end;
Result := Result + Indent + '</Child>'#13#10;
end;调用时这样写:
var xmlStr: String;
begin
xmlStr := TreeNodeToXml(TreeView1.Items.GetFirstNode, '');
ShowMessage(xmlStr);
end;
var
i,j:Integer;
s,strDir:string;
MDoc:TXMLDocument;
aNode:IXMLNode;
begin
strDir := GetCurrentDir;
MDoc:=TXMLDocument.Create(self);
MDoc.XML.Clear;
MDoc.Active := true; //激活XMLDoc,自动初始化空的XML文档
MDoc.Version := '1.0';
MDoc.Encoding := 'GB2312'; //设置字符集 //加入根结点
//TreeNode.HasChildren
if TreeNode.Parent=nil then
begin
aNode:=MDoc.AddChild('DSTreeRoot');
aNode.setAttribute('text', TreeNode.Text);
aNode.SetAttribute('open', 'Ture');
aNode.SetAttribute('href','http://');
aNode.SetAttribute('target','box');
aNode.SetAttribute('treeId','16');
treetoDom(TreeNode.GetNext,aNode,sum);
end
else
begin
For j:=0 TO TreeNode.Count-1 Do
for i:=0 to TreeNode.Level-1 do
begin
//加入子结点
aNode:=xmlnode.AddChild('DSTree');
//设置接点属性
aNode.SetAttribute('text', TreeNode.Text);
aNode.SetAttribute('open', 'False');
aNode.SetAttribute('href','http://');
aNode.SetAttribute('target','box');
aNode.SetAttribute('treeId','16');
treetoDom(TreeNode.GetNext,aNode,sum);
end;
end; MDoc.SaveToFile(strDir+'\Tree.xml'); //把组织好的XML文档存于Tree.xml文件中
MDoc.Active := False; //钝化(关闭)XMLDoc
end;
只能取Treeview的前面几位到XML文件中,而且XML文件中的text有重复,在Treeview中TreeNode.Text的值是没有重复的?请问是怎样解决?