zabika.ru 1

И.А.Хахаев, Е.В.Смородина


Бухгалтерия и OpenOffice.org BASIC

Иван Хахаев, Елена Смородина

Формы на листах и диалоги


Использованная в предыдущей главе панель инструментов «Элементы управления» позволяет создавать не только кнопки, но и другие элементы графического пользовательского интерфейса — поля ввода, раскрывающиеся списки, переключатели и т.д. Все эти элементы управления, размещённые на листе (странице) документа, образуют так называемую «Форму».

В этой главе поэкспериментируем с такими элементами управления в документе (в электронной таблице), а также рассмотрим специальные объекты OpenOffice.org Basic для организации пользовательского интерфейса — диалоги. Естественно, все элементы форм и диалогов будут обрабатываться макросами.

Экспериментировать будем опять-таки на задачах вывода и ввода текста в ячейках электронной таблицы. Используем уже многократно упоминавшийся документ example2.ods.

С помощью панели инструментов «Элементы управления», включённой в режиме разработки формы, добавляем на лист ЭТ элементы управления «Метка» и «Текстовое поле» и размещаем их примерно так, как показано на рис. 1.



Рисунок 1. Добавление элементов управления на лист ЭТ



Метка должна получить своё название из ячейки B1, а в ячейку B4 нужно записать текст из текстового поля.

Соответствующие макросы назовём primer5 и primer6 и сохраним их в документе example2.ods.

Sub primer5

Dim oDoc, oSheet, FPage, oForm, oCell As Object

Dim s1 As String

oDoc=ThisComponent

oSheet=oDoc.Sheets(0)

oCell=oSheet.getCellByPosition(1,0) ' ячейка B1

s1=oCell.getString

FPage=oSheet.DrawPage ' переходим в слой рисования


' элементы управления форм располагаются в слое рисования

oForm=FPage.Forms.getByIndex(0) ' выбираем первую

' и единственную) форму

oForm.LabelField.Label=s1 ' устанавливаем текст метки

' из ячейки B1

End Sub

Комментарии в этом коде вполне достаточны для понимания смысла происходящего.

Возникает вопрос: а почему метка называется LabelField и почему нужно изменять именно свойство Label?. А дело в том, что название объекта, соответствующего элементу управления, можно увидеть в диалоге настройки свойств элемента управления. Что же касается свойств объекта, то их можно узнать, вызвав где-нибудь внутри макроса «секретную» команду

MsgBox <ИмяОбъекта>.dbg_properties (в частности, например,

MsgBox oForm.LabelField.dbg_properties)

Аналогично можно узнать и все методы (функции), которые поддерживаются в каком-либо объекте, вызвав для него метод dbg_methods (как это было сделано в главе «С чего начать?»).

А вот код, который записывает в ячейку ЭТ текст из текстового поля:

Sub primer6

Dim oDoc, oSheet, FPage, oForm, oCell As Object

Dim s1 As String

oDoc=ThisComponent

oSheet=oDoc.Sheets(0)

oCell=oSheet.getCellByPosition(1,3) ' ячейка B4

s1=oCell.getString

FPage=oSheet.DrawPage ' переходим в слой рисования

' элементы управления форм располагаются в слое рисования

oForm=FPage.Forms.getByIndex(0) ' выбираем первую

' (и единственную) форму

s1=oForm.TextBox.Text ' выбираем текст из поля ввода

oCell.setString(s1) ' устанавливаем текст в ячейке

End Sub

Для того, чтобы эти макросы заработали, переопределим кнопки «Вывести текст» и «Ввести текст» на выполнение соответствующих макросов. Работа с элементами управления иллюстрируется рис. 2. На нём, кстати, хорошо видно, что элементы управления формы располагаются «над» листом электронной таблицы (указатель активной ячейки перемещается под слоем с элементами управления).




Рисунок 2. Форма с работающими элементами управления



А теперь попробуем создать собственное диалоговое окно (диалог), с помощью которого будем производить те же операции по получению текста из ячейки в качестве текста метки и записи в ячейку текста из текстового поля ввода.

Для этого в IDE (в окне с текстом макросов) выберем в главном меню пункт «Сервис» и откроем окно управления диалогами («Сервис/Макросы/Управление диалогами...»). В результате получим окно, показанное на рис. 3.



Рисунок 3. Окно управления диалогами



Нажатие на кнопку «Новый диалог...» приведёт к появлению запроса о названии нового диалога (рис. 4). Это называние будет использоваться как имя объекта в макросах, поэтому желательно писать это имя латиницей (английскими буквами).



Рисунок 4. Определение имени нового диалога



Оставим автоматически предлагаемое имя Dialog1 после нажатия на ОК перейдём к следующему этапу создания диалога.

Вновь созданный диалог появляется в окне управления диалогами (рис. 5), и появляется возможность редактирования нового диалога (кнопка «Правка» на рис. 5).



Рисунок 5. Новый диалог в окне управления диалогами


Нажатие на кнопку «Правка» откроет пустой диалог (безо всяких элементов интерфейса) в окне IDE (рис. 6). Следует обратить внимание, что теперь в окне IDE имеются два листа — лист макросов (Module1) и лист диалога Dialog1. На листе макросов может быть сколько угодно различных макросов, а на листе диалога может быть только один диалог.


Для добавления на заготовку диалога различных элементов управления используется кнопка «Вставить элементы управления», находящаяся в центре нижней панели инструментов прямо над полем диалога. Нажатие на эту кнопку приводит к раскрытию соответствующей плавающей панели инструментов, которую можно «отцепить» и передвинуть в любое удобное место, удерживая мышь на полоске в верхней части этой панели (рис. 7).



Рисунок 6. Пустой диалог в IDE





Рисунок 7. Пустой диалог и плавающая панель элементов управления



Для этого пустого диалога в таком «визуальном» режиме можно установить размер, задать текст заголовка, цвет фона и другие параметры. Чтобы получить такую возможность, нужно щёлкнуть левой кнопкой мыши по верхней границе заготовки диалогового окна и выделить это окно (рис. 8).



Рисунок 8. Выделение диалогового окна в режиме визуальной разработки



Щелчок по кнопке «Свойства» в плавающей панели элементов управления откроет диалог настройки параметров выделенного объекта (рис. 9). Аналогичный эффект даст выбор пункта «Свойства...» в контекстном меню выделенного диалогового окна, вызываемого щелчком правой кнопкой мыши.



Рисунок 9. Настройка диалогового окна в режиме визуальной разработки


Все параметры диалога можно устанавливать и с помощью макросов, и пример такого определения параметров будет приведён чуть дальше.


Теперь поместим на заготовку диалога метку, текстовое поле ввода и две кнопки, например, как на рис. 10.



Рисунок 10. Размещение элементов управления на заготовке диалога



Для выравнивания элементов управления в поле проектируемого диалогового окна следует использовать свойства «Позиция X» и «Позиция Y», вызвав соответствующее окно настройки с помощью правой кнопки мыши.

Кнопка с изображение карандаша и треугольника, которая при создании формы на листе электронной таблицы включала режим разработки формы, теперь (при разработке диалога) включает тестовый режим, то есть даёт возможность «прорепетировать» работу диалога. Пока наш диалог ничего не делает, можно просто посмотреть, как он будет выглядеть в «рабочем» виде (рис. 11).



Рисунок 11. Реальный вид разрабатываемого диалога



Кнопки переименовываются точно так же, как и в форме на листе ЭТ, поэтому не будем на этом останавливаться.

Итак, наша задача — получить текст метки из ячейки B1 при нажатии верхней кнопки и записать текст из поля в ячейку B4 при нажатии нижней кнопки.

На заготовке диалога переименуем кнопки — верхнюю назовём «Вывести текст», а нижнюю — «Ввести текст».

Для макросов, обеспечивающих обработку диалога, создадим новый модуль. Он создаётся и переименовывается аналогично созданию и переименованию листов ЭТ, только делать это нужно в IDE.

Ниже приводится текст, обеспечивающий работу кнопок этого диалога (документ example2.ods, модуль DialogExamples).

Dim oDialog As object
Sub StartDialog

oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)


oDialog.execute

End Sub
Sub chlabel

Dim oDoc, oSheet, oCell, oLabel As Object

Dim s1 As String

oDoc=ThisComponent

oSheet=oDoc.Sheets(0)

oCell=oSheet.getCellByPosition(1,0)

s1=oCell.getString

oLabel=oDialog.getControl("Label1")

oLabel.Text=s1

End Sub
Sub chtext

Dim oDoc, oSheet, oCell, oCtrl As Object

Dim s1 As String

oDoc=ThisComponent

oSheet=oDoc.Sheets(0)

oCell=oSheet.getCellByPosition(1,3)

oCtrl=oDialog.getControl("TextField1")

s1=oCtrl.Text

if s1="" then

MsgBox "Нельзя записывать пустую строку!"

else

oCell.setString(s1)

end if

End Sub

Объект oDialog объявляется вне тел макросов, поэтому эта переменная в пределах модуля доступна для всех процедур и функций.

Макрос StartDialog необходим для вызова диалога. Его можно связать с кнопкой на листе ЭТ, тогда диалог будет появляться при нажатии этой кнопки.

Кнопку «Вывести текст» в диалоге свяжем с макросом chlabel, и при нажатии этой кнопки текст из ячейки B1 ЭТ станет текстом метки.

Соответственно, кнопка «Ввести текст» связывается с макросом chtext. Здесь предусмотрена проверка на наличие текста в текстовом поле. Если текста нет, появляется предупреждение об ошибке.


/