Використання елементів керування в документах Writer

Нещодавно в поле зору потрапила одна цікава стаття “Visual Basic – незрівнянні переваги та інше”, опублікована на персональному сайті автора Я. М. Глинського. Власне кажучи, це солідна наукова робота з галузі методики викладання інформатики, в якій йдеться про вивчення розділу “Алгоритмізація та програмування” у середній та вищій школах. Зокрема, проілюстровані на прикладах переваги використання Visual Basic, (насамперед VBA) у навчальному процесі, що і зацікавило, так би мовити, “з професійної точки зору”. Один з прикладів демонструє візуальну організацію простих обчислень безпосередньо в документі MS Word.

Малюнок запозичено безпосередньо з оригіналу.

Цей приклад нагадав про невдалі намагання зробити щось подібне в середовищі OpenOffict.org Writer. Розмістити в області документа кнопку та текстові поля для вводу даних не складає жодних труднощів:

  • відкриваємо панель інстументів “Елементи керування” (Form Controls) командою Вид=>Панелі інструментів=>Елементи керування (View=>Toolbars=>Form Controls);
  • вибираємо лівою клавішою миші кнопку порібного елемента керування;
  • відмічаємо мишою, з натиснутою лівою клавішою, прямокутну область в документі, яку повинен зайняти елемент керування.

Досвід роботи з діалогами підказує, що макрос для оборобки натискання кнопки потрібно буде призначити у розділі “Події” (“Events”) вікна властивотей елемента (див. тут). Щоправда, комада звертання до властивостей об’єкта тут має назву “Елемент керування” (Control…), навідміну, від елементів даіалога, де вона названа “Властивості”. Ще один момент, на який слід звернути увагу — перемикач “Режим розробки” (Design Mode On/Off) на панелі інструментів з елементами керування. Він, насамперед, потрібний для того, щоб після створення елементів керування і макросів обробки їхніх подій перейти до звичайного режиму, в якому можна, наприклад, натиснути кнопку і побачити результат виконання призначеного їй макроса. Цей перемикач здійснює також і зворотній перехід, якщо потрібно внести якісь зміни у візуальну конструкцію свого невеличкого “проекту”.

Основна проблема — це, звичайно, написання макроса-обробника натискання кнопки. Назвемо його MainButtonClick. Труднощі полягають в тому, щоб звернутися з коду макроса до елементів керування, розташованих в документі. Оскільки виконання макроса буде здійснюватися безпосередньо з відкритого вікна документа, то для звертання до самого документа можна скористатися конструкцією StarDesktop.CurrentComponent (див. тут).

Проте усякі намагання звернутися до елементів керування за допомогою методу чи властивості на кшталт GetControl(“TextBox1”), як це відбувається з елементами діалога, приречені на невдачу. Справа в тому, що в ООо Basic немає можливості “розкидати” елементи керування “де завгодно”, як це дозволяє VBA в Microsoft Office. Тут елементи керування “приписані” або до діалога, або до форми, яка є своєрідним аналогом діалога для елементів керування в документі. Поняття форми ООо Basic (LibreOffice Basic) значною мірою схоже до аналогіного поняття в htmt, щопрада, в повній мірі підтримується лише в Writer та Calc.

Форма належить до графічних елементів документа, тому звертання до неї потребує звертання DrawPage до графічного рівня документа. Форм у документі може бути декілька, отже, вибрати потрібну форму із колекції Forms можна методами GetByIndex() або GetByName(). В нашому прикладі форма одна і, очевидно, матиме номер 0, тому скористаємося конструкцією Forms.GetByIndex(0). У підсумку, для звертання до елементів керування отримуємо такий префікс із вкладених об’єктів:

StarDesktop.CurrentComponent.DrawPage.Forms.GetByIndex(0).

Перед написанням макроса слід звернути увагу ще на одну важливу деталь — імена елементів (вікно властивостей одного поля), оскільки вони будуть аргументами для методу GetByName(), який, власне, і використовується для звертання до об’єкта всередині форми. В нашому прикладі поле для вводу радіуса назване “Текстове поле 1”, а поле для виводу площі круга “Текстове поле 2”. Зрозуміло, що ці назви можна змінити, але тоді відповідні зміни потрібно буде внести в приведений нижче код макроса. Використавши властивість Text для читання вмісту текстового поля та функцію CSng() для перетворення його в числове значення, отримаємо такий код:

Sub MainButtonClick
r = CSng(StarDesktop.CurrentComponent.DrawPage.Forms.GetByIndex(0). _
GetByName(“Текстове поле 1”).Text)
S = Pi()*r^2
StarDesktop.CurrentComponent.DrawPage.Forms.GetByIndex(0). _
GetByName(“Текстове поле 2”).Text = S
End Sub

Залишилося не забути:

  • створити модуль, бажано (хоча і не обов’язково) в бібліотеці цього ж документа і записати в ньому наведений вище код;
  • призначити макрос MainButtonClick на подію “Виконати” у властивостях розміщеної в документі кнопки;
  • вийти з режиму редагування форми перемикачем “Режим розробки” на панелі “Елементи керування”.

Mожна переходити до тестування створеного “проекту”.

На завершення хотілося б зазначити, що з повним текстом згаданої на початку статті “Visual Basic – незрівнянні переваги та інше” можна озайомитися на сайті hlynsky.lviv.ua а також подякувати її автору за популяризацію Visual Basic в українській освіті, а також за ідею цього прикладу використання макросів.

Залишити відповідь