COM-Komponent (MS) unter OOo Basic nutzen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

bst
*****
Beiträge: 222
Registriert: Mo, 18.01.2010 16:14
Wohnort: Ilsfeld

Re: COM-Komponent (MS) unter OOo Basic nutzen

Beitrag von bst »

Hi,

irgend etwas ist da M.E. anders als unter VBA? Dieses hier funktioniert in VBA problemlos:

Code: Alles auswählen

Option Explicit

Sub x()
   Dim re As Object, mc As Object, i As Integer, j As Integer
   
   Set re = CreateObject("vbscript.regexp")
   re.Pattern = "(\d)\d(\d)"
   re.Global = True
   Set mc = re.Execute("123 + 456 <> 789")
   For i = 0 To mc.Count - 1
      For j = 0 To mc(i).Submatches.Count - 1
         Debug.Print i, j, mc(i).Submatches(j)
      Next
   Next
   Set mc = Nothing
   Set re = Nothing
End Sub
in OOBasic bekomme ich das nicht ans Laufen, beim Zugriff auf mc(i) ist Schluss :-(

"Eigenschaft oder Methode nicht gefunden: SubMatches"

Dabei ist übrigens egal ob ich den Code genau so wie oben hernehme oder das Objekt so erstelle:

Code: Alles auswählen

   oOLEService = createUnoService("com.sun.star.bridge.oleautomation.Factory")
   re = oOLEService.createInstance("vbscript.regexp")
cu, Bernd
--
Windows XP, Office 2003, OOo 3.2.1
bst
*****
Beiträge: 222
Registriert: Mo, 18.01.2010 16:14
Wohnort: Ilsfeld

Re: COM-Komponent (MS) unter OOo Basic nutzen

Beitrag von bst »

Nochmals Hallo,

ich glaube ich hab's verstanden :-) :-)

UNO unterstützt keine Collections!!

http://wiki.services.openoffice.org/wik ... s_from_UNO schreibt:
Unlike UNO properties, Automation properties can have arguments.
Und diese Teile heißen im VBA in Excel, Word, ... eben Collections.

Damit funktioniert hier so etwas wie unten.

Könnte das so passen?

cu, Bernd
--

Code: Alles auswählen

Option Explicit

Sub x()
   Dim oRegExp As Object, oMatchCollection As Object, oMatch As Object, i As Integer, j As Integer
   dim arAny(0) As Any
   
   oRegExp = CreateObject("vbscript.regexp")
   oRegExp.Pattern = "(\d)\d(\d)"
   oRegExp.Global = True
   oMatchCollection = oRegExp.Execute("123 + 456 <> 789")
   For i = 0 To oMatchCollection.Count - 1
   	  arAny(0) = i
   	  oMatch = oMatchCollection.Invoke("Item", arAny, Array(), Array())
   	  for j = 0 to oMatch.SubMatches.Count - 1
   	  	 arAny(0) = j
   	     print oMatch.SubMatches.Invoke("Item", arAny, Array(), Array())	
   	  next
   Next
End Sub
bzw. so etwas:

Code: Alles auswählen

Option Explicit

Sub x2()
   Dim oExcel as object, oWorkbook As Object, oSheet As Object, i as integer
   dim arAny(0) As Any
   
   oExcel = CreateObject("Excel.Application")
   oExcel.WorkBooks.Open "e:\test\test.xls"
   ' oWorkbook = oExcel.ActiveWorkbook ginge natürlich auch ;-)
   arAny(0) = "test.xls"
   oWorkbook = oExcel.WorkBooks.Invoke("Item", arAny, Array(), Array())
   for i = 1 to oWorkbook.Sheets.Count
      arAny(0) = i
      oSheet = 	oWorkbook.Sheets.Invoke("Item", arAny, Array(), Array())
      print oSheet.Name
   next
End Sub
Kappler
**
Beiträge: 29
Registriert: Mi, 23.01.2013 10:13

Re: COM-Komponent (MS) unter OOo Basic nutzen

Beitrag von Kappler »

Ich grabe noch mal diesen alten Thread aus (ich hoffe das stört hier nicht):

Auf das selbe Problem bin ich auch gestoßen, die aufgezeigte Lösung funktioniert so bei mir aber leider nicht.
Wobei ich gestehen muss, dass ich das gezeigte Vorgehen nur zum Teil verstehe :( ...

Zunächst mal hat dies nicht funktioniert:

Code: Alles auswählen

   oRegExp = CreateObject("vbscript.regexp")
Das konnt ich aber mittlerweile lösen durch:

Code: Alles auswählen

   Dim oOleService As Object : oOLEService = createUnoService("com.sun.star.bridge.oleautomation.Factory")
   oRegExp =  oOLEService.createInstance("vbscript.regexp")
Jetzt meckert er mir aber das Invoke an:

Code: Alles auswählen

        oMatch = oMatchCollection.Invoke("Item", arAny, Array(), Array())
Fehlermeldung:

Code: Alles auswählen

BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten 
Type: com.sun.star.script.CannotConvertException
Message: [automation bridge]UnoConversionUtilities<T>::anyToVariant 
Cannot convert the value of type :"string"  to the expected Automation type of VARTYPE: 3.
So wie ich das verstehe erwartet er als ersten Parameter für Invoke keinen String sondern eventuell einen Index der Funktion "Item".
Nur: Wo bekomme ich diesen Index bzw. diese Ordnungszahl her?

Entweder ich suche nach den falschen Schlagworten oder es gibt hierzu tatsächlich keine Quellen im Netz (was ja fast nicht seinn kann)...

Hat jemand eine Idee hierzu?

Danke und schöne Grüße aus dem Schwarzwald,
Andreas
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Re: COM-Komponent (MS) unter OOo Basic nutzen

Beitrag von Karolus »

Nimm halt python statt Basic, da brauchst du auch nicht solche wilden Konstrukte:

Code: Alles auswählen

Dim oOleService As Object : oOLEService = createUnoService("com.sun.star.bridge.oleautomation.Factory")
   oRegExp =  oOLEService.createInstance("vbscript.regexp")
sondern einfach nur:

Code: Alles auswählen

import re
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Kappler
**
Beiträge: 29
Registriert: Mi, 23.01.2013 10:13

Re: COM-Komponent (MS) unter OOo Basic nutzen

Beitrag von Kappler »

Das mit dem RegExp war nur ein Beispiel (von weiter oben im Thread), aktuell geht es mir darum, die API unseres Fax/Mailservers (Tobit David) einzubinden.
Und da stoße ich eben auf das genannte Problem...
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Re: COM-Komponent (MS) unter OOo Basic nutzen

Beitrag von Karolus »

LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Kappler
**
Beiträge: 29
Registriert: Mi, 23.01.2013 10:13

Re: COM-Komponent (MS) unter OOo Basic nutzen

Beitrag von Kappler »

Auch das hilft mir nicht wirklich weiter (trotzdem vielen Dank):
Unter MS Word läuft es so wie ich will, mein Problem ist die Anbindung der COM-Komponente unter OpenOffice (bzw. LiO)...
Antworten