Текстовое поле и обработка нажатия клавиш

Автор Ириминаге, 11 апреля 2022, 10:19

0 Пользователи и 1 гость просматривают эту тему.

Ириминаге

Снёс либру, вычистил папки, поставил снова. Вроде работает. Теперь основной вопрос:
Я так понимаю, что надо на текстовое поле повесить слушателя? Если это так, не подскажете ли, какой именно слушатель нужен для просеивания нажатых клавиш в поле текста?
Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...

economist

Не надо просеивать и слушателя. Есть событие Текст изменен - на него вешаете макрос, который получает вызвавший его контрол. От контрола берете текст и делаете что нужно:

Sub ChangeText(oEvent)
sText = oEvent.Source.Text
' ...
End sub

Если нужно посимвольно анализировать и что-то делать (поиск в БД по первым символам) - то выбирайте событие Отпускание клавиши для макроса. Это то самое "просеивание"...
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ириминаге

Цитата: economist от 12 апреля 2022, 16:57
Не надо просеивать и слушателя. Есть событие Текст изменен - на него вешаете макрос, который получает вызвавший его контрол. От контрола берете текст и делаете что нужно:

Sub ChangeText(oEvent)
sText = oEvent.Source.Text
' ...
End sub

Если нужно посимвольно анализировать и что-то делать (поиск в БД по первым символам) - то выбирайте событие Отпускание клавиши для макроса. Это то самое "просеивание"...

Текст я и так беру без обработки события изменения: по результатам, после закрытия диалогового окна. Я хочу отловить ENTER, а это, как я понял, без слушателя никак...
Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...

sokol92

#18
Цитата: Ириминаге от 11 апреля 2022, 10:19Есть диалоговая форма с текстовым полем и кнопкой ОК
Возвращаемся к стартовому сообщению.
Если Вы хотите при нажатии на Enter в текстовом поле заканчивать ввод и закрывать диалог, то нужно:
1. Установить для текстового поля свойство "Многострочный ввод": "Нет"
2. Установить для кнопки OK свойства "Тип кнопки" : "OK" и "Кнопка по умолчанию" : "Да".
Владимир.

economist

Цитата: Ириминаге от 12 апреля 2022, 17:14хочу отловить ENTER

Пользователя придется как-то дополнительно заставлять нажимать Enter в поле, сам он это будет делать через раз.

К примеру, в 1С самое популярное "нажатие Enter в поле", скажем, в карточке контрагента с ИНН - приводит к загрузке данных из ЕГРЮЛ, что зримо и обязательно для продолжения. 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

mikekaganski

Цитата: Ириминаге от 12 апреля 2022, 17:14Я хочу отловить ENTER, а это, как я понял, без слушателя никак

Цитата: mikekaganski от 11 апреля 2022, 10:50
https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=59583

В этой теме, упомянутой в ответе #5, описаны два подхода: и использование кнопки по умолчанию (ответ #18), и использование события key pressed с проверкой

   if oEvent.KeyCode = com.sun.star.awt.Key.RETURN then

и в обоих случаях никакого слушателя не требуется...
С уважением,
Михаил Каганский

Ириминаге

Цитата: sokol92 от 12 апреля 2022, 18:15
Возвращаемся к стартовому сообщению.
Если Вы хотите при нажатии на Enter в текстовом поле заканчивать ввод и закрывать диалог, то нужно:
1. Установить для текстового поля свойство "Многострочный ввод": "Нет"
2. Установить для кнопки OK свойства "Тип кнопки" : "OK" и "Кнопка по умолчанию" : "Да".
Мой бывший начальник отдела говаривал: Возможно всё! Только надо время от времени останавливаться и думать: "А не херню ли я делаю?"

Вот судя по вашему ответу, я полез нагромождать конструкции, там где их быть не должно. Спасибо!
Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...

eeigor

На этот случай есть бритва Оккама: «Не следует множить сущее без необходимости». Но мне мой преподаватель говорил так: «Делай проще, дурак! Я сам так делаю».
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Ириминаге

Пришлось вернуться к теме... Объясните мне пожалуйста, откуда берется этот достославный oEvent и откуда он берет данные о событии?
Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...

economist

#24
Канонично написано в книжках. Ну а если простыми словами, то Контролы, Листы, Диалоги итп объекты в LO имеют События (каждый объект - свой набор возможных действий с ними (свойств, состояний). Событие в LO (скажем, клик мыши по контролу, скажем, по кнопке), в случае вызова "прикрепленного" к этому Контролу+Событию Макроса, например Sub Macro(oEvent) - передаст переменной oEvent это самое событие, а вмести с ним - возможность универсально и кратко работать с "источником" события (Source) и всеми его атрибутами. Через Source события вы сможете легко перейти к Model/View/Controller и что угодно получить/изменить.

То есть с Sub Macro(oEvent) - макрос всегда "знает" какой именно контрол и по какому событию (по какому поводу) этот макрос запустил.

Одни события могут порождать другие, поэтому возможность универсально "за веревочку" вытянуть все контролы и действия с ними - дорогого стоит. Без этого пришлось бы в макросе перебирать все контролы в попытке понять "что изменилось", и в некоторых случаях в LO так делать приходится. Например в LO Writer есть несколько особых "текстовых" контролов - Список, ПолеТекста, Формула итд. Они удобны, сливаются с текстом, переносятся по слогам итд (короче они незаменимы). Так вот, у них нет Событий, а значит нет и Source, и приходится в макросах перебирать их все, чтобы понять какой контрол и как/почему/на что изменился, и другого способа - нет. Но это только во Writer.    
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

eeigor

#25
Цитата: Ириминаге от 27 мая 2022, 08:39этот достославный oEvent
Я в учебных целях всегда рассматриваю эти объекты детально и объявляю явно с этой целью:
   Sub Document_OnLoad(oEvent As com.sun.star.document.DocumentEvent)
   Sub cmdHelp_actionPerformed(oEvent As com.sun.star.awt.ActionEvent)
   Sub cboTopics_textChanged(oEvent As com.sun.star.awt.TextEvent)

Причём, на листе электронной таблицы, в отличие от окна диалога, это событие спрятано глубже (в форме, а не в элементе управления):
oEvent.Source.ImplementationName = "com.sun.star.form.OButtonControl"
The events assigned to a form control object are not (as one would presume) contained within the control itself, but in the form object.
Обратите внимание на обращение к Parent, чтобы добраться до источника события и его имени.
См: oEvent.Source.Model.Parent.getScriptEvents(nIndex)(0)
   com.sun.star.script.ScriptEventDescriptor: .EventMethod = "actionPerformed"

И если это событие "actionPerformed", то так и именую элемент управления (контрол), например:
   Sub cmdHelp_actionPerformed(oEvent As com.sun.star.awt.ActionEvent)
Тогда всё всегда понятно. Для именования элементов управления использую венгерскую нотацию (выше "cmd" - Command (Push) Button; "txt" - Text (Edit) Field).

В общем, вы правильно "споткнулись", и вопрос закономерен: эта "область" требует некоторой стандартизации собственного кода (в плане выработки своего стиля). Должно быть понятно.
Другими словами, я сохранил свой стиль, родом из VBA. Здесь же можно делать по-всякому, в том числе и непонятно. То есть я связываю действие контрола точно с его именем события, а можно подцепить любой макрос с произвольным именем: и тогда лезьте в свойства и разбирайтесь, кто и что там вызывает... Дело вкуса.
Правда, иногда объявляем и так:
   Sub Sheet_OnChange(oTarget As Object)  '<- ScCellObj, ScCellRangeObj, ScCellRangesObj
Потому что в событие передается произвольный объект. И здесь на форуме конкретно с этим событием мы уже разбирались предметно.

Разберитесь со всеми событиями, например:

'   Spreadsheet Document Events (28):
'   OnStartApp            Start Application
'   OnCloseApp            Close Application
'   OnCreate              Document created
'   OnNew                 New Document
'   OnLoadFinished        Document loading finished         Документ загружен
'   OnLoad                Open Document
'   OnPrepareUnload       Document is going to be closed
'   OnUnload              Document closed
'   OnSave                Save Document
'   OnSaveDone            Document has been saved
'   OnSaveFailed          Saving of Document failed
'   OnSaveAs              Save Document As
'   OnSaveAsDone          Document has been saved as
'   OnSaveAsFailed        'Save as' has failed
'   OnCopyTo              ?
'   OnCopyToDone          Document copy has been created
'   OnCopyToFailed        Creating of document copy failed
'   OnFocus               Activate Document                 Активизация документа
'   OnUnfocus             Deactivate Document
'   OnPrint               Print Document
'   OnViewCreated         View created                      Просмотр создан
'   OnPrepareViewClosing  View is going to be closed
'   OnViewClosed          View closed
'   OnModifyChanged       'Modified' status was changed
'   OnTitleChanged        Document title changed
'   OnVisAreaChanged      ?
'   OnModeChanged         ?
'   OnStorageChanged      ?
'                         + Storing or exporting copy of document

'   Sheet Events (7):
'   OnFocus        Activate Document    Активизация документа
'   OnUnfocus      Deactivate Document  Деактивизация документа
'   OnSelect       Selection changed    Выделенная область изменена
'   OnDoubleClick  Double click         Двойной щелчок
'   OnRightClick   Right click          Щелчок правой кнопкой
'   OnChange       Content changed      Содержимое изменено
'   OnCalculate    Formulas calculated  Формулы вычислены

И т. д.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Ириминаге

Спасибо за детальный разбор вопроса! Что-то мне подсказывает, что программирование для вас одна, но пламенная страсть!
Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...