Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

18 Апрель 2021, 17:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: По клику мыши получить текст [РЕШЕНО]  (Прочитано 8539 раз)
0 Пользователей и 1 Гость смотрят эту тему.
macros
Участник
**
Offline Offline

Сообщений: 16


« Стартовое сообщение: 2 Июнь 2010, 19:13 »

Как по клику мыши (или Ctrl+клик) на каком-то слове в документе Writer, запустить макрос и получить текст (этого слова или всего предложения) в переменную?

Есть у кого-то решение, или идеи?
« Последнее редактирование: 18 Август 2010, 22:42 от Syzygy » Записан
dr.Faust
Администратор
**
Offline Offline

Пол: Мужской
Расположение: Ростов-на-Дону
Сообщений: 1 340


« Ответ #1: 2 Июнь 2010, 22:10 »

Получить не проблема.
Вот как запустить макрос по клику мыши, без слушателя, я не представляю...
Записан

Свобода информации - свобода личности!
macros
Участник
**
Offline Offline

Сообщений: 16


« Ответ #2: 2 Июнь 2010, 23:19 »

А почему без слушателя? Можно и со слушателем.

Ну, например, так
   click = CreateUnoListener("MyText_", "com.sun.star.awt.XMouseClickHandler")
   thisComponent.currentController.addMouseClickHandler(click)

А как получить текст?
Записан
dr.Faust
Администратор
**
Offline Offline

Пол: Мужской
Расположение: Ростов-на-Дону
Сообщений: 1 340


« Ответ #3: 2 Июнь 2010, 23:40 »

А как получить текст?
Не совсем понял что именно вызывает трудности?
Из события слушателя - никак.
Для всего остального есть видимый и текстовый курсоры.
Записан

Свобода информации - свобода личности!
macros
Участник
**
Offline Offline

Сообщений: 16


« Ответ #4: 2 Июнь 2010, 23:54 »

Из события слушателя запускаем макрос, а в нем уже получаем текст с помощью видимого и текстового курсоров. Я правильно понял?
Записан
macros
Участник
**
Offline Offline

Сообщений: 16


« Ответ #5: 3 Июнь 2010, 00:15 »

Все получилось, спасибо.
« Последнее редактирование: 3 Июнь 2010, 00:24 от macros » Записан
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #6: 3 Июнь 2010, 08:11 »

У меня почему-то офис падает на этом макросе:

REM  *****  BASIC  *****
Dim i_x1 As Integer
Dim click_x1 As Object

Sub Main
i_x1=0
click_x1 = CreateUnoListener("MyText_x1_", "com.sun.star.awt.XMouseClickHandler")
thisComponent.currentController.addMouseClickHandler(click_x1)
End Sub

Sub MyText_x1_mousePressed(evt)
VK = thisComponent.CurrentController.ViewCursor
TK = thisComponent.Text.createTextCursorByRange(VK)
TK.gotoNextWord(FALSE)
TK.gotoPreviousWord(TRUE)
msgbox TK.String
End Sub

Sub MyText_x1_mouseReleased(evt)
i_x1=i_x1+1
If i_x1=10 then thisComponent.currentController.removeMouseClickHandler(click_x1)
End Sub
Записан

ubuntu 12.04 + LibO3.6.0
miken
Новичок
*
Offline Offline

Сообщений: 1


« Ответ #7: 3 Июнь 2010, 12:48 »

Все получилось, спасибо.
Дык поделитесь -- как?
Записан
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #8: 3 Июнь 2010, 22:03 »

Пример из http://pitonyak.org/AndrewMacro.odt (14.3.7. Example 4: com.sun.star.awt.XMouseClickHandler):

Option Explicit

Global oDocView As Object
Global oMouseClickHandler As Object

Sub RegisterMouseClickHandler
  oDocView = ThisComponent.currentController
  oMouseClickHandler = _
  createUnoListener("MyApp_", "com.sun.star.awt.XMouseClickHandler")
'  writedbginfo oMouseClickHandler
  oDocView.addMouseClickHandler(oMouseClickHandler)
End Sub

Sub UnregisterMouseClickHandler
  on error resume next
  oDocView.removeMouseClickHandler(oMouseClickHandler)
  on error goto 0
End Sub

Sub MyApp_disposing(oEvt)
End Sub

Function MyApp_mousePressed(oEvt) As Boolean
  MyApp_mousePressed = False
End Function

Function MyApp_mouseReleased(oEvt) As Boolean
Dim sMsg As String
  With oEvt
    sMsg = sMsg & "Modifiers = " & .Modifiers & Chr(10)
    sMsg = sMsg & "Buttons = " & .Buttons & Chr(10)
    sMsg = sMsg & "X = " & .X & Chr(10)
    sMsg = sMsg & "Y = " & .Y & Chr(10)
    sMsg = sMsg & "ClickCount = " &  .ClickCount & Chr(10)
    sMsg = sMsg & "PopupTrigger = " & .PopupTrigger '& Chr(10)
    'sMsg = sMsg & .Source.dbg_Methods  
  End With
  
  ThisComponent.text.string = sMsg
  
  MyApp_mouseReleased = False
End Function


Работает.
« Последнее редактирование: 3 Июнь 2010, 22:05 от Трио » Записан

ubuntu 12.04 + LibO3.6.0
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #9: 3 Июнь 2010, 22:32 »

Вот решение:

Global oDocView As Object
Global oMouseClickHandler As Object
Global ix12 As Integer

Sub RegisterMouseClickHandler
  oDocView = ThisComponent.currentController
  oMouseClickHandler = _
  createUnoListener("MyApp_", "com.sun.star.awt.XMouseClickHandler")
'  writedbginfo oMouseClickHandler
  oDocView.addMouseClickHandler(oMouseClickHandler)
End Sub

Sub UnregisterMouseClickHandler
  on error resume next
  oDocView.removeMouseClickHandler(oMouseClickHandler)
  on error goto 0
End Sub

Sub MyApp_disposing(oEvt)
End Sub

Function MyApp_mousePressed(oEvt) As Boolean
  MyApp_mousePressed = False
  ix12=0
End Function

Function MyApp_mouseReleased(oEvt) As Boolean
If oEvt.ClickCount=1 and ix12=0 then
   VK = oDocView.ViewCursor
   TK = thisComponent.Text.createTextCursorByRange(VK)
   TK.gotoNextWord(FALSE)
   TK.gotoPreviousWord(TRUE)
   MyApp_mouseReleased = False
   msgbox TK.String
   ix12=1
Endif
End Function


Можно поменять значение ClickCount на 2, 3 ... и тогда действие будет выполняться по двойному, тройному, ... клику .
Записан

ubuntu 12.04 + LibO3.6.0
convas
Форумчанин
***
Offline Offline

Сообщений: 310


« Ответ #10: 3 Июнь 2010, 23:06 »


Не показывает последнее слово абзаца.
Записан
Рыбка Рио
Форумчанин
***
Offline Offline

Сообщений: 1 678


« Ответ #11: 4 Июнь 2010, 07:06 »


Не показывает последнее слово абзаца.

Да, конечно, просто нужно заменить оказывается строчки:

   TK.gotoNextWord(FALSE)
   TK.gotoPreviousWord(TRUE)


на строчки:
   TK.gotoStartOfWord(FALSE)
   TK.gotoEndOfWord(TRUE)

Записан

ubuntu 12.04 + LibO3.6.0
convas
Форумчанин
***
Offline Offline

Сообщений: 310


« Ответ #12: 4 Июнь 2010, 15:04 »

или Ctrl+клик

Можно ли еще добавить проверку на нажатую клавишу (CTRL или ALT)?

Сам себе отвечаю:

Можно, через "com.sun.star.awt.XKeyHandler".

« Последнее редактирование: 12 Июнь 2010, 14:06 от convas » Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!