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
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:
archiviert (tbid1986.379): (dp) 18.05.2009 (+0,1h (+flagcounter +home.icon +w3c_LiCh +4navi)) | ||||||