Den Fehler habe ich gefunden und hier eine funktionierende Version geschrieben:
Code: Alles auswählen
REM ***** BASIC *****
Global oDocView As Object
Global oMouseClickHandler As Object
Global Anzahl as long
Sub RegisterMouseClickHandler
oDocView = ThisComponent.currentController
oMouseClickHandler = _
createUnoListener("MyApp_", "com.sun.star.awt.XMouseClickHandler")
' writedbginfo oMouseClickHandler
oDocView.addMouseClickHandler(oMouseClickHandler)
End Sub
Sub UnregisterMouseClickHandler
on error resume next
oDocView.removeMouseClickHandler(oMouseClickHandler)
on error goto 0
End Sub
sub CheckBox1
Dim LightRed as Long, Green5 as Long, a as Boolean, b as String, c as String, d as Long
LightRed = 16711680
Green5 = 44544
a = ThisComponent.DrawPage.Forms.getByIndex(0).GetByName("Check Box 1").State
if a then
RegisterMouseClickHandler
b = "registered"
c = "Click here to unregister the page."
d = Green5
else
UnregisterMouseClickHandler
b = "unregistered"
c = "Click here to register the page."
d = LightRed
end if
ThisComponent.DrawPage.Forms.getByIndex(0).GetByName("Check Box 1").Label = b
ThisComponent.DrawPage.Forms.getByIndex(0).GetByName("Check Box 1").helptext = c
ThisComponent.DrawPage.Forms.getByIndex(0).GetByName("Check Box 1").backgroundcolor = d
end sub
Sub MyApp_disposing(oEvt)
End Sub
Function MyApp_mousePressed(oEvt) As Boolean
MyApp_mousePressed = False
End Function
Function MyApp_mouseReleased(oEvt) As Boolean
Anzahl = oEvt.ClickCount
ThisComponent.DrawPage.Forms.getByIndex(0).GetByName("LabelAnzahl").Label = "ClickCount = " & Anzahl
if Anzahl = 1 then VerteilerSub
End Function
sub VerteilerSub
dim ZeitGewartet as long
ZeitGewartet = 0
Sprung1:
wait(300)
ZeitGewartet = ZeitGewartet + 300
select case Anzahl
case 1
mSubForSingleClick
case 2
if ZeitGewartet = 300 then goto Sprung1
mSubForDoubleClick
case 3
if ZeitGewartet < 900 then goto Sprung1
mSubFuerDreifachesKlicken
case 4
if ZeitGewartet < 1200 then goto Sprung1
mSubFuerVierfachesKlicken
case 5
if ZeitGewartet < 1500 then goto Sprung1
mSubFuerFuenffachesKlicken
case 6
if ZeitGewartet < 1800 then goto Sprung1
mSubFuerSechsfachesKlicken
case 7
if ZeitGewartet < 2100 then goto Sprung1
mSubFuerSiebenfachesKlicken
case is > 7
if ZeitGewartet < 2400 then goto Sprung1
mSubFuerAchtUndMehrfachesKlicken
end select
end sub
sub mSubForSingleClick
print "mSubForSingleClick"
end sub
sub mSubForDoubleClick
print "mSubForDoubleClick"
end sub
sub mSubFuerDreifachesKlicken
print "mSubFuerDreifachesKlicken"
end sub
sub mSubFuerVierfachesKlicken
print "mSubFuerVierfachesKlicken"
end sub
sub mSubFuerFuenffachesKlicken
print "mSubFuerFuenffachesKlicken"
end sub
sub mSubFuerSechsfachesKlicken
print "mSubFuerSechsfachesKlicken"
end sub
sub mSubFuerSiebenfachesKlicken
print "mSubFuerSiebenfachesKlicken"
end sub
sub mSubFuerAchtUndMehrfachesKlicken
print "mSubFuerAchtUndMehrfachesKlicken"
end sub
Vielen Dank für deine Hilfe,
Karolus.
Wenn du aber schreibst:
Du kannst nur dafür sorgen das die Funktion beim ersten Klick nur False zurückgibt
muss ich widersprechen, weil keines meiner Makros die Funktion aufruft, geschweige denn auswertet. Es sind die verborgenen Programmteile - damit meine ich die Programmteile, welche die Hersteller des BASIC-Interpreters geschrieben haben - welche die Funktion
"MyApp_mouseReleased(oEvt)" aufrufen. Die Zuweisung:
MyApp_mouseReleased = False
kam zwar auch in meiner Version vor, aber nur deswegen, weil ich sie in einem Beispiel von einem anderen Programmierer gefunden hatte und damals nicht wusste, ob die verborgenen Programmteile sie benötigten oder nicht. Ich habe mir gedacht, daß es nicht so schädlich seine konnte, sie da zu belassen.
Die Anfrage: "if Anzahl = 1" ist auch deswegen zwecklos, weil die Zuweisung
MyApp_mouseReleased = False
ohnehin am Ende der Sub in deiner Version durchgeführt wird.
Nein.
Die Lösung besteht darin, eine Verteiler-Prozedur schon dann aufrufen zu lassen, wenn die verborgenen Programmteile
MyApp_mouseReleased das allerersten mal aufrufen.
Rufen die verborgenen Programmteile
MyApp_mouseReleased später ein zweites, drittes, ... hundertfaches mal, dann wird keine meiner sichtbaren Prozeduren mehr durch
MyApp_mouseReleased aufgerufen. Diese Funktion beschränkt sich dann darauf, die globale Variable
Anzahl nach oben zu verändern.
Meine Verteilerprozedur ist es dann, welche Anzahl wiederholt abliest, eventuell ein wenig wartet, dann sie wieder abliest, bis sie sicher ist, dass sie durch
MyApp_mouseReleased nicht mehr verändert wird. Dann ruft
VerteilerSub die ausfühjrende Prozedur ab, die dem endgültigen Wert von
Anzahl entspricht.
In meinem Beispiel habe ich mich auf ein Maximum von siebenfachem Klicken beschränkt, aber könnte auch viel mehr. Einmal habe ich sogar ein 170-faches Klicken bewirkt. Werte natürlich, die in der Praxis kaum von Nutzen sein dürften, die mir aber geholfen haben, die Arbeitsweise der verborgenen Programmteile zu verstehen.
An Balu:
Vielen Dank auch dir, Balu, für deine Hilfe. An der Adresse
viewtopic.php?f=18&t=60995 wirst du dich hoffentlich überzeugen können, daß die Hersteller von BASIC für OO sich die Mühe gemacht haben, den Benutzern zu erlauben, ENDIF wegzulassen (ELSE ohnehin), wenn die Ausführung in derselben Zeile der Abfragung geschieht. Heute habe ich gelernt, daß man ohne ENDIF sogar mehrere Anweisungen durchführen kann, wenn man sie durch einen Doppelpunkt trennt und damit man alle in die Zeile der Abfragung stopft. Eine absolut korrekte Verfahrensweise.
Zu deiner Frage:
Am Makroanfang und in der Function deklarierst Du die Variable Anzahl unterschiedlich. Einmal als String und einmal als Variant. Wäre es nicht besser wenn Du das noch mal überarbeitest?
Ja. Für dich wäre es besser gewesen, wenn ich penibler gearbeitet hätte. Für mich wäre es schlechter gewesen, weil mir das Zeit gekostet hätte, die ich nicht zur Verfügung hatte. Es war ohnehin absolut klar, dass es für die Ausführung meiner Makros vollkommen irrelevant war, da damals Anzahl nur durch MyApp_mouseReleased(oEvt) gesetzt und abgefragt wurde und dort war es zwar nicht sehr elegant aber praktisch vollkommen egal, wenn Anzahl auch global deklariert wurde. In der neuen Version wird Anzahl nur als globale Variable definiert und damit ist nicht nur die praktische Wirkung, sondern auch die peniblere Betrachtungsweise befriedigt.
Zu deiner Frage:
Wo hast Du diese Änderungen vorgenommen?
In den Versuchen, die ich deinetwegen gemacht habe, obwohl ich von deren Überflüssigkeit überzeugt war.
Zu der Frage:
Sehe ich das richtig, das Du mit der CheckBox einen Zähler konstruieren willst?
Ich wollte ursprünglich eine Art Transkriptions-Programm schreiben. Man kann Schreibmarken der Art 01h23m51s oder #01:23:51-7# schreiben. Dann klickt man einfach oder doppelt auf die Zeitmarke und ruft man damit VLC an der durch die Zeitmarke angegebenen Stelle ab.
Dadurch, daß man die Wahl zwischen einfachem, doppeltem, dreifachen, etc. Klick hat, hat man auch die Möglichkeit, dem Benutzer die Wahl anzubieten, ob er das Video bis zur nächsten Zeitmarke, bis zum Ende, mit einer kurzen, mittleren oder langen Rückspülung, etc. abspielen will. Es gibt unendliche Möglichkeiten.
Das Transkriptionsprogramm ist seinerseits ein Mittel, um Sozialpsychologische Probleme wie Schimmelpilzwahn, Meldewahn, Zwangsschulwahn, Reptiloidenwahn, etc. zu behandeln.
Wollt ihr mitmachen?