DrPagel-FavIcon
« »

Verfasst am 03.03.2008 13:34:32 Uhr
Funktionierende Starbasic-Makros Teil2
Fortsetzung vom 26.2.2008

Im ersten Teil habe ich mich geärgert, dass die Basic-Messagebox (analog zu Javascripts Alert-InfoBox) bei der Ausgabe von Methoden und Eigenschaften so mit Information überquilt, dass nicht alle Methoden auf dem PC-Monitor wiedergegeben werden können.

Der Grund ist, dass, um die Box zu verschieben, nur die oberste Zeile und nicht der komplette Bereich der Messagebox mit dem Mauszeiger angeklickt werden kann.

Im Dokument von Andrew Pitonayak) fand ich eine Idee, die ich modifiziert habe, damit sie auf meinem PC läuft. Dabei finde ich es wertvoll zu erfahren, wie oft ich noch auf den OK-Button klicken muss, d.h. wieviele Messageboxen mich noch von der übrigen Tagesarbeit aufhalten.

Erstmals probieren wollte ich, ob mir der Aufruf von Prozeduren oder Funktionen gelingt:
Sub ZeigeAlleEigenschaften
DIM oObj As Object
DIM sObjDbgList As string

oObj = createUnoService("com.sun.star.sheet.SpreadsheetDocument")

sObjDbgList = oObj.DBG_Properties

jlast = BoxenMaxanzahlErmitteln(sObjDbgList)
AlleMsgBoxenAusgeben(sObjDbgList,jlast)
End Sub


Anm.: Die hellgrün markierte Dienste-Bezeichnung kann man sich bei Bedarf manuell abändern. Die in dieser Prozedur aufgerufene Funktion und Prozedur stehen hinter der nachfolgenden Prozedur:

Sub ZeigeAlleMethoden
DIM oObj As Object
DIM sObjDbgList As string
DIM jlast As Integer

oObj = createUnoService("com.sun.star.sheet.SpreadsheetDocument")

sObjDbgList = oObj.DBG_methods

jlast = BoxenMaxanzahlErmitteln(sObjDbgList)
AlleMsgBoxenAusgeben(sObjDbgList,jlast)
End Sub


Anm.: Die hellgrün markierte Dienste-Bezeichnung kann man sich bei Bedarf manuell abändern.

Hier im Anschluss folgt die in beiden obenstehenden Prozeduren aufgerufene Funktion BoxenMaxanzahlErmitteln und danach die soeben benutzte Prozedur AlleMsgBoxenAusgeben. Solange beide (Funktion und Prozedur) unabhängig voneinander sind, ist die Reihenfolge ihrer Auflistung egal:
Function BoxenMaxanzahlErmitteln(sObjDbgList As String) As Integer
DIM sMsgBox As string
DIM i, j, jlast As Integer
DIM fs, ep As Integer

fs = 1
rem EOL = FALSE
j=0

While fs <= Len(sObjDbgList)
j=j+1
rem sMsgBox = "Blatt " & j & " von " & jlast & ":"& Chr$(13)
sMsgBox = ""
For i = 0 to 15
ep = InStr(fs, sObjDbgList, ";")
if ep = 0 then
ep = Len(sObjDbgList)
endif
sMsgBox = sMsgBox & Mid$(sObjDbgList, fs, ep - fs) & Chr$(13)
fs = ep + 1
Next i
rem MsgBox sMsgBox
Wend
BoxenMaxanzahlErmitteln=j
end function


Anm.: Wenn sich jemand den Namen der Funktion abändert, darf er nicht vergessen, auch den gleichnamigen Übergabewert am unteren Ende der Funktion umzubenennen.

Sub AlleMsgBoxenAusgeben(sObjDbgList As String,jlast As Integer)
fs = 1
j=0

While fs <= Len(sObjDbgList)
j=j+1
sMsgBox = "MsgBox " & j & " von " & jlast & ":"& Chr$(13)
rem sMsgBox = ""
For i = 0 to 15
ep = InStr(fs, sObjDbgList, ";")
if ep = 0 then
ep = Len(sObjDbgList)
endif
sMsgBox = sMsgBox & Mid$(sObjDbgList, fs, ep - fs) & Chr$(13)
fs = ep + 1
Next i
MsgBox sMsgBox
Wend
rem MaxBlattanzahlErmitteln=j
end Sub


Anm.: Diese Prozedur ähnelt der vorangehenden Funktion. Deswegen habe ich die unnötigen Codepassagen jeweils mit Rem blockiert.

Gut finde ich, dass diese beiden Zeige-Prozeduren in Starbasic ohne Parameter-Übergabe auskommen, weil sonst die Prozedur nicht läuft, wenn man besonders als Programmier-Anfänger nicht weiss, welche Eigenschaften und Methoden diese Parameter gehorchen müssen. Z.B. kenne ich zur Zeit noch garnicht alle Dienste-Bezeichnungen.

Und das Wichtigste zum Schluss: Bei der Anordnung von Basic-Prozeduren und Funktionen ist darauf zu achten, dass die aufgerufenen Funktion oder Prozedur hinter der aufrufenden Funktion oder Prozedur stehe. Die Pascal-Programmierer wissen, dass es dort genau umgekehrt ist.

Nun ist aller "Ärger von gestern" verflogen. (dp) (1,85h)

Nachtrag_1 am 3.3.2008 um 23.45Uhr:
Hier hatte ich wieder eine gute Idee, um von den ellenlangen verschachtelten Programmcodizes

If (oSheet.getCellRangeByName("myCell").getCellByPosition(0,0).String = "myString") then
Rem MyBasic-MacroCode-Sniplett
End If


...wegzukommen. Hierzu habe ich eine logische Funktion wie folgt kreiert:

Function existStringAtSheetnameCellname (Suchstring As String,Sheetname As String,Zellname As String) As Boolean
Dim oSheet as Object
existStringAtSheetnameCellname=false

rem MsgBox "Suchstring =: " &Suchstring,0
rem MsgBox "Sheetname =: " &Sheetname,0
rem MsgBox "Zellname =: " &Zellname,0
rem
if Sheetname="" then
oSheet = ThisComponent.CurrentController.ActiveSheet
else
oSheet = ThisComponent.Sheets().getByName(Sheetname)
end if
rem
If (oSheet.getCellRangeByName(Zellname).getCellByPosition(0,0).String = Suchstring) Then
existStringAtSheetnameCellname=True
end If
End Function


Ein möglicher
  • VBA-Code:
    IF Range("myCellname").Value <> "myString" THEN REM ...my VBA-Codesniplett ... ENDIF
    lässt so leichter umschreiben in einen ...
  • StarBasic-Code:
    IF NOT existStringAtSheetnameCellname("myString","","myCellname") Then REM ... my Starbasic-Codesniplett ... END IF
Ob mir ähnliche Idee auch bei Value (für INTEGER, DOUBLE, SINGLE ?, REAL ?, COMPLEX ?) gelingt, muss noch getestet werden. (dp) (0,25h)

Nachtrag_2 am 4.3.2008 um 20.45Uhr:
Bei meiner Vorlage (Excel-Programm CurTiFit) kann ich nicht überprüfen, ob der analoge Code so funktionieren soll:
  • VBA-Code:
    sub testefeld
    dim testfeld(3) as double
    testfeld(1)=1
    testfeld(2)=-10
    testfeld(3)=33000
    msgbox "Testfeld(1; 2; 3) = ("+testfeld(1)+" ; "+testfeld(2)+" ; "+testfeld(3)+")"
    call test1
    end sub

    sub test1()
    msgbox "Test1: Testfeld(1; 2; 3) = ("+testfeld(1)+" ; "+testfeld(2)+" ; "+testfeld(3)+")"
    end sub
Unter meinem Staroffice funktioniert es aber wie folgt:
  • StarBasic-Code:
    sub testefeld
    dim testfeld(3) as double
    testfeld(1)=1
    testfeld(2)=-10
    testfeld(3)=33000
    msgbox "Testfeld(1; 2; 3) = ("+testfeld(1)+" ; "+testfeld(2)+" ; "+testfeld(3)+")"
    call test1(testfeld())
    end sub

    sub test1(testfeld as double)
    REM dim testfeld(3) as double
    msgbox "Test1: Testfeld(1; 2; 3) = ("+testfeld(1)+" ; "+testfeld(2)+" ; "+testfeld(3)+")"
    end sub
Würde ich den VBA-Code einfach übernehmen oder aber zusätzlich die REM-Sequenz entfernen, dann zeigt die Messagebox in der aufgerufenen Prozedur nur Nullen als Werte. (dp) (0,25h)
archiviert (tbid1986.379): (dp) 18.05.2009 (+0,1h (+flagcounter +home.icon +w3c_LiCh +4navi))
Haftungsausschluss
free counters
© drpagel.de Alle Rechte vorbehalten.