皮耶特:感谢您的意见。我已经接受了你的回答。
在搞砸了一段时间后,我想出了以下解决方案。请不要评论缺少错误检查(try-Except)或内务处理(try-Final),因为它只是一个测试。在最终代码中,所有检查都将到位,并在遇到错误时通知用户。我也会把它改成一个函数,返回真假,取决于成功与否。
只需要澄清几句话:在表单上,我有一个来自 Lockbox 3.7 的 TCryptographicLibrary 和 TCodec。Codec ChainMode 和 Cipher 已由用户在选择要加载的文件之前选择,并且用户还提供了用作密钥的密码。使用 OpenDialog 选择文件。表格上还有一个 TClientDataSet、一个 TDataSource、一个 TDBGrid 和一个 TDBNavigator。
在 ClientDataSet.LoadFromStream 时,我搞砸了一段时间,得到“缺少数据提供程序或数据包”,原因是流中缺少 Seek。因此这一行: XMLSt.Seek(0, soBeginning); 就在加载流之前。
这段代码正在工作,给我一个填充的 DBGrid,根据选择的 XML 文件,带有字段和定义以及数据。
Procedure TForm1.LoadFile(FileName : String; PassWord : string);
var XMLSt : TMemoryStream;
DecSt : TMemoryStream;
begin
DecSt := TMemoryStream.Create;
DecSt.LoadFromFile(FileName);
XMLSt := TMemoryStream.Create;
Codec1.Password := PassWord;
Codec1.DeCryptStream(XMLSt,DecSt);
XMLSt.Seek(0, soBeginning);
ClientDataSet1.LoadFromStream(XMLSt);
XmlSt.Free;
DecSt.Free;
ClientDataSet1.Active := true;
end;
反之,使用 ClientDataSet.SaveToStream、Codec1.EnCryptStream 和 TMemoryStream.SaveToStream 将 ClientDataSet 内容保存为加密的 XML 文件。
注意!该测试使用一个表单,允许用户选择一个解密的 XML 文件,编辑内容,并且(一旦相应的 SaveFile 到位),能够再次将内容保存为加密的 XML 文件。移除可视组件并在运行时创建它们相对容易,允许这是一个通用功能,将加密数据从 XML 文件传输到 ClientDataSet 并返回。
再次感谢您的意见!