Вопрос

Я борюсь со следующим:

Цель состоит в том, чтобы параметризовать сервер автоматизации для 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;

Это не работает, есть ли у кого-нибудь предложения, как с этим справиться?

Это было полезно?

Решение

Ваш TPrmRecord тип - это не то, что OO.org ожидает.Вам не следует пытаться писать свои собственные типы, но используйте те, которые OO.org предоставляет.

Существует лицензированный LPGL инструментарий для Delphi: Дельфи ООо.В нем вы найдете модуль 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;

Другие советы

Похоже, что вы пропускаете создание COM-класса, который был бы эквивалентом New com.sun.star.beans.PropertyValue строка в вашем коде.

Я подозреваю, что вам нужно импортировать библиотеку типов в Delphi, которая предоставила бы вам объекты, свойства и методы, необходимые для эмуляции базового поведения.

Вот прямой код Delphi без использования Delphi OOo:

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;

Взгляните на эта тема на немецких форумах Delphi-PRAXiS.Существует целое подразделение delphi, занимающееся некоторой автоматизацией OOo.

использование

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

delphi использует строгое приведение типов, поэтому это вызывает ошибку присваивания.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top