Zdarzenia w open office
Zdarzenia w open office
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.
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
Re: Zdarzenia w open office
Znalazłem częściowe rozwiązanie.
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?
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
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
Re: Zdarzenia w open office
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)
LO (26.2) ∙ Python (3.13|3.10) ∙ Unicode 17 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Zdarzenia w open office
Przepraszam, że tak późno odpowiadam. Myślałem, że mam ustawione przysyłanie maila o odpowiedzi na mój wątek.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)?
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
Re: Zdarzenia w open office
To jest przyklad z calca, ale może ci pomoże
Pozdrawiam
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 LibreOffice 5.1.2.2 Ubuntu 16 LTS
Re: Zdarzenia w open office
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
procedura jest przypisana do zdarzenia "klawisz naciśnięty" pola tekstowego
Mam nadzieje że jest to czego szukasz.
Pozdrawiam
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 Subprocedura 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
Re: Zdarzenia w open office
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ć.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.
OpenOffice 3.1 na Windows Vista