|
TForm 에는 Components 라는 List가 있습니다.
TForm으리 Owner로 가지는 Object들이 생성된 순서대로 들어가게 되죠
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TForm2 *fm=new TForm2(this); // 반드시 생성자 파라메타에 Form1을 넣어야함
}
위와같이 Form2를 생성하게 되면 Form1의 Components 에 Form2가 들어게게 됩니다.
만약 Form2를 delete하지 않고 Form1만 delete하게 되는 경우에 메모리 누수가 나지 않는 이유는
Form1이 delete되면서 자기가 가지고 있는 Components 에 들어있는 모든 Object들을 delete하고
자기도 죽기 때문입니다.
다시 말해 Components 을 잘이용하면 님께서 말씀하신 내용을 간단하게 구현가능합니다.
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TForm2 *fm;
for ( int i = 0; i < ComponentCount; i ++ )
{
if ( Components[i]->ClassNameIs ("TForm2") ) // 클래스 이름으로 찾을수 있음
{
fm=(TForm2 *)Components[i];
fm->foo=false;
fm->Caption="False"; //이전에 Show한 Form2를 모두 false로 변경
}
}
fm=new TForm2(this); //새로 Form2를 생성
fm->foo=true;
fm->Caption="True"; //새로생성한 Form2를 true로 설정
fm->Show();
}
//---------------------------------------------------------------------------
[추신]
Form위에 똑같은 Control이 수십개 수백개가 있을때
접근해서 설정하거나 할때도 위와 같이
ComponentCount
Components
Components[i]->ClassNameIs
이런것을 잘 이용하면 아주 쉽게 할수 있습니다.
야누 님이 쓰신 글 :
: Form2라는 폼이 있는데
:
: 버튼을 누르면 하나씩 생성되게하고 싶습니다.
:
: 그리고 form에 변수 bool foo가 있는데 새로 생성된 form에만 foo가 ture이고
:
: 나머지 생성된 폼은 foo가 false가 되게 하고 싶습니다.
:
: 그러니까, 버튼을 누를 때마다 Form2가 하나씩 생성되고 새 폼에만 foo가 trrue이고
:
: 예전에 생성된 form에서는 foo가 false가 되게 하고 싶습니다.
:
: 어떤 식으로 해야하나요?
:
: TForm2* array와 foo array를 만들어 놓고 form을 새로 만들고 닫을 때마다 array에 작업을 하고 , foo array에 작업을 하면될까요? 그런데 이러면 만들 수 있는 form의 갯수가 제한이 될거 같구요.
:
: 아니면 (TForm2* , foo)에 대한 liked list를 써서 생성할 때마다 node하나 생성하고 닫을 때 마다 list를 만들고 변경해야 하나요?
:
:
:
: 같은 폼 여러개 생성하는 것만이라도 가르쳐주세요.
:
: Form1에서 Form2를 생성한다고 할때,
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: TForm2* f2= new TForm2(this);
: f2->Show();
:
:
: }
: //---------------------------------------------------------------------------
:
:
: void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
: {
: delete this;
: }
: //---------------------------------------------------------------------------
:
: 처럼하면 메모리 반환이 제대로 되나요?
|