본문 바로가기

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

[파워빌더 Tip] 상속받은 오브젝트의 부모 오브젝트명 알아내기

UserObject를 만들다가 특정 부모 윈도우에서 상속받은 윈도우에 있을때만 그 부모 윈도우의 윈도우 함수를 콜해야하는 경우가 있어서 부모 ClassDefinition Object에 대한 펜타의 강좌 문서를 찾게 되었습니다.

The ClassDefinition Object Or how to create a simple object browser - Part 1
The ClassDefinition Object Or how to create a simple object browser - Part 2

ClassDefinition의 Help를 찾아보니 Ancestor속성과 Name속성을 이용하면 부모윈도우의 이름을 알 수 있을 것 같았죠. 그래서 아래와 같은 코드로 부모윈도우의 윈도우 함수를 콜하는 로직을 구성하였습니다.

   1:  w_model_window lw_ancestor
   2:  graphicobject lgo_temp
   3:  window lw_temp
   4:  ClassDefinition  cdf_child, cdf_ancestor 
   5:   
   6:  lgo_temp = Parent
   7:   
   8:  // 가장 밖에 있는 윈도우 오브젝트를 찾는다. 
   9:  // Tab이 있는 경우 Parent는 Tab이 되므로 상위 윈도를 찾기 위해 루핑
  10:  DO WHILE lgo_temp.Typeof() <> window!
  11:      lgo_temp = lgo_temp.GetParent()
  12:  LOOP
  13:  lw_temp =  lgo_temp 
  14:   
  15:  // 현재 UserObject가 있는 윈도우의 ClassDefinition 속성을 가져온다.
  16:  cdf_child = lw_temp.ClassDefinition
  17:  // 윈도우의 ClassDefinition.Ancestor 속성값이 부모 윈도우의 ClassDefinition.
  18:  cdf_ancestor = cdf_child.Ancestor 
  19:   
  20:  // ClassDefinition.Ancestor가 Null이면 상속받은게 아니라 기본 컴포넌트로 만든 것임
  21:  IF IsNull(cdf_ancestor) THEN 
  22:      Return 0
  23:  // 부모 윈도우의 ClassDefinition.Name 속성이 부모 윈도우의 이름.
  24:  ELSEIF cdf_ancestor.Name = 'w_model_window' THEN
  25:      // 부모윈도우 변수에 Assign
  26:      lw_ancestor = lw_temp
  27:      // 여기서 부모 윈도우의 함수를 콜할수 있다.
  28:      lw_ancestor.wf_부모함수명()
  29:  END IF

이렇게 하면 이 UserObject는 부모윈도우를 상속받은 오브젝트이던 그렇지 않던 모두 사용할 수가 있는 것이죠.