Базовое окно приложения

Это объект, созданный путем наследования от объекта window, содержащий объект DataWindow и объект menu.

Нажмите на добавленном объекте правую кнопку мыши и выберете пункт Properties. В закладке General окна Properties необходимо установить его свойства:

  1. Измените имя с dw_1 на dw_sheet.
  2. Включите 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. Для этого необходимо выполнить следующие действия:

  1. Открыть окно Script художника Window.
  2. В левом выпадающем окне выбрать объект w_base_dw.
  3. Из второго слева выпадающего меню выбрать New Event.
  4. В строку Event Name вписать ue_ retrieve_data, не менять поле Event Id.
  5. Нажать кнопку 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 - стандартные параметры события. Символ "&" используется для переноса строки.