|
혹시 모르니까 처음에 Form2 = NULL; 으로 초기화 해주시고,
해제 OnClose 이벤트에서....
Action = caFree;
Form2 = NULL; <- 추가
이렇게 해주시면 되지 않을까 싶습니다.
문제의 원인은 아래의 구문에서 보시면..
char *a;
a = (char *)malloc(10);
free(a);
if(!a) ShowMessage("객체가 안정적으로 해제되었습니다");
이렇게 소스가 있다면, 위의 ShowMessage는 출력이 되지 않습니다.
free 시에 포인터에 주소가 NULL로 초기화 되지 않고 쉽게 말씀드리면,
껍데기는 남아 있다는 것인데 이것은 NULL 로 포인터를 꼭 대입해 주어야 합니다.
dynamic_cast시에 껍데기는 있고 Form 형태가 그대로 있으나 실질적인 포인터가
존재하지 않아서 에러가 발생한 것입니다. 포인터에 관하여 프로그래머들이 가장
실수를 많이 하는 부분이기도 합니다. :)
cuperido
하안인 님이 쓰신 글 :
: 유영인 Cuperido 님이 쓰신 글 :
: : Form->Visible 속성을 비교하여 true 면 보여주지 않을것 같습니다.
: :
: : 만약, 동적생성을 지역내(function 등)에서 하였을 경우에는 Form->Name으로
: : 바로 접근이 되지 않으니, 생성된 TForm* 포인터를 기억해 두시거나, 아니면
: : FindComponent 등의 메소드로 찾아서 접근하시면 될 것 같습니다.
: :
: :
:
: Form2는 동적생성하므로 Visible속성을 사용할수 가 없을 것같구요.
: 생성이 되지 않으면 메소드에 접근할수 없는것 아닌가요.
:
: 제가 하려는 것은
:
: __fastcall TFom1::Button1Click(Sender.)
: {
: if(dynamic_cast<TForm *>(Form2))
: {
: Form2->Show(); --> 열었다 닫고 다시 클릭하면 이리로......
: }
: else
: {
: Form2 = new From2(Application);
: Form2->Show();
: }
: }
:
:
:
: ----------------
:
: void __fastcall TForm2::FormClose(TObject *Sender,
: TCloseAction &Action)
: {
: Action = caFree;
: }
:
: 위와 같이 해주면 폼을 닫고 다시 버튼을 클릭하면
: 새로 만드는 곳이 아니라 Form2->Show()만 실행되서
: 에러가 발생됩니다.
:
: 폼을 닫고 다시 폼을 열고 하는것입니다.
|