|
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가 아닌 것과 같은 이유입니다.
|