|
Sybase
|
|
|
|
|
Продукты
|
|
|
|
|
Сообщества
|
|
|
|
|
Меню
|
|
|
|
|
Вход
|
|
|
|
|
Рассылка
|
|
|
|
|
Статистика
|
|
|
|
|
Работа с DataWindow bands
|
Работа с DataWindow bands
Работа с DataWindow bands
Вы уже вероятно знаете, как DataWindow использует bands. Возможно, вам не известно, что ими можно динамически манипулировать
в runtime, добавляя целые новые "измерения" в поведение DataWindow. Сфокусируемся здесь на DataWindow bands и как
динамически менять их свойства.
DataWindow всегда должно содержать следующие bands:
- Header - вверху каждой страницы.
- Detail - одна строка на одну запись.
- Footer - внизу каждой страницы.
- Trailer - в конце отчета.
Для большинства PowerBuilder приложений использование и поведение перечисленных bands является достаточно простым и мы не
будем здесь останавливаться на основах. В отдельных случаях вы захотите изменить поведение по умолчанию для DataWindow bands:
- Скрыть header на всех страницах за исключением первой.
- Условно подавить линию detail.
- Получить номер строки, когда пользователь щелкает указателем мыши на group header или на footer.
Свойства bands могут быть динамически изменены через непосредственное манипулирование объектом или используя Modify функцию
DataWindow. При этом, синтаксис будет следующим:
dw_control.Object.DataWindow.bandname.property |
- для "дот" нотации.
DataWindow.bandname{.#}.property { = value } |
- для аргументов в Discribe или Modify функциях.
Свойства bands интуитивно понятны и хорошо документированы в справке по PowerBuilder. Мы не будем вам надоедать, перечисляя
здесь все из них. Однако, следует обратить внимание на то, как Modify функция отличается от синтаксиса "дот" нотации. Заметьте, что
Modify функция содержит #. Это указывает число header или trailer группы (если ваше DataWindow содержит
группы). В "дот" нотации числа групп не могут быть заданы. В других обстоятельствах, "дот" нотация эквивалентна использованию Modify
функции.
Изменение Header
Первое важное свойство Header есть его высота (height). Высота данного объекта может быть динамически изменена с помощью
скрипта. Например:
dw_1.Modify("DataWindow.header.height = 0") |
В этом коде Header закрыт (его высота равна нулю). Если исполнить этот код, весь Header исчезнет. Что хорошего это может
дать? Иногда бывает полезно условно подавить Header. Например, если есть DataWindow с большим количеством информации в
Header, вы можете захотеть показать ее только на первой странице. Следующий код, исполняемый в событии ScrollVertical для
DataWindow, поможет нам в этом:
Integer li_Row
String ls_rc
li_row = Integer(dw_1.object.DataWindow.FirstRowOnPage)
ls_rc = dw_1.Describe("evaluate('page()'," + String(li_Row) + ')')
// ib_SkipScroll и ii_Row - Instance переменные
if ib_SkipScroll = true then
return
else
ib_SkipScroll = false
end if
if Integer(ls_rc) > 1 then
ii_Row = Integer(dw_1.object.DataWindow.LastRowOnPage)
st_1.text = String(ii_Row)
dw_1.Modify("DataWindow.header.height = 0")
ib_SkipScroll = true
dw_1.ScrollToRow(ii_Row)
end if |
Когда пользователь просматривает это DataWindow, любой объект в Header показывается только на первой странице. Следует
заметить, что Evaluate функция передается в качестве аргумента в Discribe. Таким образом, DataWindow функция
page() может быть использована в коде. Также выделим instance переменную ib_SkipScroll. Каждый раз, когда высота
Header устанавливается в ноль, DataWindow перемещается к первой строке. Очевидно, нужно предотвратить это. В предпоследней
строчке кода исполняется ScrollToRow фактически перемещающая к последней строке на странице. ScrollToRow запускает событие
ScrollVertical, которое, в свою очередь, хм... ну вы видите. Boolean переменная используется, чтобы предотвратить бесконечный
цикл. Также важно заметить, что height свойство для Header не может быть установлено в DataWindow expression. Когда вы
меняете высоту Header, вы должны это делать в вашем коде.
Этот метод работает хорошо, когда нужно, чтобы Header был скрыт на всех страницах, кроме первой, когда пользователь просматривает
отчет, но при печати он был бы виден на всех страницах.
Когда же есть необходимость скрыть Header и визуально, и при печати, есть более простое решение. Из DataWindow Painter
выполните следующее:
1. Переместите все объекты, которые обычно свойствены Header в Detail.
2. Закройте Header.
3. Удостоверьтесь, что в Detail свойство Autosize Height выбрано.
4. Все объекты, которые показываются только на первой странице, должны содержать в свойстве Visible выражение, делающее их
невидимыми в каждой строке за исключением первой:
5. Все объекты, которые будут показываться на каждой строке, в Y свойстве должны иметь выражение, передвигающее объект выше по его
y - оси, когда он показывается на первой строке:
if( getrow() = 1, 264, 1 ) |
Заглушение Detail
Предыдущий пример демонстрировал, как свойство autosize может быть использовано для корректировки ограничений Header.
Особенно Autosize Height используется для расширения высоты строки, чтобы показать содержание строки и установить минимальный размер
для всех строк в Detail. Обычно, когда Detail с автоматической регулировкой размера, программист устанавливает его высоту в
ноль, так как DataWindow расширяет его, если необходимо. Минимальная высота это высота, установленная программистом в design
time. Следует помнить, что когда Detail с изменяемым размером, процесс изменения размера делает его больше, никогда меньше.
Держа это в голове, вам следует уметь подавлять Detail, в зависимости от нужных критериев. Например, если пользователь
MANAGER, позвольте ему видеть записи по каждому служащему, а если пользователь PEON, показывать только служащих, которые
зарабатывают меньше чем $40,000 в год. Чтобы скрыть строки от PEONs, добавьте следующий скрипт в событие RetrieveEnd для
DataWindow:
// Закрыть Detail и установить Autosize
dw_1.Modify("DataWindow.detail.height = 0")
dw_1.Modify("DataWindow.detail.height.autosize = 'Yes' ")
// Добавить выражения в столбцы в Detail.
// Height = 0. Если зарплата больше $40,000
dw_1.Modify("emp_lname.height='56 ~t if( salary > 40000, 0, 56 )'")
dw_1.Modify("emp_fname.height='56 ~t if( salary > 40000, 0, 56 )'")
dw_1.Modify("salary.height='56 ~t if( salary > 40000, 0, 56 )'") |
Работа с Group
Detail имеет только Autosize Height свойство. Когда работаем с другими компонентами DataWindow, такими как Group
band, содержание может быть погашено, установлением высоты группы в Header или Trailer в ноль.
Например, есть DataWindow с группировкой по state и вы хотите получить текущую строку, ассоциированную с Group band.
Если пользователь выбрал мышью state, нужно показать всплывающее окно, которое выводит данные в упорядоченном виде по зарплатам для
данного state. Обычно, чтобы получить величину столбца, используется вызов GetItemxxx. Проблема в том, что ни одна из
GetItem() функций не работает, когда выбирают группу. Чтобы получить значение столбца в Group band, соответствующая detail
линия должна быть получена. В этом примере, так как используется выбор мышью на Trailer группы, вы можете получить номер строки
detail линии немедленно с помощью функции GetBandAtPointer. Это очень простая функция:
GetBandAtPointer возвращает строку, элементы данных в которой разделены символом табуляции. Синтаксис данной функции и образец
возвращаемых значений:
<DataWindow Band><tab><associated detail row>
detail[tab]8
header[tab]10
header.2[tab]1
trailer.1[tab]5
footer[tab]111
summary[tab]123 |
Эта функция дает возможность получать строку в detail линии, даже если Datail band закрыто. Следующий код дает state
в detail линии, ассоциированной с группой Trailer band:
String ls_Band, ls_State
Int li_Row, li_Pos
ls_Band = dw_1.GetBandAtPointer()
if Left(ls_Band, 9) = "trailer.1" then
li_Pos = Pos(ls_Band, "~t")
li_Row = Integer(Right(ls_Band, Len(ls_Band) - li_Pos))
ls_State = this.GetItemString(li_Row, "state")
end if |
Передвижение объектов между bands
Чтобы передвинуть объект из одного band в другое используют функцию SetPosition. Если необходимо, целевой band
автоматически увеличивается, чтобы показать перемещенный объект. Все свойства, такие как X или Y позиции, высота, ширина
сохраняются для объекта, когда он передвинут между bands. Пример кода, который позволяет двигать текстовый объект из Header
band (заметьте, что начальный band не задается) в Summary band, где параметр true определяет, что перемещаемый
объект будет показан на переднем плане Summary band:
dw_1.SetPosition("company_name_t", "summary", true) |
P.S.: Во избежание недоразумений следует подчеркнуть, что текст относится к PowerBuilder 9
|
Дата публикации: Wednesday 03 May 2006 10:52:05 Материал прочитан: 13858 раз(а) [ Назад ] |
|
|
|
|
|
|