Código básico para Delphi
-
21-09-2019 - |
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?
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.