DrPagel-FavIcon « »

Verfasst am 26.02.2008 22:55:04 Uhr
Funktionierende Starbasic-Makros für Staroffice7.Product Update1 Teil1

Soeben habe ich bei dannenhoefer.de gelesen, dass sich mit einer Umstellung von Version 5.2 auf Version 6.0 gravierende Änderungen in den Eigenschaften und Methoden von StarBasic ergeben haben, die nicht ausreichend dokumentiert sind.

Da habe ich mal eine Abfrage an mein Staroffice mit dem Ziel gestartet, die Version von StarBasic zu ermitteln. Leider soll dieser nichtfunktionierende Code nur die Spracheinstellung herausposaunen (Lit.»), ja aber welche Sprache? Die vom Benutzer, dem Browser, gar die "StarOffice Basic language" (Lit.»):
Dim oParameter(0) As New com.sun.star.beans.PropertyValue
sProvider = "com.sun.star.configuration.ConfigurationProvider"
oConfigProvider = createUnoService(sProvider)
OSprachversion=oConfigProvider.Locale.Language
msgbox OSprachversion

... und funktioniert wegen unbekannter Methode nicht.
Sehr ausführlich sind dort einige nichtflüchtige Fehler dokumentiert.

Ebensowenig wollte der in dem Handbuch angegebene Code funktionieren. Bereits bei der Abfrage nach dem ersten Datenblatt Doc.Sheets(0) als auch nach dem mit "MySheet" benannten Datenblatt ergaben sich die Fehler wegen unbekannter Eigenschaften und Methoden (vergleiche hierzu Nachtrag2).
Dim Doc As Object
Dim Sheet As Object
Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets(0)
...
oder
Dim Doc As Object
Dim Sheet As Object
Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets.getByName("MySheet")

Mein englischsprachiger Freund dachte, ich hätte mich vertippt ("MyShit")?

Immerhin funktionierte die StarBasic-Abfrage nach dem Betriebssystem (Lit.»):
Sub ShowBS
OS = GetGUIType()
if OS = 1 then Msgbox "BS ist Windows"
if OS = 3 then Msgbox "BS ist Mac"
if OS = 4 then Msgbox "BS ist Unix"
End Sub

Halali....

P.S.: Wird nicht gerade die Version 8 gratis verteilt? Oder ist da noch wieder ein Unterschied zwischen Staroffice8 und Starbasic8?
Später mehr oder weniger. (dp) (3h)

Nachtrag_1 am 27.2.2008 um 18.10Uhr:
Wieder eine funktionierende Prozedur von mir (nach einer "Propierties"-tippfehlerkorrigierten Idee von Lit.»):
Sub ListeEigenschaften
Dim Obj As Object
Dim ObjText As String
Obj = createUnoService("com.sun.star.sheet.SpreadsheetDocument")
ObjText = Obj.DBG_Properties
MsgBox ObjText
End Sub

Anm.: für "com.sun.star.sheet.SpreadsheetDocument" könne man auch andere bekannte vollständige Dienstebezeichnungen eintragen, die von der Modul-Funktion createUnoService() initialisiert werden.

Später (s.Beitrag v.03.3.2008) werde ich diese Art von Prozedur etwas modernisieren, da die MsgBox für manche Ausgaben zu klein dimensioniert ist und z.B. bei folgender Prozedur leider nur einen Teil der Information sichtbar macht (Schlüsselerlebnis!):(Lit.»):
Sub ListeMethoden
Dim Obj As Object
Dim ObjText As String
Obj = createUnoService("com.sun.star.sheet.SpreadsheetDocument")
ObjText = Obj.DBG_methods
MsgBox ObjText
End Sub

Anm.: s.oben (dp) (0,5h)

Nachtrag_2 am 02.03.2008 um 16Uhr:
Obiger Code zur Namensausgabe der Datenblätter war unvollständig. In der starbasicfaq.de-Seite steht der Code vollständig.
Sub ShowDatenblattName
Dim myDoc As Object
myDoc = thisComponent
Anzahl=myDoc.Sheets.count
For i=0 to Anzahl-1
mySheet = myDoc.Sheets(i)
msgbox mysheet.name
Next i
End Sub


Es muss wohl seine Bewandnis damit haben, dass die Bezeichner nicht Doc, sondern oDoc oder myDoc oder anders heissen. Wichtig ist wohl auch thisComponent, falls es sich um das gerade geöffnete Dokument handelt. Die Bezeichnung StarDesktop.CurrentComponentlässt ähnliche Bedeutung vermuten, ist mir aber noch unklar. Vielleicht war diese Bezeichnung bei einer älteren StarBasic-Version gültig?

Anhand der Datenblatt-Namensausgabe wird ersichtlich, dass das "underline"-Zeichen am Wortanfang ungünstig steht. Hier gibt die Messagebox (msgbox) den vollständigen Namen aus, jedoch in Starofffice unter dem Menüpunkt "Extras / Makros / Makro" im Formularfenster "Makros aus" wird der einleitende Unterstrich weggelassen. In der Basic-Sprache bedeutet der Unterstrich meist ein Zeilen-Fortsetzungszeichen. Die Zeile wird nicht fortgesetzt, wenn das Underline-Zeichen nicht durch ein Leerzeichen vom Codewort getrennt ihm folgt. Wieder etwas dazugelernt.

Warum nicht gleich so? (dp) (0,5h)

Nachtrag_3 am 03.03.2008 um 23Uhr:
Soeben habe ich etwas entdeckt, was gleich nach vorne in meine Basic-Lehr- und Entwicklerseite gehört:
  • Falls man seine Variablen (z.B. mit DIM meinevariable AS MeineEigenschaft) deklariert, darf man es bei Basic irgendwo vor dem ersten Gebrauch, nur ist es ein schlechter Programmstil. Aber eins darf man nicht vergessen: hinter jede Variable gehört bei Basic die Bezeichnung "As MeineEigenschaft" dahinter und nicht nur am Ende einer Variablenliste. In einem solchen Fall "Dim ersteVariable, zweiteVariable, dritteVariable As String" wird nur dritteVariable als String deklariert, die übrigen beiden haben oder leiden unter der Eigenschaft Variant.
  • In Staroffice "Tabellendokument" kennt man, dass in den Tabellen die Realzahlen, wie im Deutschen üblich, mit Komma publiziert werden. In Wirklichkeit stehen sie im Programmspeicher als Realzahlen mit Punkt und die Kommadarstellung ist eine Stringdarstellung.

    Im folgenden Beispiel greife ich auf meine Vorlage des CuTiPot-pH_calc-Datenblatt zurück. Dort steht unter "Phosphoric acid" in der 5.Zeile (Zelle D5) die Zahl 0,06. Wie ein Vergleich mit Zeile 25 (Zelle D25) zeigt, steht sie dort in Exponentialschreibweise als 6,100E-02, also wird die dritte Stelle nach dem Komma nur hier aus optischen Gründen nicht dargestellt, ist aber dem Staroffice-Tabellenkalkulationsprogramm bekannt.

    Sub BeispielZellinhaltAlsKommaString
    Dim oSheet as Object
    rem
    oSheet = ThisComponent.CurrentController.ActiveSheet
    rem
    If (oSheet.getCellRangeByName("D5").getCellByPosition(0,0).String = "0,06") or _
    (oSheet.getCellRangeByName("D5").getCellByPosition(0,0).Value = 0.061) Then
    MsgBox "Zellinhalt = 0,061"
    else
    MsgBox "Zellinhalt =/= 0,061"
    end If
    End Sub


    Würde man hier nach einer Stringzahl mit Punkt oder als Realzahl mit Komma abfragen, würde es keine Übereinstimmung geben. Auch wenn in dem aktuellen Datenblatt die Zahl mit drei Nachkommastellen oder als gerundete Integerzahl dargestellt, kann man sie nicht als zweistellige Nachkommazahl finden.

(dp) (0,75h)

Linksammler:
Fortsetzung folgt
archiviert (tbid1973.376): (dp) 16.06.2009 (+0,1h (+flagcounter +home.icon +w3c_LiCh))
Haftungsausschluss
free counters
© drpagel.de Alle Rechte vorbehalten.