* Powerbuilder 10.5

<함수의 종류>
System function
Object function
User-defined function
Global function
Local external function
Global external function

좀 헷갈릴 수 있기 때문에 함수 종류별로 일일이 설명하지는 않겠구요.

하나 하나씩 다루면서 익히겠습니다.

Object function 은 파빌에서 제공하는 것이 있고 사용자가 정의하여 사용할 수도 있습니다.
여기서는 윈도우 오브젝트에서 사용자가 직접 함수를 정의하여 사용하는 방법을 알아보겠습니다.



w_list.open 이벤트에

dw_emp.Retrieve('CLERK') 를 호출했습니다.

그리고 w_list.cb_search.clicked 이벤트에도 똑같이 호출했습니다.


동일한 스크립트임에도 불구하고 이렇게 두 번 호출을 하면 나중에 수정할 일이 있을 때, 동일한 스크립트를 반복해서 수정해야 합니다.

중복된 코드를 하나로 만드는 일은 일반적인 코딩 원칙 중의 하나입니다.

중복 코드 문제를 해결하기 위해서 윈도우 오브젝트의 함수를 이용해 보겠습니다.


 


w_list 열어서 하단의 Funtion List 탭을 선택하면 왼쪽의 윈도우 오브젝트 함수 목록이 나옵니다.

파빌에서 기본적으로 제공하는 윈도우 오브젝트 함수입니다. 이 함수들은 차츰 알아보기로 하겠습니다.

파빌에서 제공하는 함수 외에 사용자가 직접 함수를 정의해서 사용할 수 있습니다.
즉, 사용자 정의 윈도우 오브젝트 함수입니다.


 


목록 아무데서나 포인터를 놓고 

마우스 우클릭 - Add 를 선택합니다.


 

 


사용자 정의 윈도우 함수를 만드는 포맷이 열립니다만 뭔가 이상합니다.

설정할 수 있는 칸들이 모두 막혀있습니다.
매번 그런건 아니고 가끔 이런 증상이 일어나는데요. 

파빌 버그로 보이네요.

위와 같은 증상이 보이면 다음 방법대로 하세요.
파빌 레이아웃에서 dw 나 커맨드버튼 또는 윈도우의 빈 화면 중 아무거나 더블클릭하세요. 그럼 이벤트창이 열립니다. 여기서는 윈도우 빈 화면을 더블클릭합니다. 그러면 w_list.open 이벤트가 열립니다.


 

 


왼쪽 상단의 목록에서
(Functions) 를 선택합니다.

 

 


이제야 제대로된 화면이 나오네요. 이 화면을 이용해서 함수를 만들 수 있습니다.


 

 


Access (Public, Protected, Private) 
접근제어자입니다. C++, Java 와 비슷한 개념입니다.

Public : 하나의 어플리케이션 안에 있는 모든 오브젝트에서 이 함수에 접근가능.
Protected : 이 함수가 속한 윈도우 오브젝트와 그로부터 상속된 자손 오브젝트에서만 접근가능.
Private : 이 함수가 속한 윈도우 오브젝트 안에서만 접근가능.

(상속(inherit)은 나중에 다룹니다.)

Return Type
반환값의 데이터 타입입니다. 반환값이 없으면 (None) 로 두면 됩니다.

Function Name
함수명. 윈도우 함수이므로 window function 의 이니셜을 따서 wf_ 로 이름을 붙이는 것이 관례입니다.

Pass By
함수로 전달된 인수의 성격을 정의합니다.

Value : 변수로 사용되어 값을 변경할 수 있음.
Reference : 참조호출. 인수를 전달한 함부 외부의 변수에 함수 내부에서 변경된 인수의 값이 저장됨.
Readonly : 상수로 사용되어 값을 변경할 수 없음.

 


윈도우 함수명은 관례상 wf_ 로 시작합니다.

Argument Name 는 빈란으로 둡니다.

중복 호출되었던 스크립트를 작성합니다.



저장하고  Function List 탭으로 이동합니다.


 


이렇게 맨 위에 사용자 정의 윈도우 함수가 만들어졌네요.

함수명 옆에 아이콘은 작성된 스크립트가 있다는 뜻입니다.

만약 스크립트를 작성하지 않고 저장하면 오름차순으로 정렬되어 보여지게 됩니다.


w_list.open 이벤트와 w_list.cb_search.clicked 이벤트에서 중복 호출된 dw_emp.Retrieve('CLERK') 를
wf_retrieve() 로 수정합니다.







실행해 보면 결과는 변함이 없지만 wf_retrieve() 의 스크립트만 수정하면 두 이벤트에 모두 적용이 됩니다.


수고하셨습니다.

 

 

 

Posted by A4M
,