Zdarzenia w open office

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
GrzegorzJ
Posty: 3
Rejestracja: pt lut 03, 2012 8:14 pm

Zdarzenia w open office

Post autor: GrzegorzJ »

Korzystam z Base. Podczas pracy z formularzami wydaje mi się niewystarczająca obsługa zdarzeń kontrolek.
np. umieszczam pole tekstowe na formularzu i chcę przechwycić zdarzenie puszczenia klawisza Enter na tej kontrolce.
We właściwościach kontrolki jest np. wydarzenie zmodyfikowano lub klawisz puszczono, które wydaje się być pomocne,
ale nie wiem jak ograniczyć wywołanie wskazanej przeze mnie procedury do klawisza enter.

Może powinienem poszukać innej drogi. Widziałem już kilka razy, że można przechwytywać zdarzenia w open office.
Jednak nie wiem jak to wykorzystać w tym przypadku.
Win7, Ooo 3.2.1
GrzegorzJ
Posty: 3
Rejestracja: pt lut 03, 2012 8:14 pm

Re: Zdarzenia w open office

Post autor: GrzegorzJ »

Znalazłem częściowe rozwiązanie.

Kod: Zaznacz cały

Global oDocView
Global oKeyHandler

Sub RegisterKeyHandler
 oDocView = ThisComponent.getCurrentController  
 oKeyHandler = createUnoListener("Slownik_", "com.sun.star.awt.XKeyHandler")  
 oDocView.addKeyHandler(oKeyHandler)  
End Sub

Sub UnregisterKeyHandler
  oDocView.removeKeyHandler(oKeyHandler)
End Sub

Sub Slownik_disposing(oEvt)
'nothing to do here
End Sub

Function Slownik_KeyPressed(oEvt) As Boolean
  select case oEvt.KeyChar
    case chr(13)
       Slownik_KeyPressed = True
       Testuj
    case else
       Slownik_KeyPressed = False
  end select
End Function

Function Slownik_KeyReleased(oEvt) As Boolean
  Slownik_KeyReleased = False
End Function
Podczas otwierania okna należy wywołać procedurę RegisterKeyHandler jest tam ważna funkcja createUnoListener, w której jako pierwszy parametr przekazuję nazwę mojej procedury, a drugi to "odbiornik" - rozumiem to jako zbiór dostępnych zdarzeń jedno z nich to KeyPressed.
Teraz po implementacji funkcji Function Slownik_KeyPressed(oEvt) As Boolean mogę przejmować zdarzenia na wciśnięte klawisze. Należy pamiętać, że po przechwyceniu zdarzenia funkcja musi zwracać True oraz False w przeciwnym wypadku.

Metoda ta dotyczy całego formularza. Może ktoś wie jak podpiąć procedurę zdarzeń pod wybraną kontrolkę np. pole tekstowe?
Win7, Ooo 3.2.1
Jan_J
Posty: 4653
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Zdarzenia w open office

Post autor: Jan_J »

Rozumiem, że chodzi o jednorazowe przypisanie akcji do wybranego zdarzenia. Czy nie da się tego zrobić za pomocą standardowego interfejsu projektowego (Widok/Paski narzędzi/Formanty; narzędzie Zaznacz; ppm na wybranym elemencie / Formant / zakładka Właściwości)?
JJ
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
GrzegorzJ
Posty: 3
Rejestracja: pt lut 03, 2012 8:14 pm

Re: Zdarzenia w open office

Post autor: GrzegorzJ »

Postprzez Jan_J » N lut 05, 2012 10:02 am
Rozumiem, że chodzi o jednorazowe przypisanie akcji do wybranego zdarzenia. Czy nie da się tego zrobić za pomocą standardowego interfejsu projektowego (Widok/Paski narzędzi/Formanty; narzędzie Zaznacz; ppm na wybranym elemencie / Formant / zakładka Właściwości)?
Przepraszam, że tak późno odpowiadam. Myślałem, że mam ustawione przysyłanie maila o odpowiedzi na mój wątek.

Więc cały problem polega na tym, że we właściwości formantu są bardzo ogólne zdarzenia np. "Tekst zmodyfikowano".
Zostaje on wywołany również wtedy, gdy naciśnięty zostanie enter, ale tylko wtedy gdy tekst w tej kontrolce się zmienił.
Zależy mi, żeby to się działo za każdym razem kiedy wcisnę enter i tylko wtedy, bez względu na to czy tekst tam znajdujący się zmienił czy nie.
Nie chcę też by moje zdarzenie zostało wywoływane za każdym razem kiedy tekst w tej kontrolce się zmieni, np. podczas programowej zmiany, a tak się dzieje w standardowym zdarzeniu Tekst zmodyfikowano.

Rozwiązanie, które przytoczyłem jak już pisałem częściowo rozwiązuje ten problem. Otrzymuję kod wciśniętego klawisza w mojej procedurze zdarzenia, ale nie wiem z jakiej kontrolki pochodzi.

Dlatego pytanie pozostawiam otwarte.
Win7, Ooo 3.2.1
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Zdarzenia w open office

Post autor: belstar »

To jest przyklad z calca, ale może ci pomoże

Kod: Zaznacz cały

Sub Main
   oDialogModel=createUnoService("com.sun.star.awt.UnoControlDialogModel")
   With oDialogModel
      .Title="KeyListener-Beispiel"
      .Width=300
      .Height=200
   End With
   oDialog=createUnoService("com.sun.star.awt.UnoControlDialog")
   oDialog.setModel(oDialogModel)
   
   oControlModel=oDialogModel.createInstance("com.sun.star.awt.UnoControlEditModel")
   With oControlModel
      .setPropertyValue("Name","txtFile")
      .setPropertyValue("PositionX",20)
      .setPropertyValue("PositionY",20)
      .setPropertyValue("Width",100)
      .setPropertyValue("Height",15)
      .setPropertyValue("TabIndex",0)
   End With
    oControlModel1=oDialogModel.createInstance("com.sun.star.awt.UnoControlEditModel")
   With oControlModel1
      .setPropertyValue("Name","txtFile1")
      .setPropertyValue("PositionX",20)
      .setPropertyValue("PositionY",50)
      .setPropertyValue("Width",100)
      .setPropertyValue("Height",15)
      .setPropertyValue("TabIndex",1)
   End With
   oDialogModel.insertByName("txtFile",oControlModel)
   oDialogModel.insertByName("txtFile1",oControlModel1)
   oKeyListener=CreateUnoListener("KeyEvent_","com.sun.star.awt.XKeyListener")
   oControl=oDialog.getControl("txtFile")
   oControl.addKeyListener(oKeyListener)
   oDialog.setVisible(True)
   oDialog.Execute()
End Sub

Sub KeyEvent_KeyPressed(oKeyEvent)
   Msgbox(oKeyEvent.KeyChar)
   Select Case oKeyEvent.KeyCode
      Case com.sun.star.awt.Key.ESCAPE
         Msgbox("ESC")
      Case com.sun.star.awt.Key.A
         Msgbox("A")
      Case com.sun.star.awt.Key.END
         Msgbox("END")
      Case com.sun.star.awt.Key.F2
         Msgbox("F2")
   End Select 
end sub
Sub KeyEvent_KeyReleased(oKeyEvent)
End Sub

Sub KeyEvent_disposing(source)
End Sub 
Pozdrawiam
LibreOffice 5.1.2.2 Ubuntu 16 LTS
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Zdarzenia w open office

Post autor: belstar »

Witam
W poprzednim poście podałem przykład ,który na pewno cie nie zadowala. Nie dawało mi to spokoju i wyszukałem coś takiego

Kod: Zaznacz cały

Sub KeyPressed(Event As Object)
 
   Dim Msg As String
 
   Select Case Event.KeyCode
   Case com.sun.star.awt.Key.RETURN
     Msg = "Return pressed"
   Case com.sun.star.awt.Key.TAB
     Msg = "Tab pressed"
   Case com.sun.star.awt.Key.DELETE
     Msg = "Delete pressed"
   Case com.sun.star.awt.Key.ESCAPE
     Msg = "Escape pressed"
   Case com.sun.star.awt.Key.DOWN
     Msg = "Down pressed"
   Case com.sun.star.awt.Key.UP
     Msg = "Up pressed"
   Case com.sun.star.awt.Key.LEFT
     Msg = "Left pressed"
   Case com.sun.star.awt.Key.RIGHT
     Msg = "Right pressed"
   Case Else
     Msg = "Character " & Event.KeyChar & " entered"
   End Select
   MsgBox Msg
 
End Sub

procedura jest przypisana do zdarzenia "klawisz naciśnięty" pola tekstowego
Mam nadzieje że jest to czego szukasz.
Pozdrawiam
LibreOffice 5.1.2.2 Ubuntu 16 LTS
asd67
Posty: 1
Rejestracja: ndz lut 12, 2012 12:02 pm

Re: Zdarzenia w open office

Post autor: asd67 »

GrzegorzJ pisze:Korzystam z Base. Podczas pracy z formularzami wydaje mi sie niewystarczajaca obsluga zdarzen kontrolek.
np. umieszczam pole tekstowe na formularzu i chce przechwycic zdarzenie puszczenia klawisza Enter na tej kontrolce.
We wlasciwosciach kontrolki jest np. wydarzenie zmodyfikowano lub klawisz puszczono, które wydaje sie byc pomocne,
ale nie wiem jak ograniczyc wywolanie wskazanej przeze mnie procedury do klawisza enter.

Moze powinienem poszukac innej drogi. Widzialem juz kilka razy, ze mozna przechwytywac zdarzenia w open office.
Jednak nie wiem jak to wykorzystac w tym przypadku. Rozmiar waginy nie będzie na pierwszym miejscu pod względem ważności - skład spermy. Dziękuję za odp. Z poważaniem.
Nie jest to takie proste, jak mogłoby się wydawać. Mam co nieco do powiedzenia na ten temat i jutro o tym napiszę... Dobrze, że jest gdzie pogadać.
OpenOffice 3.1 na Windows Vista
ODPOWIEDZ