Schnittstelle (Interface) ansprechen

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

Moderator: Moderatoren

Wolfgang Lampert
****
Beiträge: 102
Registriert: Do, 13.05.2004 16:24
Wohnort: Neuss

Schnittstelle (Interface) ansprechen

Beitrag von Wolfgang Lampert »

Hi, ich versuche, das mittlere Beispiel aus dem SO Programmierhandbuch, Seite 74, nachzubilden. Leider fehlt mir noch Einiges - ich komme alleine nicht darauf, wie der Service "com.sun.star.container.XNameAccess" zu initialisieren ist:

REM Ausgabe aller Tabellen-Namen eines Tabellen-Dokumentes
Sub Test
Dim Sheets As Object
Dim SheetNames
Dim I As Integer

Sheets = Spreadsheet.Sheets
SheetNames = Sheets.getElementNames

For I=LBound(SheetNames) to UBound(SheetNames
Msgbox SheetNames(I)
Next I

End Sub
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Wolfgang,

Die Beispiele sind nur Codeschnipsel und nicht immer für sich lauffähig. Wesentlich ist, dass du verstehst, worum es geht.

Dein Beispiel ist deswegen nicht lauffähig, weil das Objekt "Spreadsheet" nicht definiert wurde. Füge vor die Zeile Sheets noch dein Dokumentenobjekt ein, nenne diese eben "Spreadsheet" , dann funktioniert es:

Code: Alles auswählen

REM Ausgabe aller Tabellen-Namen eines Tabellen-Dokumentes
Sub Test
Dim Spreadsheet as Object
Dim Sheets As Object
Dim SheetNames
Dim I As Integer

Spreadsheet = thisComponent
Sheets = Spreadsheet.Sheets
SheetNames = Sheets.getElementNames

For I=LBound(SheetNames) to UBound(SheetNames
Msgbox SheetNames(I)
Next I

End Sub
Viele Grüsse
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Wolfgang Lampert
****
Beiträge: 102
Registriert: Do, 13.05.2004 16:24
Wohnort: Neuss

Beitrag von Wolfgang Lampert »

Hi, danke für die Ergänzung.
Funktioniert so natürlich. Allerdings hat es mich einige Zeit gebraucht um zu verstehen, dass "Sheets" mit zwei vollkommen unterschiedlichen Bedeutungen in einer Zeile verwendet wird:
Sheets=Spreadsheet.Sheets :idea:
Bei "Sheets=.." handelt es sich um eine frei definierte ObjektVariable
Bei ".Sheets" um ein Schlüsselwort !!

Sinnvoller wäre:
Dim oSheet as Object
..
oSheet = Spreadsheet.Sheets

gruss Wolfgang
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hallo Wolfgang,

wo du recht hast, hast du recht. Das wäre natürlich sinnvoller.
Bei ".Sheets" um ein Schlüsselwort !!
"Schlüsselwort " ist wohl nicht ganz richtig, es handelt sich um eine vordefinierte Funktion (eben mit mit Namen "Sheets"), die allerdings nur bei Tabellendokumenten vorhanden ist, und ein Objekt zurückliefert.
Dieses Objekt kann natürlich den gleichen Namen tragen ("sheets"), auch wenn dies nicht so geschickt ist.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Wolfgang Lampert
****
Beiträge: 102
Registriert: Do, 13.05.2004 16:24
Wohnort: Neuss

Beitrag von Wolfgang Lampert »

Hi, danke nochmals an alle für die tolle Unterstützung. Kenne das so und in dieser Qualität nicht!! Ich arbeite im Moment an der Umstellung von MS Office nach OO und ohne diese Hinweise wäre es nicht so gut möglich.
Bestimmt kann ich mich in relativ kurzer Zeit ebenso nützlich machen.

Noch ein kleiner Hinweis - bitte Korrektur, wenn ich falsch liege:
Spreadsheet = thisComponent
--> die "calc-Datei" bzw. das aktuelle modul der StarOffice-Anwendung
"Spreadsheet=thisComponent" bezieht sich auf das Spreadsheet, IN DEM DAS MAKRO HINTERLEGT IST. Wenn ich das Makro nun von einem anderen Spreadsheet aus aufrufe, untersucht es die falsche Anwendung.
"Spreadsheet=StarDesktop.CurrentComponent" ist daher sinnvoller und grundsätzlich zu bevorzugen
gruss Wolf
Antworten