Базовый код для Delphi
-
21-09-2019 - |
Вопрос
Я борюсь со следующим:
Цель состоит в том, чтобы параметризовать сервер автоматизации для 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 использует строгое приведение типов, поэтому это вызывает ошибку присваивания.