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
[48982] Re:Re:Re:[질문]폼A에서 폼B의 컴포넌트 접근방법
장성호 [nasilso] 1366 읽음    2007-04-18 09:09
동적으로 생성하는 부분에 실수가 있으신것 같습니다.

전역변수와 지역변수가 헷갈려서 생긴 문제인것 같습니다.



cxButton5Click 함수안에서  Tf_booklend *f_booklend  로 변수를 선언하고 폼을 생성한것이므로

동적으로 생성한 f_booklend 폼은 cxButton5Click 함수안에서만 접근가능합니다. 왜냐면 지역변수니까요

위에분에 header파일을 include하면 된다고 하셨는데

그렇게 할경우 extern으로 header파일에 선언된 전역변수에다가  동적으로 생성된 폼을 할당하는 경우입니다.


Tf_booklend 폼의 소스를 한번 보세요

Header 파일 맨 아랫쪽에  extern PACKAGE Tf_booklend *f_booklend  라는 내용이 있을것입니다.
그리고 cpp파일 맨 윗쪽에 Tf_booklend *f_booklend 라는 내용이 있을것이구요

실제 변수는 cpp파일에 선언되어있구요
그 변수를 header파일에서 extern으로 어디서든지 참조할수 있도록 해둔것입니다.

저 변수에다가 동적으로 생성된 폼을 할당해야 합니다.

그냥  cxButton5Click 함수 안에서 변수를 새로 선언해서  하면  새로선언한 변수는
cxButton5Click 함수 안에서만 접근가능하죠

해결은

방법1)  그냥 님의 코드에서  선언부만 없애면 됩니다.

void __fastcall TMainForm::cxButton5Click(TObject *Sender)
{
     f_booklend = new Tf_booklend(Application);
   f_booklend->bl_member_no->Text = c_member_no->Text;
   f_booklend->bl_name->Text = c_member_name->Text;
   if(f_booklend->ShowModal() == mrOk)
   {
   }
   delete f_booklend;
}

방법 2)
    저역으로 선언된 변수를 사용하지않고 새로 동적으로 생성해서 쓴다면?
    TMainForm의    header    classs내부에  Tf_booklend *형으로 선언해서 사용하는 방법이 있습니다.

방법3)
    동적으로 생성한후에 Form의 포언터를 접근하기 원하는 Form으로 넘겨주는 방법도 있구요
    Form이   A,B,C 세가지가 있다고 합시다.

    A에서 B와 C를 생성한후에
    B와 C가 서로 접근가능하게 하고싶다는 얘기잖아요?

    A에서 B와 C를 생성한후에   B에게 C의 포인터를 넘겨주고, C에게도 B의 포인터를 넘겨주면 되겠죠



기타 등등 여러가지 방법이....

  
참고
   지역변수로 사용할때는 전역변수와 똑같은 이름으로 변수를 선언하지 않는것이 헷갈리지 않는 방법입니다.
   변수 선언에 규칙도 적절히 줄수 있구요..




하안인 님이 쓰신 글 :
: 금목암 님이 쓰신 글 :
: : 하안인 님이 쓰신 글 :
: : : 메인폼에서
: : :
: : : void __fastcall TMainForm::cxButton5Click(TObject *Sender)
: : : {
: : :   Tf_booklend *f_booklend = new Tf_booklend(Application);
: : :   f_booklend->bl_member_no->Text = c_member_no->Text;
: : :   f_booklend->bl_name->Text = c_member_name->Text;
: : :   if(f_booklend->ShowModal() == mrOk)
: : :   {
: : :   }
: : :   delete f_booklend;
: : : }
: : :
: : : 또하나의 폼은 show()를 생성한 후
: : : 폼생성된 곳에서 더블클릭하면 데이타가 폼처음에 생성된곳에 표시하려고 합니다.
: : :
: : : 그런데
: : :
: : : 다른 폼에서
: : : f_booklend->Label1->Caption = 
: : :
: : : 이런식으로 하면 에러가 나네요...
: : :
: : : 메인폼에 있는 레이블로는 접근가능한데요..
: : :
: : : 메인 폼에서 두개의 폼을 생성한후 두개의 폼간에 컴포넌트를 접근하려면 에러가 나네요.
: : :
: : : 접근권한이 없는것이 아닌것 같은데 왜 에러가 나는지 해결방안은 어떻게 해야 하는지요.
: : :
: : : SendMessage를 폼과 폼사이에 전송해야 하나요.
: :
: :
: : [답변]
: : form1에 form2 헤더파일을 복사해 붙이시고 접근때
: : form2. f_booklend->Label1->Caption = 
: : 으로 해보세요
:
:
:
: 다른 폼에서 메인으로 접근할때는 되지만
: 동적으로 생성된 두개의 폼에서 답변처럼 하면 Access violation이 납니다.

+ -

관련 글 리스트
48972 [질문]폼A에서 폼B의 컴포넌트 접근방법 하안인 1314 2007/04/17
48975     Re:[질문]폼A에서 폼B의 컴포넌트 접근방법 금목암 1094 2007/04/17
48974     Re:[질문]폼A에서 폼B의 컴포넌트 접근방법 금목암 999 2007/04/17
48981         Re:Re:[질문]폼A에서 폼B의 컴포넌트 접근방법 하안인 1073 2007/04/17
48982             Re:Re:Re:[질문]폼A에서 폼B의 컴포넌트 접근방법 장성호 1366 2007/04/18
57333                 Re:Re:Re:Re:[질문]폼A에서 폼B의 컴포넌트 접근방법 김빈 958 2009/06/20
48983                 답변감사드립니다.-내용무 하안인 873 2007/04/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.