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