ich möchte gerne Octave mit Calc über ActiveX verbinden.
Das funktioniert auch schon ganz gut. Nur wird immer das Calc-Fenster angezeigt
und ich möchte in manchen Fällen dass es versteckt bleibt.
Daher habe ich versucht ein Argument "Hidden" = false an die Funktion
"loadComponentFromURL" zu übergeben.
Mein Problem ist dass ich in Octave kein SAFEARRAY erzeugen kann.
(Ich konnte die Visual Basic Beispiele in diesem Fall nicht auf Octave übertragen.)
Gibt es einen Bridge-Befehl zur Konstruktion von SAFEARRAYs? Habt ihr eine Idee was
sonst noch an meinem Code (siehe unten) falsch sein könnte?
Ein leeres Octave Cell-Array { } kann ich an das COM-Objekt übergeben.
Wenn ich ein Cell-Array mit einem PropertyValue fülle funktioniert die Übergabe allerdings nicht mehr.
Gibt es noch andere Möglichkeiten um das Calc Fenster zu verbergen?
("Document.CurrentController.Frame.ContainerWindow.setVisible(false);" ist nicht schnell genug.)
Sonnige Grüße,
Stefan
Hier ist ein Teil meines Codes in dem ich Versuche das PropertyValue in ein Array zu packen und zu übergeben
(was nicht funktioniert:)
Code: Alles auswählen
propValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
ValueObj1 = ServiceManager.Bridge_GetValueObject();
ValueObj1.Set('string','Hidden');
propValue.Name = ValueObj1;
ValueObj2 = ServiceManager.Bridge_GetValueObject();
ValueObj2.Set('boolean',0);
propValue.Value=ValueObj2;
%Dieser Befehl funktioniert nicht:
Document = Desktop.loadComponentFromURL(urlString, "_default", 0, {propValue});
%Das hier auch nicht:
args{1}=propValue;
Document = Desktop.loadComponentFromURL(urlString, "_default", 0, args);
%Das funktioniert, aber das Calc Fenster ist sichtbar:
Document = Desktop.loadComponentFromURL(urlString, "_default", 0, {});
Und hier kommt meine ganze bisherige Funktion, mit sichtbarem Calc-Fenster
(vielleicht hat ja noch jemand Verwendung für den Code):
Code: Alles auswählen
function resultcell = gread(filepath);
if ~exist(filepath)
msgbox(['Error in gread. The file' sprintf('\n') filepath sprintf('\n') 'could not be found!']);
else
%connect with OO
ServiceManager = actxserver ("com.sun.star.ServiceManager");
Desktop= ServiceManager.createInstance("com.sun.star.frame.Desktop");
%convert filepath to url
special_in = {'%' '\' '#' '§' '{' '}' 'ß' '´' '`' '°' '^' ';' '@' '[' ']' '''' };
special_out = {'%25' '/' '%23' '%C2A7' '%7B' '%7D' '%C3' '%9F' '%C2%B4' '%60' '%5E' '%3b' '%40' '%5B' '%5D' '%27' };
for k=1:length(special_in)
filepath = strrep(filepath, special_in{k}, special_out{k});
end
urlString = ['file:///' filepath];
%open file
propValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
ValueObj1 = ServiceManager.Bridge_GetValueObject();
ValueObj1.Set('string','Hidden');
propValue.Name = ValueObj1;
ValueObj2 = ServiceManager.Bridge_GetValueObject();
ValueObj2.Set('boolean',0);
propValue.Value=ValueObj2;
%create an property array to pass it with the following command !!!!?????!!!!!
Document = Desktop.loadComponentFromURL(urlString, "_default", 0, {});
%Document.loadComponentFromURL(url,"_blank",0,{})
%create blank document
%Document= Desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, {});
%private:factory/sdraw
%private:factory/swriter
%private:factory/scalc
%private:factory/simpress
%file url: "file:///c:/example.ods", not: "file:///c:\example.ods" !!
%Document.CurrentController.Frame.ContainerWindow.setVisible(false);
%get first sheet
Sheet = Document.getSheets().getByIndex(0);
%get used range
Cursor = Sheet.createCursor();
Cursor.gotoStartOfUsedArea(false);
Cursor.gotoEndOfUsedArea(true);
Address = Cursor.getRangeAddress();
StartRow = Address.StartRow;
EndRow = Address.EndRow;
StartColumn=Address.StartColumn;
EndColumn=Address.EndColumn;
%get data
for i = StartRow:EndRow
for j = StartColumn:EndColumn
cellData= Sheet.getCellByPosition(j,i).getFormula();
data{i+1,j+1} = cellData;
if length(cellData)>1
if isequal(cellData(1),'''')
data{i+1,j+1} = cellData(2:end);
end
end
end
end
%close open office
Document.Close(true);
DocsColls = Desktop.Components.createEnumeration();
if ~DocsColls.hasMoreElements()
Desktop.terminate();
end
clear Document;
clear Desktop;
clear ServiceManager;
%return data
resultcell= data;
%set value
%Sheet.getCellByPosition(0,0).setFormula( "Month" )
%get value
%Sheet.getCellByPosition(0,2).getFormula()
%Sheet.getCellByPosition(0,0).getDataArray()
%Select a cell range
%Sheet.getCellRangeByName('A1:C5');
%Sheet.getCellRangeByPosition(0,0,0,3)
%get selection
%CellRange = Document.getCurrentSelection()
%RangeAddr = CellRange.getRangeAddress
%c1 = RangeAddr.StartColumn
%r1 = RangeAddr.StartRow
%c2 = RangeAddr.EndColumn
%r2 = RangeAddr.EndRow
%hide window
%Props(0).Name="Hidden"
%Props(0).Value=True
%Document.loadComponentFromURL(url,"_blank",0,Props())
%//JScript
%var value= objServiceManager.Bridge_GetValueObject();
%value.InitInOutParam("long", 123);
%object.doSomething(value);
%var out= value.Get();
end
end