Seite 1 von 1

Re: Listener in Calc entfernen

Verfasst: So, 12.02.2012 17:14
von Stephan
an Der von Dir geposteten Stelle steht wie man den Listener entfernt! Warum fragst Du das überflüssiger WEise hier?

Code: Alles auswählen

Sub RmvListener
CellRng.removeModifyListener(oListener)
End Sub

Gruß
Stephan

Re: Listener in Calc entfernen

Verfasst: So, 12.02.2012 18:42
von Stephan
Diese Routine kann ich als Event einfügen beim Schließen des Dokuments.
Nein. Höchstens kannst du sie dem Schließen-Event zuordnen, das Makro selbst versteht sich hier jedoch nicht als Event.
Wenn ich Sie aber ausführen möchte bekomme ich folgenden Fehler:

"BASIC Laufzeitfehler. Objektvariable nicht belegt".
Naja, dann wird halt eine Objektvariable nicht belegt sein weil LO nicht mit der DEklaration zurechtkommt.

Nimm statt:

Code: Alles auswählen

Private oListener as Object
Private CellRng as Object
die Deklaration:

Code: Alles auswählen

Global oListener as Object
Global CellRng as Object
oder:

Code: Alles auswählen

Public oListener as Object
Public CellRng as Object
Es muss also irgendwie anders gehen.
Nein.





GRuß
Stephan

Re: Listener in Calc entfernen

Verfasst: Mi, 15.02.2012 22:52
von balu
Hallo BastiL,
beide deiner Vorschläge ändern nichts:
Wo dran mag das wohl liegen?

In Sub RmvListener ist CellRng nicht bekannt. Wie kann ich da weitermachen?
Weder Stephan, noch ich, haben Glaskugeln mit Magischen fähigkeiten. Also ist nichts mit Hilfe.

Mein Makro sieht ähnlich aus wie im Link.
Ah ja!
Ähnlich ist nicht gleichzusetzen wie identisch, das sind zwei verschiedene Paar Schuh. Also würde ich dir dringend empfehlen eine Beispieldatei hier anzuhängen, denn nur so können wir hier nachschauen wo es bei dir hakt.

Aber eine Frage hätte ich da noch.
Hast Du auch die dementsprechenden Subs bei
- Extras
- Anpassen
-- Ereignisse
richtig zugeordnet?



Gruß
balu

Re: Listener in Calc entfernen

Verfasst: Mi, 15.02.2012 23:27
von balu
Hallo BastiL,
Diese Routine kann ich als Event einfügen beim Schließen des Dokuments.
Was meinst Du denn ganz genau?

a)
Dokument wird geschlossen

b)
Dokument geschlossen



Gruß
balu

Re: Listener in Calc entfernen

Verfasst: Do, 16.02.2012 06:47
von Stephan
In Sub RmvListener ist CellRng nicht bekannt.
das ist mir vollens unverständlich da Du selbst ja den Code gepostet hast (http://user.services.openoffice.org/en/ ... 45&t=30071) der CellRng ein Object zuweist:

Code: Alles auswählen

CellRng = Sheet.getCellrangeByName("A1:A10")
und da dieser Code Bestandtei des Makros ist, welches den Listener registriert muß CellRng später auch existieren, sofern CellRng als Variable mit ausreichendem Gültigkeitsbereich registriert ist.
Wie kann ich da weitermachen? Was für Debugging-Möglichkeiten gibt es da?
Das waa man üblicherweise tut - die genaue Schreibweise von CellRng überprüfen um sicherzustellen das diese in:

Code: Alles auswählen

CellRng = Sheet.getCellrangeByName("A1:A10")
und:

Code: Alles auswählen

CellRng.removeModifyListener(oListener)
gleich ist, sowie die richtige DEklaration von CellRng nochmals prüfen.



Gruß
Stephan

Re: Listener in Calc entfernen

Verfasst: Do, 16.02.2012 08:38
von Karolus
Hallo
Soweit ich weiss***, wird 'olistener'
  • a. mit der Methode .removeModifyListener nicht völlig entfernt, sondern man kann damit nur verhindern, in eine Endlosrekursion zu laufen, falls das per Listener aufgerufe Makro seinerseits Änderungen in 'CellRng' durchführt.
    b. Muss man den Fehler mit 'on Error resume next' unterdrücken.
siehe Beispiel:

Code: Alles auswählen

Sub RmvListener
on Error resume next
	CellRng.removeModifyListener(oListener)	
End Sub

Sub CalledRoutine
	
	Doc = ThisComponent
	Sheet = Doc.Sheets.getByIndex(0)
	Cell = Sheet.getCellByPosition(2,1)
	CurrentVal = Cell.Value
	Cell.Value = CurrentVal + Sheet.getCellByPosition(0,1).value
	
	RmvListener  'ansonten würde die Zeile unten eine Endlosrekursion aus lösen
	
	Sheet.getCellByPosition(0,1).string = ""
End Sub


***Leider weiß ich momentan nicht wo ich das her hab.

Gruß Karo

Re: Listener in Calc entfernen

Verfasst: Do, 16.02.2012 09:07
von Stephan
Soweit ich weiss***, wird 'olistener'
a. mit der Methode .removeModifyListener nicht völlig entfernt, sondern man kann damit nur verhindern, in eine Endlosrekursion zu laufen, falls das per Listener aufgerufe Makro seinerseits Änderungen in 'CellRng' durchführt.
Mmmh ... ich kann nichts dergleichen feststellen.

Wie ich bereits geschrieben hatte muß mal mit richtigem Gültigkeitsbereich deklarieren und bei mir funktioniert:

Code: Alles auswählen

Global oListener as Object
Global CellRng as Object
ohne Probleme in OOo 3.3.0. (Beispieldatei anhängend)

Warum das bei BastiL nicht funktioniert ist mir derzeitig unklar.



Gruß
Stephan

Re: Listener in Calc entfernen

Verfasst: Do, 16.02.2012 09:39
von Karolus
Hallo
Ja, funktioniert hier ebenfalls.

...
Anscheinend hab ich den Fehler gemacht, nach der Umdeklaration von 'Privat' auf 'Global' das Dokument nicht zu speichern und zu schliessen ?

Karo