VST实例(14) 节点数据导出

发布时间 2023-05-31 16:21:54作者: Luo大哥
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控件等结合,直接生成更复杂的文件,这是另一个课题了,就不在此累述。