[gelöst:] Eigenschaft oder Methode nicht gefunden: $(ARG1)

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

Moderator: Moderatoren

Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

[gelöst:] Eigenschaft oder Methode nicht gefunden: $(ARG1)

Beitrag von Mr.Ed »

Hallo allerseits,

ich versuche mithilfe eines zur Laufzeit erzeugten Dialogs einen Text zu bearbeiten. Hier der Code:

Code: Alles auswählen

Option explicit
Global oDlg as Object
Global oWinListener as Object
Global oAktListener as Object
Dim oEvent as Object

REM  *****  BASIC  *****

Sub Kommafehler_markieren
	dim oDlgM as Object  ' das Model des Dialoges
	dim oMod as Object   ' nimmt jeweils das Model der Elemente auf
	dim oWin as Object   ' erzeugtes Fenster
REM Das Dialogmodel erzeugen:
	oDlgM = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
REM Eigenschaften zuweisen
	With oDlgM
		.setPropertyValue("Width",  180)
		.setPropertyValue("Height", 40)
		.setPropertyValue("Title", "Laufzeitdialog")
	End With
REM einen Button erzeugen
	oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlButtonModel")
REM die Eigenschaften setzen
	With oMod
		.setPropertyValue("Label", "Fehlerstelle suchen!")
		.setPropertyValue("PositionX", 5)
		.setPropertyValue("PositionY", 10)
		.setPropertyValue("Height", 20)
		.setPropertyValue("Width",  75)
		.setPropertyValue("HelpText",  "Den nächsten Kommafehler finden!")
		.setPropertyValue("MultiLine", true)
	End With
REM und dem Dialogmodel zuweisen
	oDlgM.insertByName("But1", oMod)
REM Ende-Button erzeugen
	oMod = oDlgM.createInstance("com.sun.star.awt.UnoControlButtonModel")
REM die Eigenschaften setzen
	With oMod
		.setPropertyValue("Label", "Programm abbrechen")
		.setPropertyValue("PositionX", 100)
		.setPropertyValue("PositionY", 10)
		.setPropertyValue("Height", 20)
		.setPropertyValue("Width",  75)
		.setPropertyValue("HelpText",  "Programm beenden, um manuell Änderungen am Text vorzunehmen!")
		.setPropertyValue("MultiLine", true)
		.setPropertyValue("PushButtonType", com.sun.star.awt.PushButtonType.OK)
	End With
REM und dem Dialogmodel zuweisen
	oDlgM.insertByName("But2", oMod)
REM den Dialog erzeugen
	oDlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
	oDlg.setModel(oDlgM)
REM ein Fenster erzeugen und den Dialog zuweisen
	oWin = CreateUnoService("com.sun.star.awt.Toolkit")
	oDlg.createPeer(oWin, null)
REM Listener erzeugen
	oAktListener = createUnoListener("mark_", "com.sun.star.awt.XActionListener")
	oDlg.getControl("But1").addActionListener(oAktListener)
	oWinListener = createUnoListener("top_", "com.sun.star.awt.XTopWindowListener")
	oDlg.addTopWindowListener(oWinListener)
Rem Dialog sichtbar machen
	oDlg.setvisible(true)	
End Sub

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)
	Do while Not isNull(oViewC.string)
		wait(5000)
		oViewC = oDoc1.getCurrentController().getViewCursor()		
		If oViewC.string <> "" Then
			oViewC.CharWeight = com.sun.star.awt.FontWeight.BOLD
			oViewC.CharColor = &HFF00D9
		Else
			Exit Do
		End If
	Loop
	oDlg.getControl("But1").removeActionListener(oAktListener)
	oDlg.removeTopWindowListener(oWinListener)
	oDlg.setvisible(false)
'	oDlg.endExecute()
End Sub
Die Funktion "Fn_Nebensaetze_finden" läuft korrekt und findet bestimmte Textstellen (Writer-Dokument), an denen ich als Benutzer mithilfe des Cursors Wörter markieren kann, die dann fett und farbig markiert werden sollen. Das Problem liegt offenbar in der Do-Loop-Schleife. Wenn ich 5 s lang nichts unternehme, wird die Schleife verlassen, die Listener werden beendet und das Programm bricht auftragsgemäß ab. Wenn ich aber die Wartezeit wait(5000) nutze und während dessen ein bestimmtes Wort im Text markiere, werden die Zeilen unter der Bedienung (if - end if) zunächst nicht ausgeführt, obwohl ja die Bedingung (oViewC.string <> "") erfüllt sein müsste.

Es wird aber auch nicht der else- Zweig ausgeführt, das Programm wird also nicht ordnungsgemäß beendet, insbesondere werden die Listener nicht geschlossen. Stattdessen bekomme ich ganz oft die Meldung "Eigenschaft oder Methode nicht gefunden: $(ARG1)", die ich dann mühselig wegklicken muss. Das Makro durchsucht offenbar alle Bibliotheken, nicht nur die des aktuellen Moduls, ohne zu einem Ergebnis zu kommen.

Wahrscheinlich mache ich mal wieder einen ganz trivialen Fehler. Vielleicht hat ja jemand einen Tipp für mich?

MfG Mr.Ed
Zuletzt geändert von Mr.Ed am Fr, 02.09.2011 15:02, insgesamt 2-mal geändert.
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: Eigenschaft oder Methode nicht gefunden: $(ARG1)

Beitrag von Mr.Ed »

Unter dem Thema "Schließenbutten im Dialogfeld" viewtopic.php?f=18&t=46344 wurde vor einiger Zeit hier ein ähnliches Problem diskutiert. Ich brauche also einen zur Laufzeit erzeugten, nicht-modalen Dialog, damit ich während des Makros auf das "unter dem Dialog liegende" Writer-Dokument zugreifen kann, z. B. mit der Maus Textstellen markieren kann.

Insofern ist das im geposteten Code gesetzte oDlg.endExecute() natürlich Quasch, ich werde es per Änderung gleich auskommentieren. Der Dialog wurde ja gar nicht "gestartet", sondern soll nur mit oDlg.setVisible(true) angezeigt werden. Die Probleme bestehen aber weiter!

Die auftretenden Probleme ähneln sehr denen, über die auch j_gon und Stephan im oben zitierten Thread berichten. Vielleicht ist eine Lösung doch nicht so trivial, wie ich anfangs hoffte?

MfG Mr.Ed
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Eigenschaft oder Methode nicht gefunden: $(ARG1)

Beitrag von DPunch »

Aloha

Die Fehlermeldung rührt aller Wahrscheinlichkeit von fehlenden Methoden des WindowListeners her.
Eine Auflistung findest Du hier:
XTopWindowListener
Zusätzlich noch wie alle Listener:
XEventListener

Du musst den meisten ListenerMethoden keine bestimmte Funktionalität zuweisen, wenn Du das nicht willst, aber zur Verfügung stellen solltest Du sie in der Regel schon, um auf der sicheren Seite zu sein.
Das sieht dann ungefähr so aus:

Code: Alles auswählen

Sub top_windowClosing
	oDlg.removeTopWindowListener(oWinListener)
	oDlg.setVisible(false)
End Sub

Sub top_disposing
'(...)
End Sub
        
Sub top_windowActivated
'(...)
End Sub
    
Sub top_windowDeactivated
'(...)
End Sub

'usw
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: Eigenschaft oder Methode nicht gefunden: $(ARG1)

Beitrag von Mr.Ed »

Danke, DPunch,

Code: Alles auswählen

sub mark_windowActivated()
'dummy
End Sub

sub mark_windowDeactivated()
'dummy
End Sub
hatte ich schon selbst eingefügt (Stephans Code aus dem oben zitierten Thread). Ich habe jetzt die anderen Routinen, insbesonderte die für top_window, nachgetragen und kommen damit erst mal weiter. Ich halte euch auf dem Laufenden!

MfG Mr.Ed
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Eigenschaft oder Methode nicht gefunden: $(ARG1)

Beitrag von DPunch »

Aloha
Mr.Ed hat geschrieben:hatte ich schon selbst eingefügt
Aber nicht so, wie Du es da schreibst, oder?

"createUnoListener("mark_", "com.sun.star.awt.XActionListener")"
"mark_windowActivated"

Du verpasst dem XActionListener eine Methode, die er nie aufrufen wird.
Der Link enthält die relevanten Methoden für Deinen TopWindowListener, dessen Methoden alle mit (in Deinem Code) "top_" anfangen müssen, wegen
"createUnoListener("top_", "com.sun.star.awt.XTopWindowListener")"

Poste am Besten nochmal, welche Methoden Du konkret erstellt hast, ich habe das Gefühl, dass Du das Ganze noch nicht ganz nachvollziehen konntest.
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: Eigenschaft oder Methode nicht gefunden: $(ARG1)

Beitrag von Mr.Ed »

Hallo DPunch und vielen Dank für deinen Hinweis,
ich habe das Gefühl, dass Du das Ganze noch nicht ganz nachvollziehen konntest.
das Gefühl habe ich auch. Aber mein Makro macht schon mehr von dem, was ich will, als vorher.

Tatsächlich hatte ich die Methoden so, wie ich sie im letzten Beitrag gepostet hatte, schon vorher hinzugefügt. Sie haben nicht geschadet, brachten aber auch keine merkliche Verbesserung (wie auch ===> ' Dummy, passiert ja nix). Nach deinem Hinweis habe ich eine ganze Reihe anderer Methoden gesetzt, auch für top_ (WindowListener), und die machen "irgendwie" (?), dass mein Vorhaben jetzt besser funktioniert.

Ich schaue, was ich verstehen kann und wie ich weiterkomme. (Verständnis hinkt immer hinterher.) Ich werde versuchen zu sortieren.

Jetzt muss ich Essen kochen. Später melde ich mich noch mal. Vielen Dank für deine Anregungen!

MfG Mr. Ed
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: Eigenschaft oder Methode nicht gefunden: $(ARG1)

Beitrag von 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: 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
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Eigenschaft oder Methode nicht gefunden: $(ARG1)

Beitrag von DPunch »

Aloha
Mr.Ed hat geschrieben: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.
Möglicherweise solltest Du das nicht mit einer Schleife umsetzen, sondern mit einem dafür vorgesehenen Button im ja sowieso schon erzeugten Dialog.
Mr.Ed hat geschrieben:So etwas lässt sich ja prinzipiell gut mit der Debug-Funktionalität überwachen.
Die von Dir beschriebenen Probleme sind mir auch schon zu Genüge untergekommen, daher verwende ich den Debugger praktisch überhaupt nicht mehr.
Kontrollen mache ich per MsgBox / xray oder lasse mir die relevanten Werte an den relevanten Codestellen in ein extra Dokument schreiben.
Mr.Ed hat geschrieben: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.
Die Variable "oEvent" brauchst Du nicht extra deklarieren, das ist nur ein Parameter, den Du allen Listener-Methoden zur Verfügung stellen kannst (aber nicht musst) - er wird von den Listenern verwendet, um der Prozedur mindestens Art und Quelle des Events mitzuteilen. Deine Prozedur könnte also auch als
"Sub mark_actionPerformed(blablub)"
deklariert sein.
Über den dort genannten Parameter hast Du dann die Möglichkeit, genaueres über das Event zu erfahren, z.B. kannst Du ja mal die Zeile

Code: Alles auswählen

MsgBox oEvent.Source.Model.Label
bei "mark_actionPerformed" einfügen.
Mr.Ed
**
Beiträge: 47
Registriert: Di, 16.02.2010 18:38

Re: Eigenschaft oder Methode nicht gefunden: $(ARG1)

Beitrag von Mr.Ed »

Hallo DPunch,
Die von Dir beschriebenen Probleme sind mir auch schon zu Genüge untergekommen, daher verwende ich den Debugger praktisch überhaupt nicht mehr.
Ist eigentlich schade, oder? Ein gut funktionierendes Debugging-System gehört doch zum Grundbestand einer Programmiersprache und erleichtert einem die Arbeit ungemein. Versteh mich recht: Ich bin ein Verfechter von Open-Source und somit auch von Open-Office. Es wäre vielleicht wichtig, dass die Entwickler hier nochmal ihre Köpfe zusammenstecken.

Vielen Dank jedenfalls für deine Antwort. Die anderen Punkte werde ich mir morgen einmal in Ruhe ansehen.

MfG Mr.Ed
Antworten