Fehler im StarOffice Guide?

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

Moderator: Moderatoren

ManneB
Beiträge: 4
Registriert: Mi, 01.09.2004 20:04

Fehler im StarOffice Guide?

Beitrag von ManneB »

hallo zusammen

ich bin hier fast am verzweiflen...ichversuche ein paar Codeschnipsel zum Laufen zu bringen und stoße auf unerwartete Gegenwehr des Interpreters :( Ich versuche in Calc bestimmte Sheets mit OOoBasic zu bearbeiten oder erstellen, das scheitert aber schon am Aufruf, lt. Sun StarOffice Guide wären da folgende Zeilen von nöten


Dim Doc As Object
Dim Sheet As Object
Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets(0)
If Doc.Sheets.hasByName("MySheet") Then
Sheet = Doc.Sheets.getByName("MySheet")
Else
Sheet = Doc.createInstance("com.sun.star.sheet.Spreadsheet")
Doc.Sheets.insertByName("MySheet", Sheet)
End If


aber schon bei
Sheet = Doc.Sheets(0)
ist Schluss :?:

wurde da was am Syntax geändert, bin ich zu doof der ist da ein Fehler in der Doku?

Grüße
Manfred
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Hallo Manfred,

Der Code ist völlig in Ordnung, Du kannst ihn jedoch in dieser Form nicht aus der Basic-IDE starten, weil im Code das Dokument bzw. das Fenster auf den der Code sich beziehen soll, nicht spezifiziert ist.
Schalte das Calc-Fenster in den Vordergrund (so das Du ein Tabellenblatt siehst) und starte das Makro über EXtras>Makros>Makro -->Makro auswählen und mit Schaltfläche ausführen starten.

Gruß
Stephan
ManneB
Beiträge: 4
Registriert: Mi, 01.09.2004 20:04

Beitrag von ManneB »

Stephan hat geschrieben:Hallo Manfred,

Der Code ist völlig in Ordnung, Du kannst ihn jedoch in dieser Form nicht aus der Basic-IDE starten, weil im Code das Dokument bzw. das Fenster auf den der Code sich beziehen soll, nicht spezifiziert ist.
Schalte das Calc-Fenster in den Vordergrund (so das Du ein Tabellenblatt siehst) und starte das Makro über EXtras>Makros>Makro -->Makro auswählen und mit Schaltfläche ausführen starten.

Gruß
Stephan
hmm...Ok das sehe ich ein - werd mich da wohl noch ein bisschen reinhängen müssen...bei machen Dinge muß man als Umsteiger erst mal einges aus'm Hirn verbannen :wink:

Aber dan kommt gleich die Anschlußfrage...Debuggen wenn man keinen Einfluß auf das laufende Programm hat...wird wohl eine lange Nacht...

Danke und Grüße
Manfred
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

......
oder einfach
StarDesktop.CurrentComponent durch thisComponent ersetzen. Und schon wird das Das Dokument angesprochen, in dem das Basic-Modul gespeichert wurde.

Code: Alles auswählen

doc = thisComponent
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

@Thomas

Da ich Deine Erklärung lese muß ich jetzt mal nachzufragen:
Ich habe bisher nirgens eine zufriedenstellende Erklärung für .CurrentComponent/ThisComponent gefunden, was eigentlich nie gestört hat, jedoch bei einem Thread zu einer benutzerdefinierten Calc-Funktion mußte es definitiv eines von beiden sein (weiß im Moment nicht mehr welches)- ich habe das damals durch Probieren gelöst und fand das zwar unbefriedigend, fand jedoch nirgens klare Informationen.

Vielleicht kannst Du mir etwas genauer erklären wo ich zweckmäßiger Weise welche der beiden Formulierungen einsetze, denn die Erklärung:
Und schon wird das Das Dokument angesprochen, in dem das Basic-Modul gespeichert wurde.
scheint mir nicht völlig erschöpfend zu sein. Ja, es funktioniert mit ThisComponent - aber auch wenn das in einem Modul der Standard-Bibliothek von OOo gespeichert ist und nicht in einem Dokument. Wenn das in der Standard-Bibliothek von OOo gespeichert ist agiert das Makro (aus der IDE gestartet) immer mit dem zuletzt geöffneten Calc-Dokument. Ich nehme an das ist abhängig von einer Art "Fensterindex" obwohl ich darüber nichts weiß, sondern nur die Problematik des Ladens von Dokumenten in 'Fenster bestimmten Namens' kenne.
Vielleicht bin ich ja jetzt auf dem Holzweg, aber ich frage mich ob ich nicht generell ThisComponent verwenden sollte, denn welchen praktischen Vorteil bietet .CurrentComponent (zumindest wenn die Aktionen meines Codes nur innerhalb eines Dokuments stattfinden - falls diese Einschränkung überhaupt nötig ist)?


Gruß
Stephan
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Stephan,

ich bin leider auch kein Sun-Programmierer und kann dir weder die Historie noch den tieferen Sinn der Programmierung darlegen. Aus meinem gesammelten Wissen (ohne Anspruch auf Vollständigkeit):
Bis StarOffice 5.1 liefen alle Module von Staroffice in einer einheitlichen "Rahmenumgebung", erst mit StarOffice 6 und OOo 1.0 wurde diese Vorgehensweise aufgegeben und den Applikationen einzelne Fenster spendiert.
Unter 5.1 war es also dringend nötig, die Applikationen innerhalb des Rahmenobjektes anzusprechen - eben über die Zuordnung StarDesktop.CurrentComponent. Das funktioniert auch heute noch ohne Probleme, das heisst intern wird nach wie vor ein Objekt "StarDesktop" erzeugt und mit Methoden und Eigenschaften ausgestattet. StarDesktop ist also, auch wenn nicht mehr sichtbar, immer noch eine Art übergeordneter Rahmen. Über dieses Objekt kann ich auch andere, offene Soffice Applikationen ansprechen und manipulieren.
Über "thisComponent" erreichst du immer nur das aktuelle (und du hast natürlich recht, es geht auch, wenn das Makro nicht im Dokumnet gespeichert ist) Applikationsfenster, nicht aber die sonstigen Fenster und Hilfsanwendungen. Insofern kannst du auch in der IDE (die ja auch eine StarDesktop Anwendung darstellt) ein Makro laufen lassen, das mit "thisComponent" auf die aktuell geöffnete Applikation (Writer, Calc, Draw oder Impress) zugreift, nicht aber ein Makro, das mit StarDesktop.currentComponent das Objekt der gerade aktuellen Applikation liefert - jetzt eben die Basic-IDE.
Es reicht heute in der Regel, mit "thisComponent" zu arbeiten, solage sich die Makros auf das aktuelle Dokument beziehen.
Möchte man jedoch diverse Dokumente verschiedener Applikationen ansprechen, dann sollte man variieren.

OK, vielleicht nicht professionell erläutert, aber ich hoffe, es hilft weiter. Also ich nutze in der Regel "thisComponent" und hatte noch keine Probleme.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

@Thomas
StarDesktop ist also, auch wenn nicht mehr sichtbar, immer noch eine Art übergeordneter Rahmen. Über dieses Objekt kann ich auch andere, offene Soffice Applikationen ansprechen und manipulieren.
Ja, das habe ich schon probiert, ich kann StarOffice mit Parameter starten (ich glaube -invisible) und wenn ich der SO-Anwendung ein Autostartmakro zugeordnet habe und dieses einen Basic-Dialog startet sehe ich nur den Dialog und sonst nichts...
StarDesktop.currentComponent das Objekt der gerade aktuellen Applikation liefert
Ja, das ist klar
- jetzt eben die Basic-IDE.
hier lag mein (Unterlassungs)Denkfehler, Du hast völlig recht.


Also kann man vereinfacht wohl sagen das .CurrentComponent aus Kompatibilitätsgründen existiert - gegebenenfalls abgesehen von den Fragen welche die 'einzelnen Fenster' betreffen.


Danke für die Erläuterungen.

Beste Grüße
Stephan
Antworten