Listener Probleme: Selektionen in einem Bereich überwachen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Maggus
****
Beiträge: 108
Registriert: Mo, 01.08.2005 13:32
Kontaktdaten:

Listener Probleme: Selektionen in einem Bereich überwachen

Beitrag von Maggus »

Hallo,

Folgendes möchte ich erreichen:
Wenn in einem festgelegtem Sheet in Spalte A ein zusammenhängender Bereich markiert wird, soll eine Prozedur gestartet werden.

Nun habe ich das mit dem XSelectionChangeListener versucht, aber ich scheitere daran, dass die Prozedur gestartet wird bevor ich beim Selektieren die Maustaste loslasse. Die Prozedur sollte erst starten, wenn der gewünschte Bereich markiert ist. Muss ich da vielleicht einen anderen Listener nehmen?

Weiteres Problem: es scheint, dass ich mit dem XSelectionChangeListener alle Sheets überwache, eine Eingrenzung für einen festgelegten Bereich habe ich nicht gefunden. Das könnte ich zwar in meiner Sub selectionCheck_selectionChanged abfangen, aber das scheint auf die Performance zu gehen.

Noch ein Problem: das mit dem Anhalten des Listeners funktioniert nach dem Öffnen der Datei, aber nach bisschen rumspielen irgendwann nicht mehr. Ist der Code nicht sauber?

HIer mein Code:

Code: Alles auswählen

Global selChange as Object 'Der Listener
Global ListenerAlreadyAdded as Boolean 'Listener nicht mehrmals starten

Sub start_listener
  If ListenerAlreadyAdded Then Exit Sub
  selChange = createUnoListener("selectionCheck_", "com.sun.star.view.XSelectionChangeListener")
  oDoc = ThisComponent
    oDoc.getCurrentController.addSelectionChangeListener(selChange) 
    ListenerAlreadyAdded = True
    MsgBox "Listener added"
End Sub

Sub stop_listener
  If isNull(selChange) Then Exit Sub
  oDoc = ThisComponent
  oDoc.getCurrentController.removeSelectionChangeListener(selChange)
  MsgBox "Listener removed"
  ListenerAlreadyAdded = False
End Sub


Sub selectionCheck_selectionChanged(oEvent)
  oDoc = ThisComponent
  oSel = oDoc.getCurrentSelection()

  If oSel.supportsService("com.sun.star.sheet.SheetCell") Then
    'MsgBox "Eine Zelle markiert"    
  Elseif oSel.supportsService("com.sun.star.sheet.SheetCellRange") Then
    'MsgBox "Ein Bereich wurde markiert"
    If oSel.RangeAddress.StartColumn = 0 And oSel.RangeAddress.EndColumn = 0 Then
      exportHTML()
    End If
  Elseif oSel.supportsService("com.sun.star.sheet.SheetCellRanges") Then
    'MsgBox "Mehrere Bereiche wurden markiert"                        
  End If
End Sub

Sub exportHTML
  MsgBox "Prozedur gestartet"
End Sub
OpenOffice.org 3.0.0 auf Red Hat Enterprise Linux Client release 5.2 (Tikanga)
Maggus (:o)
Maggus
****
Beiträge: 108
Registriert: Mo, 01.08.2005 13:32
Kontaktdaten:

Re: Listener Probleme: Selektionen in einem Bereich überwach

Beitrag von Maggus »

Da hier anscheinend keiner eine Lösung hat, starte ich die Prozedur nun mit einem Button. Schade eigentlich... :(

Falls doch noch jemand einen Tipp hat, ich würd mich freuen.

Grüße,
Maggus (:o)
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Listener Probleme: Selektionen in einem Bereich überwach

Beitrag von DPunch »

Aloha

Ich sehe für Dein sehr spezielles Anliegen keine sinnvollere Lösung als einen Button (oder auch ein Tastenkürzel).
Maggus hat geschrieben:Die Prozedur sollte erst starten, wenn der gewünschte Bereich markiert ist.
Woher soll der Listener denn wissen, wann tatsächlich der "gewünschte" Bereich markiert ist? Vielleicht ist eine Zelle zuviel/zuwenig markiert?
Die Arbeit mit einem Listener, der dann ohne Möglichkeit der Korrektur einfach mal losfeuert, stelle ich mir im täglichen Betrieb unheimlich nervig vor.
Maggus hat geschrieben:dass ich mit dem XSelectionChangeListener alle Sheets überwache, eine Eingrenzung für einen festgelegten Bereich habe ich nicht gefunden.
Der Zellbereich selber weiss nicht, ob er selektiert wurde oder nicht und kann demzufolge auch keine entsprechende Rückmeldung geben.
Derartige Dinge kann Dir nur der Controller signalisieren, und der erstreckt sich nunmal über das ganze Dokument.
Maggus hat geschrieben:das mit dem Anhalten des Listeners funktioniert nach dem Öffnen der Datei, aber nach bisschen rumspielen irgendwann nicht mehr.
Das tritt vor allem dann auf, wenn man zwischendurch am Code rumdoktort, selten im ganz normalen Betrieb.

Abgesehen davon wird jedoch wärmstens empfohlen, jedem Listener die Methode "disposing" zur Verfügung zu stellen.

Code: Alles auswählen

Sub selectionCheck_disposing
  REM Hier muss nichts getan werden
End Sub
Maggus
****
Beiträge: 108
Registriert: Mo, 01.08.2005 13:32
Kontaktdaten:

Re: Listener Probleme: Selektionen in einem Bereich überwach

Beitrag von Maggus »

Hallo DPunch,

Danke für deine Antwort und die Tipps bezüglich der disposing Methode und dem Anhalten des Listeners.
DPunch hat geschrieben: Ich sehe für Dein sehr spezielles Anliegen keine sinnvollere Lösung als einen Button (oder auch ein Tastenkürzel). ... Die Arbeit mit einem Listener, der dann ohne Möglichkeit der Korrektur einfach mal losfeuert, stelle ich mir im täglichen Betrieb unheimlich nervig vor.
Also ich baue eine in der Handhabung bewährte Exceldatei um. Der nun eingebaute Button verlangsamt eben das Arbeiten damit.
DPunch hat geschrieben: Der Zellbereich selber weiss nicht, ob er selektiert wurde oder nicht und kann demzufolge auch keine entsprechende Rückmeldung geben.
Derartige Dinge kann Dir nur der Controller signalisieren, und der erstreckt sich nunmal über das ganze Dokument.
Ja, ok, da hab ich mich wohl undeutlich ausgedrückt. Wie soll ich das beschreiben...? Also egal, was wo markiert wird, geht das extrem auf die Performance, weil bei jeder Markierungsänderung ja eine Prüfung erfolgt. Aber eigentlich interessieren nur Markierungen in Spalte A. Keine Ahnung, wie das umzusetzen ist, jedenfalls habe ich die Performance Probleme in meiner Exceldatei nicht.
DPunch hat geschrieben: Woher soll der Listener denn wissen, wann tatsächlich der "gewünschte" Bereich markiert ist? Vielleicht ist eine Zelle zuviel/zuwenig markiert?
Das ist ja genau das, was ich gern wissen möchte. Wie kann ich das dem Listener klarmachen, dass der gewünschte Bereich erst dann markiert ist, wenn ich meine Maustaste loslasse? Bei falscher Markierung kann ja in meinem Fall der aufpoppende Dialog einfach geschlossen werden. Hier mal der Code, wie einfach das mit VBA funktioniert:

Code: Alles auswählen

Private Sub Worksheet_SelectionChange()
On Error Resume Next
  If Selection.Column = "1" And Selection.Columns.Count = 1 And _
  Selection.Count > 1 And Selection.Areas.Count = 1 Then
    UserForm1.Show
  End If
End Sub
Ich bin sicher, da gibts auch eine Lösung für Basic.

Grüße,
Maggus (:o)
Antworten