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

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

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

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2   Вниз
  Печать  
Автор Тема: Текстовое поле и обработка нажатия клавиш  (Прочитано 2542 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Ириминаге
Всем бобра!
Форумчанин
***
Offline Offline

Сообщений: 63


« Ответ #15: 12 Апрель 2022, 16:19 »

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

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

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


« Ответ #16: 12 Апрель 2022, 16:57 »

Не надо просеивать и слушателя. Есть событие Текст изменен - на него вешаете макрос, который получает вызвавший его контрол. От контрола берете текст и делаете что нужно:
Код:
Sub ChangeText(oEvent)
sText = oEvent.Source.Text
' ...
End sub
Если нужно посимвольно анализировать и что-то делать (поиск в БД по первым символам) - то выбирайте событие Отпускание клавиши для макроса. Это то самое "просеивание"...
Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
Ириминаге
Всем бобра!
Форумчанин
***
Offline Offline

Сообщений: 63


« Ответ #17: 12 Апрель 2022, 17:14 »

Не надо просеивать и слушателя. Есть событие Текст изменен - на него вешаете макрос, который получает вызвавший его контрол. От контрола берете текст и делаете что нужно:
Код:
Sub ChangeText(oEvent)
sText = oEvent.Source.Text
' ...
End sub
Если нужно посимвольно анализировать и что-то делать (поиск в БД по первым символам) - то выбирайте событие Отпускание клавиши для макроса. Это то самое "просеивание"...

Текст я и так беру без обработки события изменения: по результатам, после закрытия диалогового окна. Я хочу отловить ENTER, а это, как я понял, без слушателя никак...
Записан

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

Пол: Мужской
Сообщений: 976


WWW
« Ответ #18: 12 Апрель 2022, 18:15 »

Есть диалоговая форма с текстовым полем и кнопкой ОК
Возвращаемся к стартовому сообщению.
Если Вы хотите при нажатии на Enter в текстовом поле заканчивать ввод и закрывать диалог, то нужно:
1. Установить для текстового поля свойство "Многострочный ввод": "Нет"
2. Установить для кнопки OK свойства "Тип кнопки" : "OK" и "Кнопка по умолчанию" : "Да".
« Последнее редактирование: 12 Апрель 2022, 18:20 от sokol92 » Записан

Владимир.
economist
Форумчанин
***
Offline Offline

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


« Ответ #19: 13 Апрель 2022, 08:44 »

хочу отловить ENTER

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

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

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 806


« Ответ #20: 13 Апрель 2022, 08:59 »

Я хочу отловить ENTER, а это, как я понял, без слушателя никак


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

Код:
   if oEvent.KeyCode = com.sun.star.awt.Key.RETURN then

и в обоих случаях никакого слушателя не требуется...
Записан

С уважением,
Михаил Каганский
Ириминаге
Всем бобра!
Форумчанин
***
Offline Offline

Сообщений: 63


« Ответ #21: 13 Апрель 2022, 09:15 »

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

Вот судя по вашему ответу, я полез нагромождать конструкции, там где их быть не должно. Спасибо!
Записан

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

Пол: Мужской
Сообщений: 1 140


« Ответ #22: 13 Апрель 2022, 16:27 »

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

Ubuntu 18.04 LTS • LibreOffice 7.3.5.2 Community
Ириминаге
Всем бобра!
Форумчанин
***
Offline Offline

Сообщений: 63


« Ответ #23: 27 Май 2022, 08:39 »

Пришлось вернуться к теме... Объясните мне пожалуйста, откуда берется этот достославный oEvent и откуда он берет данные о событии?
Записан

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

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


« Ответ #24: 27 Май 2022, 23:32 »

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

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

Одни события могут порождать другие, поэтому возможность универсально "за веревочку" вытянуть все контролы и действия с ними - дорогого стоит. Без этого пришлось бы в макросе перебирать все контролы в попытке понять "что изменилось", и в некоторых случаях в LO так делать приходится. Например в LO Writer есть несколько особых "текстовых" контролов - Список, ПолеТекста, Формула итд. Они удобны, сливаются с текстом, переносятся по слогам итд (короче они незаменимы). Так вот, у них нет Событий, а значит нет и Source, и приходится в макросах перебирать их все, чтобы понять какой контрол и как/почему/на что изменился, и другого способа - нет. Но это только во Writer.    
« Последнее редактирование: 27 Май 2022, 23:42 от economist » Записан

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
eeigor
Опытный пользователь
***
Offline Offline

Пол: Мужской
Сообщений: 1 140


« Ответ #25: 28 Май 2022, 09:11 »

этот достославный 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  Формулы вычислены

И т. д.
« Последнее редактирование: 28 Май 2022, 09:50 от eeigor » Записан

Ubuntu 18.04 LTS • LibreOffice 7.3.5.2 Community
Ириминаге
Всем бобра!
Форумчанин
***
Offline Offline

Сообщений: 63


« Ответ #26: 30 Май 2022, 13:53 »

Спасибо за детальный разбор вопроса! Что-то мне подсказывает, что программирование для вас одна, но пламенная страсть!
Записан

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

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