|
장성호 님이 쓰신 글 :
: 동적으로 생성하는 부분에 실수가 있으신것 같습니다.
:
: 전역변수와 지역변수가 헷갈려서 생긴 문제인것 같습니다.
:
:
:
: 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이 납니다.
|