본문 바로가기

관심꺼리.log/정신노동.dat

파워빌더 Datawindow 페이지단위 스크롤 처리 Tip

위 파워빌더 Example프로그램처럼 Datawindow(이하 DW)에 Grouping을 이용할 경우 페이지 변경되는 부분에 회색 라인이 생기게 된다.
스크롤 바를 클릭하여 페이지 단위로 넘길때는 안보이지만, 휠마우스로 스크롤을 한다던가 스크롤바 상하 이동 버튼을 클릭하거나 스크롤바를 드래그해서 이동하거나 하면 이 페이지 구분 라인이 보여서 가끔 프로그램 사용자들이 불만을 제기하는 경우가 있다.

이런 경우 페이지 단위로 이동하게 하는 방법을 알아보도록 하자.

페이지 단위 스크롤하는 Global 함수를 하나 추가하자.
Prototype은 다음과 같다.

global function long gf_dw_page_scroll (datawindow arg_dw)

이 함수의 내용은 다음과 같다.

   1:  //===========================================================
   2:  //= DW에서 휠/스크롤시 페이지 단위로 스크롤 처리
   3:  //= DW.other이벤트에 사용할 것.
   4:  //===========================================================
   5:   
   6:  CONSTANT integer WM_MOUSEWHEEL = 522 
   7:  CONSTANT integer WM_VSCROLL = 277
   8:   
   9:   
  10:  //= 마우스휠/스크롤을 사용한 경우 페이지 단위로 스크롤 하기
  11:  Long ll_rowcnt, ll_firstrow_page, ll_lastrow_page, ll_updown
  12:   
  13:   
  14:  // 마우스휠/스크롤을 사용한 경우
  15:  IF Message.Number = WM_MOUSEWHEEL OR Message.Number =  WM_VSCROLL THEN 
  16:      
  17:      //= 위로인지 아래인지 설정
  18:      IF Message.Number = WM_MOUSEWHEEL THEN
  19:          IF Message.WordParm > 0 THEN 
  20:              ll_updown = 1
  21:          ELSEIF Message.WordParm < 0 THEN
  22:              ll_updown = -1
  23:          END IF
  24:      ELSEIF Message.Number =  WM_VSCROLL THEN
  25:          //= 0은 위버튼클릭, 2는 위쪽바를 클릭
  26:          IF Message.WordParm = 0 OR Message.WordParm = 2 THEN 
  27:              ll_updown = 1
  28:          //= 1은 아래버튼클릭, 3은 아래쪽바를 클릭
  29:          ELSEIF Message.WordParm = 1 OR Message.WordParm = 3 THEN 
  30:              ll_updown = -1
  31:          END IF
  32:      END IF
  33:      ll_rowcnt = arg_dw.RowCount() 
  34:      ll_firstrow_page = Long(arg_dw.Object.DataWindow.FirstRowOnPage)
  35:      ll_lastrow_page = Long(arg_dw.Object.DataWindow.LastRowOnPage)
  36:      
  37:      //= 위로 스크롤한 경우
  38:      IF ll_updown = 1 THEN
  39:          
  40:          IF ll_firstrow_page <> 1 THEN
  41:              arg_dw.ScrollPriorPage()
  42:          END IF        
  43:          
  44:      //= 아래로 스크롤한 경우
  45:      ELSEIF ll_updown = -1 THEN
  46:          
  47:          IF ll_lastrow_page <> ll_rowcnt THEN
  48:              arg_dw.ScrollNextPage()
  49:          END IF
  50:          
  51:      END IF
  52:      
  53:      Message.Processed = TRUE     
  54:      
  55:      RETURN 1 
  56:  END IF 

ScrollPriorPage(), ScrollNextPage()함수를 이용하면 페이지 단위로 화면이동이 되고, Message.Number와 Message.WordParm은 MSDN을 참고하거나 일일이 디버깅모드로 값을 찾았습니다. 삽질이었죠. Sybase에서 Message내용을 다 정리해 주었으면 좋겠지만 그렇지 못한것이 아쉬웠습니다.

함수를 추가하되었으면, 페이지 단위로 스크롤할 DW의 other이벤트에 다음 코드를 추가하면 해당 DW는 페이지 단위로만 스크롤이 됩니다.

   1:  //= 마우스휠/스크롤을 사용한 경우 페이지 단위로 스크롤 하기
   2:  Return gf_dw_page_scroll(This)

위 Example에서는 w_print_employee_roster_dw.dw_employee_roster.other 이벤트가 되겠네요.

gf_dw_page_scroll 함수의 Export File을 첨부파일에 있습니다. 파워빌더 10.5로 Export한 것이니 Example프로그램에 한번 적용해 보시길 바랍니다.