Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[6890] >질문< 글이 좀 깁니다 꼭 끝까지 좀 읽어 주세요
dashform [ ] 642 읽음    1999-12-15 11:48
안녕하세요 좋은생각입니다.
또 염치 없이 질문을 올리게 되었습니다.
다들 마찬가지 겠지만 마감때문에 정말 무지 바쁩니다.
프로그래밍이란 정말 버그가 버그를 낳는 아브라함의 버그 법칙이
꼭 맞는 것 같습니다.
이 버그를 잡는다고 쿠크...일주가 넘게 사투를 벌이고 있습니다.

본론으로 들어 가서...
TUDSLinkSet이란 커스텀 컴포넌트가 있는데 델파이의 TDataSet에
비유가 됩니다. 특수한형태의 데이타 포멧을 정의하고 관리하는 그런
컴포넌트입니다.

문제는 TDataSet처럼 TLinkField라는 필드를 가지는데 이 필드역시
컴포넌트로 델파이에 클래스만 등록을 시키는 그런 숨겨진 컴포넌트
입니다. 이 TLinkField를 TUDSLinkSet이 관리를 하게 됩니다.

간략하게 잠시 구조를 보게 되면

TLinkField = class(TComponent)
  ...
  ...
end;

TLinkFields = class(TPersistance)
  FLinkFieldList : TList
  ...
end;

TUDSLinkSet
private
  ...
  LinkFields : TLinkFields
protected
  ...
public
  ...
published
  ...
end;

이런식으로 구성이 되어있습니다.

즉 TUDSLInkSet은 TLinkFields를 가지고 있어 TLinkField를 추가 삭제 변경 등의 관리를
할 수 있는거죠

문제부분으로 들어 가서

이 TUDSLinkSet은 컴포넌트 에디터를 가지고 있습니다. 델파이 TTable의 필드 편집기
를 생각하시면 편할겁니다. 인터페이스는 거의 같은데요

TUDSLinkSet은 델파이의 필드편기처럼 눈에 보이지 않는 자식 컴포넌트를 관리하는데
문제는 필드 편집기로 TUDSLinkSet에 필드를 편집하여 최종 필드를 폼에 추가를 하는데
까지는 아무런 문제가 없습니다.

문제는 폼을 Close시킬때 발생한다는 거죠

델파이의 모든 컴포넌트는 패어런트 컴포넌트를 가질수 있는데 TDataSet이나 TMenu등은
그 좋은 한 예입니다.

만약 패어런트가 삭제 된다거 폼이 종료될때 패어런트 컴포넌트는 자식 컴포넌트를
삭제해주고 자신을 해제시켜야하는것이 보통 정상적인 경우라고 생각되는데
문제는 제생각처럼 델파이가 그렇게 해주지 않는다는 거죠

필드편집기로 필드를 폼에 추가하고 다시 폼을 닫으면(여기서 unit를 close한 것)
그 문제가 확연히 들어 납니다.
디자인타임에 그 결과를 확인해야 하는 작업이기 때문에 Debug를 할 수가 없어
Debug원도우를 만들었는데 그 메세지의 일부를 보면 이상한 점을 발견할 수가
있습니다.

              < 디버그 메세지>

Start->TLinkField.Destroy ->UDSLink1SALARY        ---> 이부분
  Start->TUDSLinkSet.SetActive(false);
  End->TUDSLinkSet.SetActive(false);
End->TLinkField.Destroy ->UDSLink1SALARY

Start->TLinkField.Destroy ->UDSLink1HIREDATE     ---> 이 부분
  Start->TUDSLinkSet.SetActive(false);
  End->TUDSLinkSet.SetActive(false);
End->TLinkField.Destroy ->UDSLink1HIREDATE

Start->TLinkField.Destroy ->UDSLink1PHONEEXT    ---> 이 부분
  Start->TUDSLinkSet.SetActive(false);
  End->TUDSLinkSet.SetActive(false);
End->TLinkField.Destroy ->UDSLink1PHONEEXT

Start->TLinkField.Destroy ->UDSLink1FIRSTNAME  ---> 이 부분
  Start->TUDSLinkSet.SetActive(false);
  End->TUDSLinkSet.SetActive(false);
End->TLinkField.Destroy ->UDSLink1FIRSTNAME

Start->TLinkField.Destroy ->UDSLink1LASTNAME   ---> 이 부분
  Start->TUDSLinkSet.SetActive(false);
  End->TUDSLinkSet.SetActive(false);
End->TLinkField.Destroy ->UDSLink1LASTNAME

Start->TLinkField.Destroy ->UDSLink1EMP_NO     ---> 이 부분
  Start->TUDSLinkSet.SetActive(false);
  End->TUDSLinkSet.SetActive(false);
End->TLinkField.Destroy ->UDSLink1EMP_NO

TUDSLinkSet.Destroy
Start->TUDSLinkSet.SetActive(false);
End->TUDSLinkSet.SetActive(false);
  FUDSM.Free
  FLinkFields.Free
Start->TLinkFields.Destroy;   ---> 이 부분
LinkField Count->6
Start->TLinkFields.Clear      
Start->TLinkFields.Changed;
End->TLinkFields.Changed;
End->TLinkFields.Clear       
End->TLinkFields.Destroy;    
End->TUDSLinkSet.Destroy

위에서 보면 총 필드가 6개가 있는데 폼을 닫으면
델파이가 먼저 필드를 Free시켜 버립니다. 그리고 TUDSLinkSet에서는
필드가 모드 Free된 것도 모른체 필드의 카운트데로 그 필드를 헤제할려고
하면서 문제가 발생하는거죠
이거찾는데 정말 무지 고생했습니다.

혹자는 그럼 필드를 destroy안하면 되지 않는냐고도 하는데 그 역시 말이 안됩니다.
문제는 폼을 닫으면 괜찮겠지만 우리가 디자인 윈도우에서 작업할때는 컴포넌트를
삭제 삽입을 무지 많이 합니다. 즉 TUDSLinkSet이란 컴포넌트를 폼에서 삭제를 하게 된다면
자식을 클리어 시키고 자신을 클리어 시키는데 폼이 닫을때 문제가 발생합니다.

IDE하고 통신하면서 뭔가 빠뜨린 부분이 있는 것 같은데 그게 뭔지 모르겠습니다.
TTable는 어떻게 그걸 수행하는지

컴포넌트를 자식을로 가질 경우 델파이가 그 자식을 독립된 컴포넌트로 인식을 하면
안될것 같은데 지금 현상으로 델파이가 그렇게 생각하고 필드를destroy시켜 버리는 것
같습니다.

또 한가지 의문점은 왜 필드가 먼저 Destroy되냐는 거죠...
TUDSLink가 먼저 Destroy된다면 자식을 Destroy이키면 이미 그 자식 필드는 폼에
존재하지 않는 것이되어 폼이 그 자식 필드를 Destroy시키지 않을 수도 있을텐데
라는 의문점이 들고요

추가로 델파이가 폼을 Destroy할때 폼위에 있는 컴포넌트를 Destroy이 시키는 순서
에 의문점이 듭니다. 이제것 막연한 생각이 었지만
폼의 TDesigner에서 각종 컴포넌를관리하는데 여기서 컴포넌트가 생성된 순서대로
컴포넌트를 삭제 하지 않는냐라고 생각 만했는데 그게 아닌것 같습니다.
어떤 다른 규칙이 있는지...?


또 한가지 질문은 일반적으로 폼에서 어떤 컴포넌트가 삭제될때나 그 컴포넌트가 있는
폼이 닫힐때 그 컴포넌트 편집기가 열려진 상태라면 닫아 주어야 합니다.
물론 showmodal로 편집기가 열린 상태면 상관이 없지만 show일경우...에 말이죠
컴포넌트 편집기에서 TDesigner 의 컴포넌트 관리 메소드를 Override하여 이러한 처리를
해주면 될것 같은데 같은데 거게 잘 안됩니다.

즉 TUDSLinkSet의 편집기가 열려진 상태에서 그 TUDSLinkSet을 닫는다거나 그 폼을
닫는다해도 그 편집기가 그대로 있다는거죠..크크크...
역시 내생각되로 잘 되지는 않는군요...음..암튼

18일 까지 다 해야 하는데 ...아직 컴포넌트간의 통신도 제대로 뚫지 못하고
델파이 IDE와 통신하는 규칙에서 자꾸 막힙니다. 크킄..
델파이 IDE와 통신하는 것에 관계된 책을 알고 계신분은 책 좀 추천해주세요...꼭 좀이요
원서라도 상관없습니다... *^^*;

이거 넘 주접주접 앞뒤 안맞게 떠들은게 벌써 엄청나군요...죄송합니다.
사람이란 참 간사한 모양입니다.
항상 남의 입장보단 자신의 입장과 상황만을 생각하나 봅니다.
늘 좀 손해보더라두 그렇게는 살지 않을 꺼라고 다짐을 하지만 어떤 순간에는
그 맹세가 어디로 가버렸는지...찾아 보기도 어렵습니다..크크크..죄송하게
생각하구요...
좀 더 노력하구...나름데로 열심히 하겠습니다.

그리구...임프님 지난번 답변 정말 넘 감사했습니다.
뻥좀 처서...눈물리 글썰글썽...했다니까요...
감사하다는 말도 못해서 늘 죄송했습니다....
정말로 멋진 분이라고 생각되네요...임프님...음...

그럼...안녕히 계세요...


+ -

관련 글 리스트
6890 >질문< 글이 좀 깁니다 꼭 끝까지 좀 읽어 주세요 dashform 642 1999/12/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.