Базовое окно приложения
Это объект, созданный путем наследования от объекта window, содержащий объект DataWindow и объект menu.
Нажмите на добавленном объекте правую кнопку мыши и выберете пункт Properties. В закладке General окна Properties необходимо установить его свойства:
- Измените имя с dw_1 на dw_sheet.
- Включите checkbox HscrollBar, VscrollBar и Resizable.
Т.к. объект w_base_dw является базовым и не будет использован как отдельный объект приложения, его не надо связывать ни с одним объектом DataWindow.
Объявление переменных
В окне Script художника Window в разделе Declare напишите следующее:
boolean ib_edit
Вы объявили булевскую переменную. В языке PowerScript булевские переменные инициализируются значением false.
Скрипты объекта w_base_dw
Событие open
dw_sheet.settransobject(sqlca) Postevent("ue_retrieve_data")
Метод settransobject сообщает объекту dw_sheet, что данные из базы данных будут получены, используя информацию о соединении, записанной в объекте SQLCA.
Метод postevent объекта window ставит событие в очередь событий объекта. Т.к. метод вызван из скрипта объекта, его владелец не указан, т.е. по умолчанию считается, что владельцем метода является объект, из скрипта которого вызван метод. Пока у нас нет события ue_retrieve_data окна w_base_dw, но при работе приложения ошибки не возникнет, т.к. если реакция на данное событие на описана, объект событие игнорирует.
Событие ue_retrieve_data
Необходимо создать пользовательское событие ue_ retrieve_data. Для этого необходимо выполнить следующие действия:
- Открыть окно Script художника Window.
- В левом выпадающем окне выбрать объект w_base_dw.
- Из второго слева выпадающего меню выбрать New Event.
- В строку Event Name вписать ue_ retrieve_data, не менять поле Event Id.
- Нажать кнопку Show/Hide Prototype в правой верхней части окна.
Обратите внимание, что пользовательское событие можно быть привязано к событию происходящему вне приложения, например, нажатию клавиши или событию, созданному другим приложением. Для привязки пользовательского события служит поле Event Id.
Событие будет вызвано сразу после открытия окна. В базовом окне оно останется пустым.
Событие ue_insert
Создайте событие ue_insert окна w_base_dw, также, как и событие ue_retrieve_data.
Скрипт события:
long ll_row Postevent('ue_edit') ll_row = dw_sheet.insertrow(dw_sheet.getrow()); dw_sheet.scrolltorow(ll_row) dw_sheet.setrow(ll_row)
Объявляем переменную типа long, посылаем событие ue_edit, добавляем строку в список клиентов на месте нахождения курсора, перемещаем на эту строку курсор, устанавливаем на строку выделение, сообщаем окну, что редактирование резрешено.
Событие ue_delete
Создайте событие ue_delete окна w_base_dw, также, как и событие ue_retrieve_data.
Скритп события:
long ll_row ll_row = dw_sheet.getrow() if ll_row = 0 then return dw_sheet.deleterow(ll_row) ll_row = dw_sheet.getrow() if ll_row = 0 then ll_row = dw_sheet.rowcount() if ll_row = 0 then return end if dw_sheet.scrolltorow(ll_row) dw_sheet.setrow(ll_row) dw_sheet.selectrow(ll_row, true) ib_edit = true
Событие ue_edit
Создайте событие ue_eidt окна w_base_dw, также, как и событие ue_retrieve_data. В этом событии мы должны разрешить редактирование полей окна данных, т.е. расставить значения Tab Order:
int li_clmn_cnt int li_i li_clmn_cnt = double(dw_sheet.Object.DataWindow.Column.Count) for li_i = 2 to li_clmn_cnt dw_sheet.settaborder(li_i, li_i) next ib_edit = true
Событие ue_save
Создайте событие ue_save окна w_base_dw, также, как и событие ue_retrieve_data.
Скрипт события:
if not ib_edit then return if dw_sheet.accepttext() = -1 then messagebox('Внимание!', 'Ошибка при вводе текста!', StopSign!) return end if if dw_sheet.ModifiedCount() + dw_sheet.DeletedCount() > 0 then if messagebox("Внимание!", 'В процессе работы были произведены " & + "изменения.~r~n" & + "Сохранить изменения?', Question!, YesNo!) = 2 then return; triggerevent('ue_save') ; end if; int li_clmn_cnt int li_i li_clmn_cnt = double(dw_sheet.Object.DataWindow.Column.Count) for li_i = 2 to li_clmn_cnt dw_sheet.settaborder(li_i, 0) next ib_edit = false
Метод accepttext объекта DataWindow сохраняет все изменения, сделанные пользователем, в окне данных. Метод update объекта DataWindow сохраняет изменившиеся данные в базе данных.
Commit заканчивает транзакцию. После него обязательно должна стоять точка с запятой. После сохранения данных необходимо проверить код завершения операции, что и делает пользовательская глобальная функция gf_error().
Событие resize
dw_sheet.resize( this.WorkSpaceWidth() - 20 - dw_sheet.x, & this.WorkSpaceHeight() - dw_sheet.y - 20)
Данный скрипт изменяет размер окна данных dw_sheet при изменении размеров окна w_base_dw.
Событие closequery
Это событие вызывается перед закрытием окна.
Скрипт события:
If not ib_edit then return if dw_sheet.accepttext() = -1 then return if dw_sheet.ModifiedCount() > 0 then if messagebox("Внимание!", 'В процессе работы были произведены " & + "изменения.~r~nСохранить изменения?', & Question!, YesNo!) = 2 then return triggerevent('ue_save') end if;
Скрипт проверяет объект dw_sheet и, если он редактировался, но не был сохранен, открывает окно с запросом и сохраняет данные при подтверждении запроса.
Метод triggerevent немедленно инициирует указанное событие, а не ставит его в очередь, как метод postevent. Работа скрипта будет продолжена только после завершения работы скрипта события, вызванного triggerevent. Если у объекта нет такого события, ошибки при выполнении не возникнет.
Скрипты объекта dw_sheet
Событие rowfocuschanged
dw_sheet.selectrow(0, false) dw_sheet.selectrow(dw_sheet.getrow(), true)
Скрипт выделяет текущую строку окна данных при перемещении по нему курсора.
Событие clicked
if row > 0 then dw_sheet.selectrow(0, false) dw_sheet.selectrow(row, true) dw_sheet.scrolltorow(row) dw_sheet.setrow(row) end if
Нажатие левой клавиши мыши на окне данных. Скрипт выделяет строку, на которой находится курсор мыши.
Заметьте, что переменная row не объявлена в скрипте, т.к. она является параметром события cklicked и равна номеру строки объекта dw_sheet, на котором находится курсор мыши.
Событие DBError
Если возникает ошибка при обращении к базе данных (retrieve, update), PowerBuilder генерирует сообщение DBError. Если вы напишите обработчик данного события, PowerBuilder все равно выдаст информационное окно с сообщением об ошибке, но оно может быть менее удобно для пользователя.
Messagebox('Ошибка при работе с базой данных', & "Код " + & "ошибки: "+string(sqldbcode) & + "~r~nСообщение об ошибке: " + sqlerrtext, StopSign!)
Sqldbcode и sqlerrtext - стандартные параметры события. Символ "&" используется для переноса строки.