* Powerbuilder 10.5


먼저 클래스(Class), 객체(Object), 인스턴스(Instance) 에 대한 개념부터 정리하겠습니다.


객체
  객체 지향 프로그래밍에서, 데이터(실체)와 그 데이터에 관련되는 동작(절차, 방법, 기능)을 모두 포함한 개념. 예를 들어 기차역에서의 승차권 발매를 생각할 때, 실체인 ‘손님’과 동작인 ‘승차권 주문’은 하나의 객체이다. 실체인 ‘역무원’과 동작인 ‘승차권 발매’도 하나의 객체이다.

클래스
  객체 지향 프로그래밍(OOP)에서 객체(Object) 내부의 데이터 구조와 그 조작을 정리하여 정의한 것.

인스턴스
  일반적으로 어떤 집합에 대해서, 그 집합의 개별적인 요소. 객체 지향 프로그래밍에서, 어떤 클래스에 속하는 각 객체를 인스턴스라고 한다. 예를 들면 ‘목록’이라는 클래스를 정의하고 그 다음에 ‘본인 목록이라는 객체를 생성(메모리 할당)하면 그 클래스의 인스턴스가 생성된다. 또한 변수가 포함되어 있는 어떤 논리식의 변수에 구체적인 값을 대입하여 식을 만들려면 원래 식의 인스턴스가 만들어진다. 이런 의미에서 인스턴스를 실현치라고 한다.

                                                                                                                 출처 : 한국정보통신기술협회


클래스는 객체(인스턴스)를 정의해 놓은 것입니다.

객체와 인스턴스의 뜻은 매우 유사합니다. 인스턴스는 클래스를 실현해 놓은 객체입니다.
객체라는 말은 독립적인 성격이 강한 반면 인스턴스는 어떤 클래스에서 비롯되었다는 의미가 강합니다.
그러므로 실제 프로그래밍 환경에서는 클래스로부터 무언가를 만들어 내야 하므로 객체보다는 인스턴스라는 용어를 더 많이 사용합니다.


이것이 일반적인 OOP 에서 사용되는 정의입니다.



그러나 파워빌더에서는 클래스를 오브젝트 클래스, 인스턴스를 오브젝트 인스턴스라고 칭합니다.

좀 이상한 명명법인데요. 파워빌더식으로 굳이 이해할 필요는 없습니다.

Application 오브젝트(객체) 나 Window 오브젝트라고 명명되는 것들이 결국은 클래스입니다.

파워빌더에서의 인스턴스는 일반적인 인스턴스와 개념을 같이 합니다.

open(w_list)

이 스크립트를 실행하면 w_list 오브젝트(클래스)의 인스턴스를 생성해서 메모리에 로딩합니다. 화면에 보이는 w_list 윈도우는 인스턴스를 실현해 놓은 것입니다.

파워빌더에서 클래스, 객체, 인스턴스를 구분하는 일이 불필요할 수도 있습니다. 그러나 그 용어들이 자주 등장하고 있어 대략적인 개념은 갖고 있어야 용어상의 혼동을 피할 수 있습니다.

정리하자면

파워빌더의 오브젝트(Object)는 일반적인 OOP 에서의 클래스(Class)를 의미합니다.



변수 선언과 관련된 파워스크립트 문법을 다룰려고 했으나, 시기상조라고 판단 되어서 추후에 다루기로 했습니다.
이번 강의에서는 dw 컨트롤의 함수, 이벤트에 대해서 좀 더 알아보고 그것들을 이용해서 어플리케이션의 완성도를 높여 보겠습니다.


현재 실습 어플리케이션은 사원명을 수정하고 저장할 수 있는 단계까지 진행이 되어 있습니다.
사원목록을 클릭했을 때, 사원명에 커서가 갑니다. 그런데 클릭한 로우가 눈에 잘 띄지 않습니다.

그럼 사원목록에서 특정 사원의 로우를 클릭했을 때, 색깔이 반전되는 기능을 줘 볼까요?

위의 문장을 스크립트로 변환하면

사원목록에서 -> w_list.dw_emp
특정 사원의 로우를 클릭했을 때 -> dw_emp 의 clicked 이벤트
색깔이 반전되는 기능 -> ? 

색깔 반전은 SelectRow 라는 함수가 있습니다. 이것을 이용해 보죠.

(dw 컨트롤의 함수를 모두 찾아 보고 싶다면  도움말 - DataWindow control 로 검색 - Functions 를 참조하세요.)

w_list 윈도우를 열고 dw_emp 의 이벤트로 들어가세요. 그럼 itemchanged 이벤트가 자동으로 선택이 됩니다.
가운데 이벤트 목록에서 clicked 이벤트를 선택하세요.



clicked ( integer xpos, integer ypos, long row, dwobject dwo ) returns long [pbm_dwnlbuttonclk]

clicked 이벤트가 발생하면 몇가지 인수를 넘겨줍니다.

xpos : dw 영역의 왼쪽 끝에서 클릭한 지점까지의 거리, 픽셀단위, integer
ypos : dw 영역의 상단 끝에서 클릭한 지점까지의 거리, 픽셀단위, integer
row : 사용자가 클릭한 로우의 넘버, long  ->  사용자가 row 아닌 다른 부분을 클릭하면 0
dwo : 사용자가 클릭한 포인터에 위치한 dw 내에 있는 컨트롤의 참조값(이름), DWObject

pbm_dwnlbuttonclk  : Event ID

Event ID는 윈도우 운영체제의 메시지를 매핑(mapping)한 파워빌더 토큰(token)명입니다.

dwn -> datawindow
lbuttonclk -> Left Button Click


윈도우 API 상에서 WM_LBUTTONUP 메시지를 받아 파워빌더에서 자체 매핑시킨 것입니다.
이벤트 마다 Event ID가 존재합니다.

Event ID 는 좀 어려운 내용이므로 다 이해 안가도 상관 없습니다.


그리고 SelectRow 함수는

설명
  dw 컨트롤의 로우들의 색깔을 반전시키거나 반전해제 시킨다.

문법
  integer dwcontrol.SelectRow ( long row, boolean select )

  row : 반전 또는 해제시키고자 하는 로우, 0 이면 모든 로우를 선택
  select : True 이면 반전, False 이면 반전해제

반환값
  성공시 : 1
  에러시 : -1



이 정도 정보를 가지고 있으면 충분합니다.



clicked 이벤트의 row 인수는 스크립트로 사용할 수 있습니다.

클릭된 로우(row)의 색깔을 반전(true) 시킨다는 뜻입니다.

이렇게 작성하고 결과를 확인해 보세요.





그런데 클릭할 때마다 모조리 색깔이 반전됩니다. 클릭된 로우만 반전되고 나머지 로우는 반전해제 시켜야겠는디...   두 가지 방법이 있습니다.


1. 클릭된 로우를 반전시키기 전에 모든 로우를 반전 해제한다.

2. 클릭된 로우를 반전시키기 전에 이전에 반전된 로우가 있으면 반전 해제한다.






dw_emp.SelectRow( 0, false ) 를 추가 했네요.

0 이면 모든 로우를 뜻한다고 했죠. 그럼 모든 로우를 반전해제한다는 뜻입니다.



실행해서 결과를 확인하세요. 이것이 많이 쓰이는 방법입니다만 2번도 구현해 보겠습니다.


먼저, 파빌 레이아웃 하단에 있는 Declare Instance Variables 를 선택합니다. 


그럼 인스턴스 변수(Instance Variables)
선언창이 열립니다.




그 창에서 상단 가운데 목록을 보면 변수별 선언창을 선택할 수 있습니다.
변수의 종류과 선언 방법에 대해서는 추후에 정리하기로 했죠.
여기서는 걍 넘어갑니다.
궁금해도 참으소서.....




지금 선택한 인스턴스 변수는 맛 보기로 한 번 해보는 겁니다.




ii_row_old 라는 int 형의 인스턴스 변수를 선언합니다.




그리고 다시 dw_emp 의 clicked 이벤트로 돌아옵니다.


스크립트가 좀 많이 추가 됐네요.

어플리케이션이 실행될 때, 숫자 타입은 타입 선언시에 0 으로 초기값이 부여됩니다.

그러므로 ii_row_old 는 0 값이 디폴트로 들어갑니다.

그러므로 로우 최초 클릭시 If 문 조건은 만족하지 않습니다.

ii_row_old = row 라고 했기 때문에 ii_row_old 에는
row 값이 할당됩니다.



그럼 다음 로우 클릭시에는 If 문의 조건을 만족하게 되어서

dw_emp.SelectRow( ii_row_old, false )

이 스크립트가 실행됩니다. 그럼 그 전에 반전되어 있던 로우는 반전해제 됩니다.

이해하셨나요?

ii_row_old 는 인스턴스 변수로 선언이 되어 있습니다. 

w_list 가 오픈되면 w_list 윈도우 인스턴스가 메모리에 로딩됩니다. 
인스턴스 변수는 w_list 윈도우가 닫히기 전까지 즉, 인스턴스가 메모리에서 해제되기 전까지 참조할 수 있습니다.
인스턴스 변수는 변수가 선언된 오브젝트(윈도우, 어플리케이션 등) 내에 있는 모든 컨트롤에서 참조가 가능하고 다른 윈도우 인스턴스에서도 참조할 수 있습니다.

인스턴스에 대한 부분은 쪼까 어려울 수 있습니다. 이해가 100프로 안 되도 됩니다. 걍...ㅎㅎ


1번 방법은 모든 로우를 반전해제해야 하므로 2번 방법 보다는 퍼포먼스가 떨어질 가능성이 있습니다만 거의 눈에 띄이는 차이는 보이지 않습니다. 2번 방법은 오히려 작성해야 하는 스크립트양도 많아지고 변수도 선언해야 하므로 관리면에서는 1번 방법을 더 추천하고 싶습니다.
( SelectRow(0, false) 이 부분의 퍼포먼스가 떨어질 수 있다는 것은 어디까지나 필자의 생각입니다. 파워빌더 내부적으로 어떻게 관리하는지 공개가 안 되어 있으므로 정확하게 알 수는 없습니다.)


수고하셨습니다.


* 질문은 댓글로 남기세요.
Posted by A4M
,