Mit dem Cursor an eine bestimmte Position springen

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

Moderator: Moderatoren

diefliege
Beiträge: 7
Registriert: Mi, 11.08.2004 18:57

Mit dem Cursor an eine bestimmte Position springen

Beitrag von diefliege »

Moinsen,
ich möchte mit Hilfe eines Makros den Cursor an eine definierte Position im Dokument setzen. Ich hatte ein derartiges Makro bereits unter Word verfasst, wobei ich dort an der entsprechenden Position ein "Kontrollkästchen" gesetzt habe, zu dem ich anschließend mit Hilfe des Makros springen konnte. Das gleiche ist mir unter oo leider nicht gelungen. Welche Lösung gibt es dann?
Danke!
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Das gleiche ist mir unter oo leider nicht gelungen
Wie bist Du denn bisher vorgegangen um das unter OpenOffice zu erreichen?
Gehen tut das in jedem Fall, aber es erschiene mir einfacher in Deinem bisherigen Code einen Fehler zu suchen, als das ganz neu zu machen.

Gruß
Stephan
diefliege
Beiträge: 7
Registriert: Mi, 11.08.2004 18:57

Beitrag von diefliege »

Nachdem ich das Word-Dokument mit oo geöffnet hatte erschienen unter Bearbeiten-->Navigator-->Textmarken meine altbekannten "Kontrollkästchen". Über Makro aufzeichnen (zugegebenermaßen bin ich noch nicht in der Lage mir das gesamte Makro eigenständig zurechzuprogrammieren) habe ich dann versucht, auf diese Kontrollkästchen zu springen und das auch im Makro festzuhalten. Leider registriert das Makro nur das Öffnen des Navigators, nicht aber das anschließende Springen auf die Textmarke (weder über Doppelklick, noch über -->Navigation-->Textmarke-->Nächste Textmarke).
Dies hier ist das dabei generierte Makro:

sub test
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Navigator"
args1(0).Value = true
dispatcher.executeDispatch(document, ".uno:Navigator", "", 0, args1())
end sub
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Dein Makro tut auch nichts in der Richtung was Du erreichen willst, es öffnet nur den Navigator. Allerdings weiß ich nicht was Du denn nun willst, zuerst war von einem Kontrollkästchen die Rede jetzt (auch) von einer Textmarke.
Ein Kontrollkästchen ist ein Draw-page-Objekt und eine Textmarke wohl etwas anderes. Du müßtest möglicherweise erstmal das (Word)Kontrollkästchen entfernen und ein Kontrollkästchen von OpenOffice einfügen und diesem einen eindeutigen Namen geben, dann könntest Du es mittels Code anspringen (den Code wirst Du aber wohl nicht ohne Weiteres aufzeichnen können).
Ich bin auch noch nicht sicher was passiert, wenn Du das Kontrollkästchen per Code selektierst. Was soll denn erreicht werden?

Gruß
Stephan
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Wie kann ich mit einem Makro an eine definierte (!) Position innerhalb eines Textes springen, um dann dort etwas einzufügen?
Kann doch eigentlich nicht so schwer sein?!?
Wie ist denn die definierte Position gekennzeichnet? Befindet sie sich innerhalb eines normalen Fließtextes oder woanders (z.B. Textfeld, Tabelle, Aufzählung, Kopfzeile usw.)?

Hier ist ein Beispiel, für den Zugriff auf ein Kontrollkästchen in einem Writer-Dokument, der Zugriff auf eine bestimmte Position eines Textes erfolgt jedoch gänzlich anders und ist abhängig davon wie Du meine obenstehenden Fragen beantwortest.

Code: Alles auswählen

Sub Checkbox_Demo
'dieser Code findet in einem Writer-Dokument eine
'vorhandene Checkbox und ändert deren Status
oDoc = ThisComponent
oView = oDoc.CurrentController
'nur ein Formular namens 'Standard' wird berücksichtigt
oForm = oDoc.DrawPage.Forms.GetByName("Standard")
'Checkbox hat Namen "CheckBox1"
For n = 0 to oForm.Count - 1
   kaestchen = oForm.GetByIndex( n )
   If kaestchen.Name = "CheckBox1" Then
      If kaestchen.State = 0 then 
            kaestchen.State = 1
         Else
            kaestchen.State = 0   
      End If
   End if   
Next   
End Sub


Stephan
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Falls nur Fließtext vorliegt:

an Textmarke namens "test" den Text "Beispiel" eintragen:

Code: Alles auswählen

Sub Text_an_Textmarke_eintragen
thisComponent.getBookmarks().getByName("test").getAnchor.setString("Beispiel")
End Sub
den Cursor auf die Textmarke "test" setzen:

Code: Alles auswählen

Sub mit_Cursor_zu_Textmarke_springen
Cursor = thiscomponent.CurrentController.getviewCursor()
Bookmark = thiscomponent.Bookmarks.getByName("test").Anchor
Cursor.gotorange(Bookmark, False)
End Sub
Gruß
Stephan
diefliege
Beiträge: 7
Registriert: Mi, 11.08.2004 18:57

Beitrag von diefliege »

Stephan, ich danke Dir, das ist genau das, was ich gesucht habe. Werde heute Abend mal versuchen, das in mein Dokument "einzupflegen".
Baghee
Beiträge: 6
Registriert: Mo, 14.11.2005 16:17

Beitrag von Baghee »

Darf ich mich hier kurz dranhängen?

Ich stehe vor dem gleichen Problem, vor dem diefliege damals stand und habe in diesem Makro eine Lösung gesehen - und das Makro in mein Dokument integriert.

Wenn ich das Makro jetzt "von Hand" ausführe, funktioniert auch alles prima, solange der Cursor in Kopf-, Fusszeile oder im Body des Dokuments steht.

Ich habe aber zwischen Kopfzeile und Textkörper (Body) ein paar Formularfelder integriert, und will das Makro nutzen, um von einem dieser Formularfelder in den Body des Dokuments zu springen.

Und DAS funktioniert nicht.

Ich habe das Makro dem Formularfeld zur Ausführung beim Ereignis "Bei Fokusverlust" zugewiesen.

Nur wird die Textmarke, die ich anspringen will, eben NICHT angesprungen.

Der Cursor landet stattdessen im nächsten Formularfeld, als ob das Makro nichts tun würde.


Wo liegt das Problem, was muss ich ändern, damit es funktioniert?
Antworten