TriggerEvent와 Trigger Event, 그리고 상속
Powerbuilder에서 Object에 이벤트를 강제로 발생 시키는 방법은 크게 두가지가 있다.
첫번째로는 TriggerEvent 함수를 쓰는 방법과, 두번째로는 Trigger Event 키워드를 사용 하여 발생 시키는 방법.
이 글을 적게 된 이유는 상속과 관련해서 특정한 상황에서는 TriggerEvent 함수가 생각 처럼 작동 하지 않는다는 것을 적어 놓기 위해서다.
예를 들면
Object A가 있고, Object B가 있는데 Object B는 Object A를 상속 받은 객체이다.
ObjectA ObjectB
event1 event1
ObjectB는 ObjectA에 있는 event1도 같이 상속 받은 상태..
ObjectB의 특성상 event1을 바로 쓰지 못하고 조상의 event1의 리턴값을 보고, 그에 따라 추가 처리를 해 주어야 한다.
이럴 경우 ObjectB의 event1의 스크립트에서 바로 코딩을 해 주어 버리면, 조상 이벤트의 리턴값을 받아 오지 못한다.(왜냐면 파워 빌더가 자동으로 조상 이벤트 호출 후 자기 이벤트를 다시 호출 해주기 때문에 조상 이벤트가 리턴한 값은 따로 담지를 못한다. 원래 이벤트라는게 리턴코드를 생각 할 수 없으니까)
따라서 "Extented Ancestor Script"를 풀어 주어(이러면 조상 이벤트는 실행 하지 않는다.) 바로 내 스크립트를 실행 하게 하고, TriggerEvent("event1")이나 Trigger Event event1()을 써서, 리턴값을 받아 온 후 그 값에 따라 처리 하면 된다.
ex)
1 If super::TriggerEvent("event1") = 0 Then
2 If super::Trigger Event event1() = 0 Then
...
Else
...
End if
super는 조상을 뜻 한다.
하지만 여기서 두 개의 코드가 서로 다르게 실행 된다는게 문제다.
super::TriggerEvent("event1")
이 코드는 무한 루프에 빠지게 된다.
super::Trigger Event event1()
이 코드는 예상 대로 잘 수행 된다.
super::TriggerEvent("event1")는, super에 있는 TriggerEvent를 호출 하긴 하지만 super의 TriggerEvent가 자기 자신에게 직접 event1을 발생 시키지 않고 그냥 객체 자체에 이벤트를 발생 시켜서 자식의 event1이 다시 발생 하여 루프가 돌게 된다.
하지만 Trigger Event event1()은 직접 조상 객체에 이벤트를 발생 시키므로 잘 작동 한다. TriggerEvent는 아마도 PowerBuilder의 버그가 아닌가 싶다.
조상의 함수 TriggerEvent가 실행 되어 이벤트를 보내면 조상 객체 내에서 해결 해야 하는데, 그게 다시 자식 객체로 부터 이벤트가 먹어 들어 가니 이게 잘 못 된 것 같다.
Sunday, February 25, 2007
Subscribe to:
Posts (Atom)