von Mr.Ed » So, 14.08.2011 15:04
Hallo DPunch, hallo andere Leser,
einiges habe ich schon verstanden, zum Beispiel dass jeder Listener am Ende geschlossen werden muss. In meinem Code-Schnipsel oben vom 13. August habe ich das für den Event-Listener mark_ gemacht. Das war Unsinn. Stattdessen muss ich natürlich Methoden für das Ereignis window(closing), also den Listener top_ schreiben. Beim ordnungsgemäßen Verlassen des Programms, entweder durch den O.K.-Button oder durch Anklicken des "x" im Statusbalken des Dialogfensters wird nun das Programm beendet, auch der Event-Listener wird deaktiviert. Mein Code sieht jetzt so aus:
Code: Alles auswählen
Option explicit
Global oDlg as Object
Global oWinListener as Object
Global oAktListener as Object
Dim oEvent as Object
Dim lgPos1 as Long, lgPos2 as Long
[... snip]
REM Aktionen des Action Listeners "mark_"
Sub mark_actionPerformed(oEvent)
Dim oDoc1 as Object, oViewC as Object
oDoc1 = ThisComponent
Fn_Nebensaetze_finden
oViewC = oDoc1.getCurrentController().getViewCursor()
oViewC.goRight(1, false)
lgPos1 = oViewC.getPosition.y() - oViewC.getPosition.x()
lgPos2 = oViewC.getPosition.y() - oViewC.getPosition.x()
wait 5000
oViewC = oDoc1.getCurrentController().getViewCursor()
lgPos2 = oViewC.getPosition.y() - oViewC.getPosition.x()
Do while Not isNull(oViewC.string)
If oViewC.string <> "" Then
lgPos1 = oViewC.getPosition.y() - oViewC.getPosition.x()
oViewC.CharWeight = com.sun.star.awt.FontWeight.BOLD
oViewC.CharColor = &HFF00D9
If lgPos1 = lgPos2 Then
wait 1000
oViewC = oDoc1.getCurrentController().getViewCursor()
lgPos2 = oViewC.getPosition.y() - oViewC.getPosition.x()
End If
Else
Exit Do
End If
Loop
End Sub
sub top_windowClosing()
oDlg.getControl("But1").removeActionListener(oAktListener)
oDlg.removeTopWindowListener(oWinListener)
oDlg.setVisible(false)
End Sub
sub top_windowActivated()
'dummy
End Sub
sub top_windowDeactivated()
'dummy
End Sub
Ich habe zur Steuerung zwei Variablen lgPos1 und lgPos2 (lg für "long") eingeführt. Sie sollen anhand der jeweiligen Positionen des ViewCursors bei der Steuerung dessen helfen, was in der Do-Loop-Schleife passiert. Insbesondere sollen sie überwachen, ob der Benutzer die Cursorposition ändert, und dann die entsprechenden Aktivitäten einleiten. Das klappt aber nicht, hängt wohl nicht mit den Listenern zusammen, sondern damit, dass im Ablauf der Schleife und der Bedingungsabfragen logische Fehler enthalten sind.
So etwas lässt sich ja prinzipiell gut mit der Debug-Funktionalität überwachen. Einfach am Beginn der Schleife einen Haltepunkt setzen und per Beobachter schauen, welche Werte lgPos1 und lgPos2 jeweils annehmen. Dabei habe ich aber das Problem, dass ich aus dem Debug-Modus meist nur sehr mühselig wieder herauskomme: Auch wenn ich die Variablen aus dem Beobachter herausnehme und den Haltepunkt lösche, bleibt das Programm für weitere Läufe im Beobachtungsmodus. Erst nachdem ich alle OO-Programme vollkommen geschlossen und dann wieder neu gestartet habe, ist wieder ein "normaler" Programmablauf möglich.
Dann habe ich noch eine Frage zur globalen Variablen oEvent. Sie taucht außer bei ihrer Deklaration nur einmal auf, im Kopf der Methode, die auf Veranlassung des Event-Listeners "Sub mark_actionPerformed(oEvent)" ausgelöst wird. Ich habe damit kein großes Problem, es stört mich aber, wenn ich Dinge mache, von denen ich nicht verstehe, wozu sie gut sind.
Hoffentlich ist dies nicht zu viel Text. Vielleicht habt ihr aber die eine oder andere Anregung für mich! Ich freue mich darauf, denn Lernen macht ja Spaß, oder?
MfG Mr.Ed
Hallo DPunch, hallo andere Leser,
einiges habe ich schon verstanden, zum Beispiel dass jeder Listener am Ende geschlossen werden muss. In meinem Code-Schnipsel oben vom 13. August habe ich das für den Event-Listener mark_ gemacht. Das war Unsinn. Stattdessen muss ich natürlich Methoden für das Ereignis window(closing), also den Listener top_ schreiben. Beim ordnungsgemäßen Verlassen des Programms, entweder durch den O.K.-Button oder durch Anklicken des "x" im Statusbalken des Dialogfensters wird nun das Programm beendet, auch der Event-Listener wird deaktiviert. Mein Code sieht jetzt so aus:
[code]Option explicit
Global oDlg as Object
Global oWinListener as Object
Global oAktListener as Object
Dim oEvent as Object
Dim lgPos1 as Long, lgPos2 as Long
[... snip]
REM Aktionen des Action Listeners "mark_"
Sub mark_actionPerformed(oEvent)
Dim oDoc1 as Object, oViewC as Object
oDoc1 = ThisComponent
Fn_Nebensaetze_finden
oViewC = oDoc1.getCurrentController().getViewCursor()
oViewC.goRight(1, false)
lgPos1 = oViewC.getPosition.y() - oViewC.getPosition.x()
lgPos2 = oViewC.getPosition.y() - oViewC.getPosition.x()
wait 5000
oViewC = oDoc1.getCurrentController().getViewCursor()
lgPos2 = oViewC.getPosition.y() - oViewC.getPosition.x()
Do while Not isNull(oViewC.string)
If oViewC.string <> "" Then
lgPos1 = oViewC.getPosition.y() - oViewC.getPosition.x()
oViewC.CharWeight = com.sun.star.awt.FontWeight.BOLD
oViewC.CharColor = &HFF00D9
If lgPos1 = lgPos2 Then
wait 1000
oViewC = oDoc1.getCurrentController().getViewCursor()
lgPos2 = oViewC.getPosition.y() - oViewC.getPosition.x()
End If
Else
Exit Do
End If
Loop
End Sub
sub top_windowClosing()
oDlg.getControl("But1").removeActionListener(oAktListener)
oDlg.removeTopWindowListener(oWinListener)
oDlg.setVisible(false)
End Sub
sub top_windowActivated()
'dummy
End Sub
sub top_windowDeactivated()
'dummy
End Sub[/code]
Ich habe zur Steuerung zwei Variablen lgPos1 und lgPos2 (lg für "long") eingeführt. Sie sollen anhand der jeweiligen Positionen des ViewCursors bei der Steuerung dessen helfen, was in der Do-Loop-Schleife passiert. Insbesondere sollen sie überwachen, ob der Benutzer die Cursorposition ändert, und dann die entsprechenden Aktivitäten einleiten. Das klappt aber nicht, hängt wohl nicht mit den Listenern zusammen, sondern damit, dass im Ablauf der Schleife und der Bedingungsabfragen logische Fehler enthalten sind.
So etwas lässt sich ja prinzipiell gut mit der Debug-Funktionalität überwachen. Einfach am Beginn der Schleife einen Haltepunkt setzen und per Beobachter schauen, welche Werte lgPos1 und lgPos2 jeweils annehmen. Dabei habe ich aber das Problem, dass ich aus dem Debug-Modus meist nur sehr mühselig wieder herauskomme: Auch wenn ich die Variablen aus dem Beobachter herausnehme und den Haltepunkt lösche, bleibt das Programm für weitere Läufe im Beobachtungsmodus. Erst nachdem ich alle OO-Programme vollkommen geschlossen und dann wieder neu gestartet habe, ist wieder ein "normaler" Programmablauf möglich.
Dann habe ich noch eine Frage zur globalen Variablen oEvent. Sie taucht außer bei ihrer Deklaration nur einmal auf, im Kopf der Methode, die auf Veranlassung des Event-Listeners "Sub mark_actionPerformed(oEvent)" ausgelöst wird. Ich habe damit kein großes Problem, es stört mich aber, wenn ich Dinge mache, von denen ich nicht verstehe, wozu sie gut sind.
Hoffentlich ist dies nicht zu viel Text. Vielleicht habt ihr aber die eine oder andere Anregung für mich! Ich freue mich darauf, denn Lernen macht ja Spaß, oder?
MfG Mr.Ed