|
음.. TControl 계열 상속된 녀석들은 Parent만 설정 되어있어도 자동 free 된다..
^________^ 좋은거 배웠네요 감사합니다~~!
장성호 님이 쓰신 글 :
: 동적 생성한 Control 또는 Component 라 하더라도
: 생성할때 Owner만 제대로 정해주면 굳이 명시적으로 free해주지 않아도 됩니다.
: 왜냐하면 Owner컴포넌트가 free될때 자식들을 알아서 free해주니까요
:
: 더구나
: Control인경우 생성자에 Owner를 NULL로 주었다 하더라도
: Control의 Parent만 설정되어있으면 명시적으로 free해주지 않아도 되구요
: Owner가 없다고 하더라도 Parent가 있으면 Parnet가 free될때 자신위에 올려진 control들을 모두 free해주거든요
:
: 메인폼이면 FormClose가 폼의 free로 이어지지만
: 메인폼이 아닌경우 FormClose가 반드시 폼이 free되지는 않죠
:
: 그래서 FormClose때 동적으로 생성한 Control을 free하는것이 문제가 발생할수도 있습니다.
:
: 걍 제 생각에는
: 동적으로 생성한 컴포넌트, 컨트롤이라도 생성자에 Owner를 제대로 주고,
: 명시적으로 free하지 않는것이 바람직 하지 않나 하는것이 제 생각입니다.
:
: 그럼..
:
:
:
: 제리압빠. 님이 쓰신 글 :
: : 아..제가 코드를 잘 못 봤군요. TImage11을 list에 넣는 걸로 착각을 했었습니다..
: :
: : 자... TImage11은 전역 변수 이겠군요.( 지역이면 동적 할당 한거 날려 버리면 없어 져 버리겠지요... )
: :
: : 헤더에 TImage * img; 이라고 public 에 선언이 됐다고 가정하겠습니다.
: : 초기화를 위해서 폼 생성자에
: : __fastcall TForm1::TForm1(TComponent* Owner)
: : : TForm(Owner)
: : {
: : img = NULL;
: : }
: : 이렇게 세트 하였습니다.( 동적 할당 받았으면 더이상 할당 안하도록 하기 위해서 )
: : 버튼이 클릭되면 이미지 리스트에서 2번째 항목을 읽어 오는 루틴을 처리 했습니다.
: : void __fastcall TForm1::Button3Click(TObject *Sender)
: : {
: : if( img == NULL ) // img 가 초기 상태인 경우만 할당 합니다.
: : {
: : img = new TImage(this);
: : ShowMessage( "생성됨");
: : img->Left = 0;
: : img->Top = 0;
: : img->Width = 100;
: : img->Height = 100;
: : img->Parent = Form1;
: : }
: :
: : imgList1->GetBitmap( 1 , img->Picture->Bitmap );
: :
: : //--------- TImageList의 Width = 100 , Height = 100 이라고 가정 하고 아래 주석을 풀면
: : // 검정 사각형이 보이면 TImage는 생성 된겁니다.
: : /*
: : img->Picture->Bitmap->Canvas->Brush->Color = clBlack;
: : img->Picture->Bitmap->Canvas->FillRect( Rect( 0 , 0 , img->Width, img->Height ) );
: : */
: :
: : }
: : // 폼이 종료 될때 동적 할당 된 정보 삭제 합니다.
: : void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
: : {
: : delete img; // 혹은 if( img ) delete img;
: : }
: :
: : ImageList를 사용할 경우 ImageList 자체에 Width 와 Height 가 있습니다. 이부분 설정 해보시구요.
: : 이미지가 찌부러 들지요... 사이즈가 작으면.
: : 그리고 이미지를list에 로드 할때 보면 Trasparent Color라는 콤보박스가 활성화 되면 투명색 처리된 부분은
: : clWhite가 투명색이면 clWhite는 TImage에 찍히지 않습니다.
: :
: : 종합해보면. 이미지가 찍히긴 찍혔는데 그 값이 투명색 때문에 보이지 않은 듯 합니다.
: :
: : 아울러 동적할당 하는 경우 동적할당 할 넘을 전체 어플리케이션에서 핸들링 할수 있도록 위에
: : 전역의 TImage *img ; 처럼 선언 후 사용하시는 걸 추천 합니다.
: : 프로그램이 종료 될때 꼭 img를 날려줘야 하기 때문에 그렇습니다.
: :
: : 참고로 실제로 돌려보았습니당.~~~!
: :
: : 수고하세염
: :
: : 동적생성 님이 쓰신 글 :
: : : 우선 답변 감사합니다~(__
: : : ImageList1->GetBitmap(b,Image11->Picture->Bitmap);
: : : 위에소스와 같이 이미지 리스트에 bmp이미지들을 넣어서 그 이미지를 동적생성한 Image11에 넣고싶은데요
: : : 저렇게 하면 안되는 건가요??
: : :
: : :
: : :
: : :
: : :
: : : kamizen 님이 쓰신 글 :
: : : : 아래 코드에서 Image11에 이미지를 로드하는 루틴이 모이지 않습니다만...ㅡ.ㅡ;
: : : : Image11->Picture->LoadFromFile 이게 삽입 되어야 될거 같습니다...( 혹은 타 리소스에서 Picture 정보에 다른 값을 복사해주시던가. )
: : : : 동적 생성인 관계로..Image11의 포인터가 지역 변수라면 ImageList1에 GetBitmap 하신담에 비트맵 확보해주시고...
: : : : 꼭 delete Image11; 해주셔야 할 겁니다.
: : : :
: : : :
: : : : 동적생성 님이 쓰신 글 :
: : : : : TImage *Image11;
: : : : :
: : : : : Image11 = new TImage(this);
: : : : : Image11->Parent = Form1;
: : : : : Image11->Width = 70;
: : : : : Image11->Height = 50;
: : : : : Image11->Left = 100;
: : : : : Image11->Top = 100;
: : : : : ImageList1->GetBitmap(b,Image11->Picture->Bitmap);
: : : : :
: : : : : 이렇게 동적으로 생성한후에 이미지 리스트에 있는 이미지로 출력하려고 하는데요.
: : : : : 보이질 않습니다.
: : : : :
: : : : : 버튼을 동적생성하여 보면 분명히 잘 나오는데 이미지만 안나오네요. 도와주세요
|