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

C++빌더 Q&A
C++Builder Programming Q&A
[22892] 부모폼의 포인터만 알면 쉽게 부모폼의 컨트롤에 접근할 수 있죠.
Julien [julien] 1077 읽음    2002-11-27 16:39
TF_ITEM이 메인폼의 클래스인가 보군요.
메인폼이든 아니든 TF_ITEM에서 TS_IDPN을 생성하게 되므로 TF_ITEM이 TS_IDPN의 Owner로 두도록 하면 됩니다.

먼저 서브폼을 생성할 때 인자로 Application인 아닌 메인폼의 포인터를 넘겨줍니다.
void __fastcall TF_ITEM::DPNOKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
        //this가 메인폼을 가리키는 포인터인 건 아시죠?
        TS_IDPN *subForm = new TS_IDPN(this);
        subForm->FLAG->Caption = 1;
        subForm->ShowModal();
        delete subForm;
}

서브폼에서 TF_ITEM이라는 타입의 클래스를 인식할 수 있도록 메인폼의 헤더파일을 인클루드해야합니다.
그러고 다음처럼 코딩하시면 됩니다.
void __fastcall TS_IDPN::SG1SelectCell(TObject *Sender, int Col,
      int Row, bool &CanSelect)
{

        if (FLAG->Caption == 1)   //조건문 안으로 들어갑니다.
        {
              //Owner는 생성자에서 인자로 받아오는 변수입니다.
              //이것이 메인폼에 대한 포인터이므로 타입캐스팅을 하면
              //메인폼의 child에 접근할 수 있습니다.
              TF_ITEM* parent = dynamic_cast<TF_ITEM*>(Owner);
              parent->DPNO->Text = SG1->Cells[0][Row];
        }
}

여기서
TF_ITEM *subForm = new TF_ITEM(Application);     // 이렇게 주면 에러는 없지만
subForm->DPNO->Text      = SG1->Cells[0][Row];   // 값이메인폼으로
delete subForm;                                  // 안가요
이렇게 하셨는데.. TF_ITEM이라는 클래스에 대한 폼은 현재 생성되어서 창이 떠 있는 상태이고
그 상태에서 서브폼인 TS_IDPN을 호출하였습니다.
그런데 다시 new를 이용하여 TF_ITEM에 대한 인스턴스를 생성하게 되면 새로 하나를 더 생성하게 됩니다. 즉 이미 메모리에 있는 것과는 별개의 새로운 인스턴스가 만들어진다는 거죠.
그러므로 코드는 제대로 작동하더라도 화면에 보이지 않는(Show하지 않았으므로) 다른 폼에 그 내용이 전달되는 것입니다. 그러고 나서 또 delete를 하였으니 그 마저도 사라져 버리는 거죠.
그러나 원하는 건 기존의 인스턴스에 그 결과가 반영되도록 하는 것이므로 기존의 폼에 대한 포인터를 이용하여 작업을 해야 하는 것입니다.

다음의 경우에서

main()
{
  int a = 1;
}

void func(int b)
{
  int a = 2;
}

이렇게 하였을 때 main의 a와 func의 a가 동일한 a가 아닌 것과 같은 이유입니다.

+ -

관련 글 리스트
22879 /* 질문 */ 두개의 폼간의 데이타 연동 ...검색을 다 찾아 보았는데모르겠어요! 수빈 856 2002/11/27
22892     부모폼의 포인터만 알면 쉽게 부모폼의 컨트롤에 접근할 수 있죠. Julien 1077 2002/11/27
22895         Re:감사합니다... 제가 찾는 답이었습니다... 꾸벅 (내용무)^.^ 수빈 876 2002/11/28
22882     Re:/* 질문 */ 두개의 폼간의 데이타 연동 ...검색을 다 찾아 보았는데모르겠어요! 조준회 1179 2002/11/27
22883         Re:Re:일단 감사드립니다.. 추가 질문 입니다. 수빈 650 2002/11/27
22884             Re:Re:Re:일단 감사드립니다.. 추가 질문 입니다. 조준회 657 2002/11/27
22886                 Re:Re:Re:Re:일단 감사드립니다.. 추가 질문 입니다. 수빈 669 2002/11/27
22887                     Re:Re:Re:Re:Re:일단 감사드립니다.. 추가 질문 입니다. 조준회 704 2002/11/27
22918                         Re:Re:Re:Re:Re:Re:일단 감사드립니다.. 추가 질문 입니다. 질문이너무많아서.. 823 2002/11/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.