2

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

目标是为 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

我在德尔福的尝试看起来像

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;

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

4

5 回答 5

3

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

Delphi 有一个 LPGL 许可的工具箱: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;
于 2009-11-20T11:11:31.453 回答
1

看起来您好像错过了 COM 类的创建,这相当于New com.sun.star.beans.PropertyValue您的代码中的行。

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

于 2009-11-20T10:42:32.707 回答
1

这是不使用 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;
于 2012-08-29T08:00:18.217 回答
0

在德国 Delphi-PRAXiS 论坛中查看此主题。有一个完整的 delphi Unit 发布了一些 OOo 自动化。

于 2009-11-20T11:06:28.637 回答
-1

采用

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

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

于 2009-11-20T11:16:10.640 回答