VST实例(14) 节点数据导出
procedure TForm2.CSV1Click(Sender: TObject); begin vst.SaveToCSVFile('airports.csv',false); end;
上述代码可以把VST存为CSV文件,第二个参数为TRUE,则存储标题。
但因为存为CSV文件时,源代码中有一句是“LChildNode := LChildNode.NextSibling;”,只是取了兄弟节点,所以实际上只存了第一层的数据,例如本程序,就只存了情报区数据。
如果我们把源代码改成“LChildNode := getnext(LChildNode);”,则会存储所有的节点。
使用contentto***语句,可以存储为其它文件。
例如,我们增加一个Tsavedialog,其fileter是:
“网页文件UTF-8 (*.htm; *.html)|*.htm;*.html|Unicode UTF-16 text file (*.uni)|*.uni|Rich text UTF-16 file (*.rtf)|*.rtf|CSV文件 (*.csv)|*.csv|文本文件 (*.txt)|*.txt”
执行语句是:
procedure TForm2.HTML1Click(Sender: TObject); const HTMLHead : AnsiString = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">'#13#10 + '<html>'#13#10 + ' <head>'#13#10 + ' <meta http-equiv="Content-Type" content="text/html; charset=utf-8">'#13#10 + ' <title>机场列表</title>'#13#10 + ' </head>'#13#10 + '<body>'#13#10; var S: string; WS: UnicodeString; Data: Pointer; DataSize: Cardinal; TargetName: string; begin with dlgSave1 do begin if Execute then begin TargetName := FileName; case FilterIndex of 1: // HTML begin if Pos('.', TargetName) = 0 then TargetName := TargetName + '.html'; S := HTMLHead + VST.ContentToHTML(tstVisible) + '</body></html>'; Data := PChar(S); DataSize := Length(S); end; 2: // Unicode UTF-16 text file begin TargetName := ChangeFileExt(TargetName, '.uni'); WS := VST.ContentToUnicode(tstVisible, #9); Data := PWideChar(WS); DataSize := 2 * Length(WS); end; 3: // Rich text UTF-16 file begin TargetName := ChangeFileExt(TargetName, '.rtf'); S := VST.ContentToRTF(tstVisible); Data := PChar(S); DataSize := Length(S); end; 4: // Comma separated values ANSI text file begin TargetName := ChangeFileExt(TargetName, '.csv'); S := VST.ContentToText(tstVisible, ‘,‘); Data := PChar(S); DataSize := Length(S); end; else // Plain text file TargetName := ChangeFileExt(TargetName, '.txt'); S := VST.ContentToText(tstVisible, #9); Data := PChar(S); DataSize := Length(S); end; ) with TFileStream.Create(TargetName, fmCreate) do try WriteBuffer(Data^, DataSize); finally Free; end; end; end; end;
请注意:contentto***函数转换的数据编码是unicode,中文在显示时会出现乱码,所以可以在最终结果时如果能进行转码会好很多。
下图是转换为HTML网页文件的显示。
通过上面的例子,我们可以看出在导出为字符串时,并不完全如我们所想的那样,至少背景啊,特殊字符显示啊等等都未能体现。
正如我们在节点序列部分添加的代码所示,我们完全可以通过getfirst***等等函数,或直接使用便利函数来生成自定义的导出程序,或者和EXCEL控件、WORD控件等结合,直接生成更复杂的文件,这是另一个课题了,就不在此累述。