Скачать RAR архив. 135Kb | ||
« Глава 1 | Оглавление | Глава 3 » |
Глава 2
Итак, продолжим. Для создания адресной книги, в которой мы будем хранить названия компьютеров и комментарии к ним, нам нужно создать небольшую базу данных. Для этого мы используем файл таблиц Dbase (*.dbf). Скачайте утилиту DBU, поместите ее в каталог C:\project\message\ и запустите. Откроется окно C:\project\message\DBU.EXE (Рис. 1)
Нажмите F3, выберите пункт "Создать структуру", и введите название первого поля: "USER", нажмите Enter для перехода курсора. Теперь нужно выбрать тип поля. Для хранения строковых данных используется тип Character. Чтобы его выбрать, нажмите C (латинская). В поле "Ширина" введите 18 - как правило, компьютеры не называют даже такими длинными именами, поэтому нам хватит 18 символов для хранения имени компьютера. Нажмите стрелку вниз для перехода на следующую строку. Введите: имя поля "COMMENT" - короткий комментарий к имени компьютера, тип поля "Character", ширина поля 64 (рис. 2). Нажмите F4 и выберите пункт "Записать структуру". Введите имя файла "USERS.DBF" и нажмите Enter 2 раза.
Теперь нам нужно соединиться с базой данных (БД) в момент загрузки нашего приложения. Для этого нам нужно создать источник данных ODBC, через драйвер которого будет происходить взаимодействие PowerBuilder и программы с БД. Для этого на панели инструментов PowerBuilder нажмите на иконку . В открывшемся окне "Database Profiler" откройте ветку "ODBC", а в ней ветку "Utilities". Двойным щелчком выберите пункт "ODBC Administrator" (Рис. 3).
В открывшемся окне на закладке "User DSN" нажмите кнопку "Add". Выберите пункт "Microsoft dBase VFP Driver (*.dbf)" и нажмите "Ok". В поле "Data Source Name" внесите "Mess" - это будет название нашего источника данных. В поле "Description" внесите комментарий: "Источник данных для программы "Message"". Установите точку в поле "Free Table Directory", а в поле "Path" внесите путь к нашей программе - "C:\project\message\". Нажмите "Ok". Источник данных готов. |
![]() Рис. 3 |
|
Теперь нам нужно создать профиль для подключения PowerBuilder к базе данных в процессе разработки приложения. Для этого в окне "Database Profiler" выберите пункт "ODBC" и нажмите кнопку "New". В появившемся окне "Database Profile Setup - ODBC" на закладке "Connection" в поле "Profile Name" внесите название профиля - "Mess". В выпадающем списке "Data Source" выберите созданный источник ODBC - "Mess" , а в полях "User ID" и "Password" снимите флажки (Рис. 4). Нажмите кнопку "Ok", а в окне "Database Profiler" подсветите пункт "Mess" и нажмите кнопку "Connect". Все, источник и профиль готовы, соединение с БД установлено, можно работать дальше. |
![]() Рис. 4 |
Теперь нам нужно сделать две вещи: "научить" программу соединяться с БД во время выполнения и динамически создавать источник ODBC, если он по каким-то причинам отсутствует. Начнем со второго. Откроем окно "Application Painter", перейдем в секцию объявлений и в выпадающем списке выберем пункт "Global Variables". Объявим две глобальные переменные строкового типа:
В этих переменных мы будем хранить пути системного каталога Windows и нашей программы. За счет того, что мы объявили переменные в секции глобальных переменных, они будут доступны нам из любой точки приложения.
Теперь нам нужно объявить две функции Windows API1, с помощью которых мы сможем присвоить значения этим переменным. Для этого в секции объявлений в выпадающем списке выберем пункт "Global External Functions". Объявим функции GetSystemDirectory - получение пути к системному каталогу Windows и GetCurrentDirectory - получение пути, по которому запущено наше приложение:
Сохраните сделанные изменения. Теперь напишем функцию, которая будет динамически создавать источник ODBC, если программа его не обнаружит. Выберите в левом выпадающем списке пункт "Functions", а в правом выпадающем списке пункт "New Function". Определим параметры функции:
![]() |
Return Type = Boolean |
![]() |
Function Name = Create_DSN |
Сохраним изменения и разберемся, как будет работать эта функция. В блоке (1) мы объявляем переменную syskey строкового типа и переменную err целочисленного типа длинное целое, равную нулю. В блоке (2) мы с помощью оператора Space() заполняем глобальную переменную sysdir пробелами в количестве 255. Дальше мы вызываем глобальную функцию Windows API GetSystemDirectory, которая возвращает в переменную sysdir путь к системному каталогу Windows, и "дописываем" в эту переменную имя файла драйвера, через который и происходит взаимодействие между программой и БД. В блоке (3) мы записываем в переменную syskey имя раздела системного реестра Windows, в котором будет храниться информация обо всех параметрах нашего источника ODBC - Mess.
В блоке (4) мы прибавляем к переменной err значения, возвращаемые оператором RegistrySet. Этот оператор производит запись данных в системный реестр Windows. Рассмотрим его параметры:
RegistrySet ( key, valuename, valuetype, value )
Key - ключ реестра в который производится запись
Valuename - имя параметра который записывается
Valuetype - тип данных параметра
Value - значение пераметра
Возвращаемые значения оператора RegistrySet это 1 в случае
удачной записи и -1 в случае ошибки.
Так как мы использовали оператор RegistrySet 11 раз, то в блоке (5) мы проверяем, все ли 11 раз оператор вернул 1. Если это так, то функция возвращает значение true (истина). Если же в один из вызовов произошла ошибка и оператор хотя бы один раз вернул значение -1, то значение переменной err не будет равно 11 и функция возвращает значение false (ложь).
Перейдем к первой задаче - напишем код, который будет производить соединение с БД в момент запуска приложения. Внесем нижеприведенный код в событие Open объекта приложения (класс Application) Mess перед строчкой Open (w_main). Сохраним внесенные изменения и рассмотрим, как работает этот код. В блоке (1) мы с помощью внешней функции Windows API GetCurrentDirectory получаем в переменную curdir путь к каталогу, из которого была запущена наша программа. В блоке (2) мы заполняем свойства глобального базового объекта структуры SQLCA, которая используется для хранения информации о соединении с БД, и с помощью оператора соединения с БД connect соединяемся с БД. Обратите внимание, что сразу после оператора connect стоит точка с запятой - это синтаксис вызовов языка SQL2 в Power Builder. После выполнения оператора connect в свойство sqlcode объекта SQLCA возвращается код операции. В случае удачного соединения код равен нулю. В блоке (3) мы проверяем, какое значение вернулось и, если оно не равно нулю, предполагаем, что источник ODBC отсутствует или неправильно настроен. В этом случае мы вызываем нашу функцию create_dsn(), которая создает источник, и повторяем попытку соединиться с БД. В блоке (4) мы вновь проверяем, какое значение вернулось после операции соединения, и если оно вновь не равно нулю, сообщаем пользователю, что не можем соедениться с БД и часть функций программы будет недоступна.
Теперь пришла пора создать справочник адресатов. Создаем новое окно и устанавливаем ему следующие параметры:
Сохраним окно под именем w_addr. На окне расположим элементы управления: |
![]() Рис. 5 |
Data Window dw_1, Command Button cb_add ("Добавить"), Command Button cb_delete ("Удалить") и Command Button cb_cancel ("Отмена") (Рис. 5). В событие Clicked() кнопки cb_cancel внесем код закрытия окна.
Теперь нам нужно создать объект Data Window, который мы будем использовать. Для этого через меню "File New" открываем диалог создания объектов и на закладке "DataWindow" выбираем иконку "Grid". Откроется окно мастера создания DataWindow. Выбираем иконку "SQL Select" и нажимаем "Next". Откроется окно Data Window Painter и окошко Select Tables. В нем мы выбираем таблицу нашей БД - USERS и нажимаем "Open". Таблица откроется в области Table Layout Selection List окна Data Window Painter в графическом представлении. Кликами мыши подсветите оба поля таблицы - USER и COMMENT. Нажмите иконку
на панели инструментов.
Во вновь открывшемся окне мастера создания DataWindow нажмите "Next" и "Finish". Мы вернулись в окно Data Window Painter, в область Design (Рис. 6). Итак, основа для объекта Data Window создана, теперь нужно придать ему надлежащий внешний вид и определить нужные нам свойства и параметры. Для начала сохраним объект под именем dw_1. Дальше нам нужно "русифицировать" поля Data Window. Для этого по очереди выделяем их кликом мыши и выставляем в панели инструментов шрифт MS Scan Serif. Далее переименовываем заголовки столбцов "User" и "Comment" в "Адресат" и "Описание". Теперь идем в меню "Rows
Update properties" и в открывшемся окне устанавливаем свойства:
А так же в списке полей "Updateable Columns" выбираем оба поля - USERS и COMMENT, а в списке "Unique Key Column(s)" - только USERS. Теперь нужно установить порядок перехода для полей USERS и COMMENT в области Detail и установить для поля USERS свойство Protect = 1. Для этого на закладке свойств |
![]() Рис. 6 |
![]() |
DataObject = dw_1 |
![]() |
HscrollBar |
![]() |
VscrollBar |
![]() |
LiveScroll |
Сохраним изменения. Теперь перейдем к коду события Open() окна w_addr и внесем туда следующий код:
В первой строке мы центруем окно на экране. Во второй строке с помощью метода SetTransObject() мы указываем DataWindow, что соединение с БД происходит через SQLCA. В третьей строке мы с помощью метода Retrieve() даем DataWindow команду отобразить строки, содержащиеся в БД.
Теперь давайте закодируем событие Clicked() объекта cb_delete.
Сохраним изменения и рассмотрим работу кода. В блоке (1) определяем переменные. В строке (2) запрашиваем у dw_1 текущую строку с помощью метода GetRow(). В строке (3) проверяем, что строка существует. Если это не так, прерываем обработку события. В строке (4) записываем в переменную usr имя компьютера адресата которого пользователь захотел удалить. В строке (5) мы формируем и записываем в переменную ask запрос на подтверждение удаления записи. В строке (6) мы с помощью функции MessageBox спрашиваем у пользователя, уверен ли он в удалении записи. Если пользователь не подтверждает удаление (нажимает кнопку "Нет"), функция MessageBox возвращает 2 и обработка события прерывается командой Return. Если мы попали в строку (7), значит пользователь подтвердил удаление записи, и мы удаляем строку из dw_1 с помощью метода DeleteRow(), указывая в качестве аргумента переменную row, которая содержит номер удаляемой строки. Теперь нужно удалить запись непосредственно из БД. Это мы оставляем на откуп механизму Data Window и просто даем команду на сохранение изменений методом Update() в строке (8).
Теперь пора подумать и о добавлении адресатов в БД. Для этого нам потребуется еще одно окно. Создадим его и выставим ему следующие параметры:
|
![]() Рис. 7 |
![]() |
Text = Имя компьютера |
![]() |
Text = Описание |
![]() |
Limit = 18 - в поле ввода можно ввести не более 18 символов. |
![]() |
Limit = 64 - в поле ввода можно ввести не более 64 символов. |
![]() |
Default |
![]() |
Cancel |
Теперь напишем обработку событий для этого окна.
Событие Open() окна:
Событие Clicked() кнопки cb_cancel:
Событие Clicked() кнопки cb_ok:
Сохраним изменения и разберем принцип работы последнего фрагмента кода.
В блоке (1) мы объявили переменные и присвоили им значения, полученные из свойства Text полей ввода. В строке (2) мы проверяем, заполнил ли пользователь имя компьютера адресата, а так же проверяем значение переменной на Null. Если пользователь не заполнил поле "Имя компьютера", то скажем ему об этом. В строке (3) мы проверяем на Null значение переменной comm. И если оно равно Null, присваиваем ей пустую строку. В строке (4) мы обращаемся к объекту dw_1, принадлежащего окну w_addr, и используем оператор InsertRow() с параметром 1 для того, чтобы вставить в Data Window строку с номером 1. В строке (5) мы вставляем в первую строку в поле "user" значение переменной usr, а в строке (6) вставляем значение переменной comm в поле "comment". В строке (7) мы сохраняем изменения в БД и закрываем окно в строке (7).
Теперь вставим вызов окна w_insert в событие Clicked() объекта cb_add окна w_addr:
Осталось совсем немного. Вставим обработку в событие DoubleClicked() объекта dw_1 окна w_addr:
Вставим вызов окна w_addr в событие Clicked() кнопки cb_user окна w_main.
Сохраним сделанные изменения и запустим программу. Теперь функционал программы готов. Программа имеет легко редактируемую адресную книгу и отсылает сообщения адресатам в локальной сети. Интерфейс программы конечно не образец совершенства, но он удобен, функционален и интуитивно понятен для пользователя. Итак, можно компилировать исполняемый EXE - файл программы. Для этого через меню "File New" открываем диалог создания объектов и на закладке "Project" выберем иконку "Application". Откроется окно "Project Painter".
В следующей главе мы улучшим интерфейс программы и создадим меню настроек для пользователя.
IKAR, Программист-разработчик PowerBuilder. IkarHomeCenter@narod.ru |
GSS, Программист-разработчик PowerBuilder. gss_work@zmail.ru |
1 Windows API - Windows Application Programming Interface - специальный функционал Windows который может быть вызван из приложения не являющегося компонентом Windows и позволяющий использовать стандартные формы, диалоги, функции и прочие элементы операционной системы.
Вернуться к тексту^
2 SQL - Structured Query Language - структурированный язык запросов.
Вернуться к тексту^