Форум FAQ О команде
Поиск по сайту:
 
Sybase
Sybase ASA  
Sybase ASE  
Sybase IQ  
Sybase PowerDesigner  
Sybase PowerBuilder  

Продукты
Наши продукты  
Продукты партнеров портала  

Сообщества
Alef community  

Меню
Регистрация  
Почта  

Вход

Рассылка
Рассылка 'РСУБД Sybase ASA 9 - мощность, легкость и надежность'
Почтовая рассылка
"Технологии обработки данных компании Sybase"


Статистика
Яндекс цитирования

Rambler's Top100
Находится в каталоге Апорт

Главная -> Статьи
Работа с 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 выражение, делающее их
    невидимыми в каждой строке за исключением первой:
    if( getrow() = 1, 1, 0 )
    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. Это очень простая функция:
    dw_1.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 раз(а)
[ Назад ]



Продвижение сайтов
Биржа ссылок

Copyright©2005 phpMS. Все права защищены.
hosted on pets-tree