🙏 Helfen Sie mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Writer - Text/Tasteneingabe & Cursor ohne Dispatcher

Alles zur Programmierung im LibreOffice.
Antworten
Eric March
Beiträge: 54
Registriert: Do 16. Jun 2011, 16:08

Writer - Text/Tasteneingabe & Cursor ohne Dispatcher

Beitrag von Eric March » Fr 24. Feb 2012, 20:55

Hallo!

Aktuell teste ich LO 3.5. Und offenbar wird im Gegensatz zu 3.4 Dispatchercode wieder ohne Murren ausgeführt (was mir bei meinem Einklebeproblem wenigstens eine kleine Sorge nimmt).

Trotzdem würde ich gerne ohne den Dispatcher auskommen wo immer das geht. Unter Rückgriff auf eine vorige Anfrage und den Recorder entstand dieser Code:

Code: Alles auswählen

Public Sub SpeichernUndPOS1
Dim MeinViewCursor As Object
Dim Dokument As Object
Dim Rahmen As Object
Dim StatusIndikator as Object
  Dim Dokument2 As Object
  Dim DisPatcher As Object
  Dim Argument(1) As New com.sun.star.beans.PropertyValue

 Dokument = ThisComponent
 Rahmen = StarDesktop.GetCurrentFrame()
 StatusIndikator = Rahmen.CreateStatusIndicator()
   Dokument2 = ThisComponent.CurrentController.Frame
   DisPatcher = CreateUnoService("com.sun.star.frame.DispatchHelper")
 
 StatusIndikator.End()
 StatusIndikator.Start("Lesezeichen sichern", 10)
 StatusIndikator.SetValue(10)
 MeinViewCursor = Dokument.GetCurrentController.ViewCursor
 MeinViewCursor.GotoStartOfLine(0,False)
 MeinViewCursor.String=" "
 MeinViewCursor.String=""

   Argument(0).Name = "Count"
   Argument(0).Value = 1
   Argument(1).Name = "Select"
   Argument(1).Value = False
   DisPatcher.ExecuteDispatch(Dokument2, ".uno:GoRight", "", 0, Argument())
   DisPatcher.ExecuteDispatch(Dokument2, ".uno:Escape", "", 0, Array())
   DisPatcher.ExecuteDispatch(Dokument2, ".uno:GoLeft", "", 0, Argument())

 Dokument.Store(1)
 StatusIndikator.End()
 StatusIndikator.Start("", 0)
 StatusIndikator.End()
End Sub
Die Idee dahinter ist auszunutzen, dass LO beim Öffnen an der letzten Speicherposition in ein Dokument wieder einsteigt. Also ändere ich dort wo ich bin etwas und speichere dann. Gerne hätte ich fürs Scrollen den Cursor vorne in der Zeile (also links am Rand).
Mit MeinViewCursor gehe ich nach links an den Zeilenbeginn, füge ein Leerzeichen ein und nehme das zurück (die gewollte Änderung). Die Manipulation per StatusIndikator (nochmals danke für die Hilfe) ist etwas fürs Auge während eines länger dauernden Abspeicherns.

Leider tut MeinViewCursor nicht genau so wie ich will. Es wirkt, als bliebe dort die Shift-Taste gedrückt - Cursorbewgungen oder Mausklicks markieren den Text satt nur den Cursor zu bewegen. Da ESC das auflöst wollte ich ESC tippen lassen. Der Dispatchercode tut das - und doch war es erforderlich extra, wieder per Dispatcher aus u.g. Gründen, den Cursor zu bewegen. ESC allein genügt so wenig wie 1x Cursor-rechts + 1x Cursor-links.

Damit ergeben sich 2 Fragen:
• Kann ich die letztlich abgebildeten Schritte Pos1 - Leerzeichen - Backspace (- Speichern) auf andere Weise verwirklichen, ohne Dispatcher und besonders ohne die Klimmzüge den Cursor wieder zu befreien?
• Für andere Fälle und Gelegenheiten - wie kann ich ohne den Dispatcher mit dem Cursor unfallfrei navigieren (der ViewCursor hat ja offenbar Nebenwirkungen; Versuche das mit dem TextCursor zu entwirren scheiterten; mein Fehler?) und auch Tasten wie ESC, Backspace sowie normale Zeichen quasi tippen zu lassen?

Eric March

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Writer - Text/Tasteneingabe & Cursor ohne Dispatcher

Beitrag von F3K Total » Mo 27. Feb 2012, 21:03

Hallo,
ich habe da folgende Idee, Du setzt an die Stelle wo sich der Cursor befindet beim Ereignis "Dokument sichern" eine Textmarke:

Code: Alles auswählen

sub S_insert_Bookmark
odoc = thiscomponent
oBookMarks = odoc.bookmarks
if oBookMarks.hasByName("last_exit_position") then
oBookmark = oBookMarks.getbyname("last_exit_position")
odoc.text.removeTextContent(oBookMark)
endif
oviewcursor = odoc.currentcontroller.viewcursor
oBookMark = oDoc.createinstance("com.sun.star.text.Bookmark")
oBookMark.Name = "last_exit_position"
oDoc.text.insertTextContent(oviewcursor, oBookMark, true)
end Sub
und springst beim Ereignis "Ansicht wurde erzeugt" wieder dahin:

Code: Alles auswählen

sub S_goto_bookmark
odoc = thiscomponent
oBookMarks = odoc.bookmarks
oBookmark = oBookMarks.getbyname("last_exit_position")
oAnchor = oBookMark.getAnchor
oviewcursor = odoc.currentcontroller.viewcursor
oviewcursor.gotoRange(oAnchor,false)
end sub
Gruß R
Windows 11: AOO, LO Linux Mint: AOO, LO


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten