Delphi的基本代码

Posted

技术标签:

【中文标题】Delphi的基本代码【英文标题】:Basic code to Delphi 【发布时间】:2009-11-20 10:33:13 【问题描述】:

我正在努力解决以下问题:

目标是为 openoffice 参数化自动化服务器,我在 Delphi 中编程。

我要翻译成Delphi代码的基本代码是:

Dim aProps(1) As New com.sun.star.beans.PropertyValue
aProps(0).Name = "FilterName"
aProps(0).Value = "Text - txt - csv (StarCalc)"
aProps(1).Name = "FilterOptions"
aProps(1).Value = sFilterOptions

我在 Delphi 中的尝试看起来像

type TPrmRecord = packed Record  
                    Name : String;  
                    Value : String;  
                  End;

Var
  ooParams:Variant;
  MyData : TPrmRecord;
Begin
  ooParams:= VarArrayCreate([0, 1], varVariant);

  MyData.Name  := 'FilterName';
  MyData.Value := 'Text - txt - csv (StarCalc)';
  ooParams[0]  := MyData; 

  MyData.Name  := 'FilterOptions';
  MyData.Value := '59/44,34,ANSI,1,';
  ooParams[1]  := MyData;
End;

这不起作用有没有人建议如何解决这个问题?

【问题讨论】:

【参考方案1】:

您的 TPrmRecord 类型不是 OO.org 所期望的。您不应尝试编写自己的类型,而应使用 OO.org 公开的类型。

有一个 LPGL 许可的 Delphi 工具箱:Delphi OOo。在其中你会发现一个单元 OOoTools.pas,它导出了一个函数CreateUnoStruct()。使用它并传递'com.sun.star.beans.PropertyValue' 作为结构的名称。您将得到一个 Variant(或其中的一个数组,取决于其他参数值),您可以使用它来代替 TPrmRecord(类似于以下内容,未经测试):

var
  Params: Variant;
begin
  Params := CreateUnoStruct('com.sun.star.beans.PropertyValue', 1);

  Params[0].Name  := 'FilterName';
  Params[0].Value := 'Text - txt - csv (StarCalc)';

  Params[1].Name  := 'FilterOptions';
  Params[1].Value := '59/44,34,ANSI,1,';
end;

【讨论】:

您好,mghie,非常感谢您的回答,您能否更具体地说明如何在我的情况下使用此功能?感谢广告 你好,mghie 成功了!我用它来打开一个 CSV 文件到 openoffice calc。非常感谢您的宝贵时间!亲切的问候广告。 这是我在 OOo 工具箱中添加的结果 它会在 calc 中打开一个 CSV 文件: function OpenCSVSheet(Filename : String) : Variant; var ooParams:变体; vTest:变体;开始 vTest:= OpenOffice.CreateInstance('com.sun.star.frame.Desktop'); ooParams := CreateUnoStruct('com.sun.star.beans.PropertyValue', 1); ooParams[0].Name := 'FilterName'; ooParams[0].Value := 'Text - txt - csv (StarCalc)'; ooParams[1].Name := 'FilterOptions'; ooParams[1].Value := '59/44,34,ANSI,1,';结果 := vTest.LoadComponentFromURL(FileName2URL(FileName), '_blank', 0, ooParams);结束; 完整的是 FileName2URL 例程: function FileName2URL(FileName: string): string;开始结果:= ''; if LowerCase(copy(FileName,1,8))'file:///' then result:= 'file:///';结果:=结果+字符串替换(文件名,'\','/',[rfReplaceAll,rfIgnoreCase]);结束;【参考方案2】:

您似乎错过了 COM 类的创建,这相当于代码中的 New com.sun.star.beans.PropertyValue 行。

我怀疑您需要将类型库导入 Delphi,这将为您提供模拟基本行为所需的对象、属性和方法。

【讨论】:

【参考方案3】:

这是没有使用 Delphi OOo 的直接 Delphi 代码:

uses comobj;

var
  OO_ServiceManager: OleVariant;
  FileParams: OleVariant;

begin
  OO_ServiceManager := CreateOleObject ('com.sun.star.ServiceManager');
  FileParams := VarArrayCreate([0, 1], varVariant);
  FileParams[0] := OO_ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
  FileParams[0].Name := 'FilterName';
  FileParams[0].Value := 'Text - txt - csv (StarCalc)';
  FileParams[1] := OO_ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
  FileParams[1].Name := 'FilterOptions';
  FileParams[1].Value := '59/44,34,ANSI,1,';
end;

【讨论】:

【参考方案4】:

看看this Thread in the german Delphi-PRAXiS forums。有一个完整的 delphi 单元发布了一些 OOo 自动化。

【讨论】:

【参考方案5】:

使用

var
ooParams:array[0..1] of TPrmRecord;

delphi 使用严格的类型转换,所以这会导致赋值错误。

【讨论】:

以上是关于Delphi的基本代码的主要内容,如果未能解决你的问题,请参考以下文章

Delphi_04_Delphi_Object_Pascal_基本语法_02

Delphi_05_Delphi_Object_Pascal_基本语法_03

Delphi Code Editor 之 基本操作

Delphi 7:ADO,需要基本的编码示例

探讨下在Delphi里面进程之间的数据共享

Delphi_03_Delphi_Object_Pascal_基本语法_01