Pergunta

Estou lutando com o seguinte:

O objetivo é parametrizar um servidor de automação para o OpenOffice e estou programando em Delphi.

A parte do código básico que quero traduzir para o código 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

Minha tentativa em Delphi se parece

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;

Isso não está funcionando, alguém tem uma sugestão de como enfrentar isso?

Foi útil?

Solução

Sua TPrmRecord Tipo não é o que oo.org espera. Você não deve tentar escrever seus próprios tipos, mas use aqueles que OO.org expõe.

Há uma caixa de ferramentas licenciada por LPGL para Delphi: Delphi ooo. Nele você encontrará uma unidade ooootools.Pas, que exporta uma função CreateUnoStruct(). Use isso e passe 'com.sun.star.beans.PropertyValue' como o nome da estrutura. Você vai conseguir um Variant (ou uma matriz deles, dependendo do outro valor do parâmetro) que você pode usar em vez de TPrmRecord (algo como o seguinte, não testado):

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;

Outras dicas

Parece que você está perdendo a criação da classe COM, que seria o equivalente ao New com.sun.star.beans.PropertyValue linha em seu código.

Suspeito que você precise importar a biblioteca de tipos para Delphi, o que daria a você os objetos, propriedades e métodos necessários para imitar o comportamento básico.

Aqui está o código Straight Delphi sem usar o 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;

Dê uma olhada em Este tópico nos fóruns alemães de Praxis Delphi. Há toda uma unidade Delphi postada fazendo alguma automação OOO.

usar

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

A Delphi usa o tipo de gênero rigoroso, portanto, isso está causando um erro de atribuição.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top