Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[14652] Re:Re:Re:컴포넌트를 못찾아요 이유를 모를겠습니다. 좀....
별을보라 [piney] 1887 읽음    2013-04-11 17:00
먼저 델파이는 OwnerShip 기반으로 객체의 소멸을 관리하므로 특별한 경우가 아니면 일부러 Components 를 찾아
메모리를 해제할 필요가 없다는건 아실 거라 생각하겠습니다.

전체 소스가 없으니 점검하실 부분만 말씀드릴게요.

1. 버튼, 에디트, 메모, 라벨, 쉐이프, 이미지를 동적으로 만드실 때
   TButton.Create(여기에 어떤 인자를 넘기는지요?)
   일반적으로 Self 또는 폼변수를 넘기고 있나요? 아니라면 당연히 님이 제시한 코드가 실행되지 않을 겁니다.
   예를 들어 님 코드에
     aSend_Btn_1:= TButton.Create(Self);  // 이렇게 되어 있어야 합니다.

2. Pos 함수는 대소문자를 구분합니다. 혹시 Name 부여시 대소문자가 정확한지 확인해 보세요.

3. 마지막으로 이건 직접적인 영향이 없을 수도 있지만 중요한 거라 말씀드리고 싶네요.
    제시한 코드는 형검사를 안하고 형변환을 수행하고 있습니다.
    i) 꼭 이름으로 찾아서 메모리 해제를 하시려면
      for i := ComponentCount - 1 down 0 do begin
         if ((Components[i] is TButton) and
             ((Pos('aSend_'  ,TButton(Self.Components[i]).Name)<>0) Or
              (Pos('aDelete' ,TButton(Self.Components[i]).Name)<>0))) Then TButton(Self.Components[i]).Free
         Else If ((Components[i] is TEdit) and
                    (Pos('aEdit_'  ,TEdit  (Self.Components[i]).Name)<>0)) Then TEdit  (Self.Components[i]).Free
         ........
      end;
     이렇게 하면 SCE(boolean short circuit evaluation) 에 따라 오류가 발생하지 않습니다.

   ii) 이름이 아니고 형검사만으로 해제하려면

      for i := ComponentCount - 1 down 0 do begin
         if (Components[i] is TButton) then TButton(Components[i]).Free
        else if (Components[i] is TEdit) then TEdit(Components[i]).Free
        ....
     end;
     이렇게 하시면 좀 보기 쉽겠죠.

그럼.


따랑 님이 쓰신 글 :
: 답변 감사드립니다.
: 아래와 같이도 작성해보았는데 해제작업이 안되요
: 감사합니다.
:
: for i := ComponentCount - 1 down 0 do
: beign
:   // Do destory Instance
: end;
: gomsun2 님이 쓰신 글 :
: : 안녕하세요 따랑님 :) 오늘 두번이나 뵙네요.
: :
: : 팁, 트릭 란에 올리신 질문은 삭제 해주시고요,
: :
: : 답변입니다.
: :
: : 파괴를 하는 루틴에서는 looping 할 때 역순으로 해야 합니다.
: : 5개의 컴포넌트를 찾아 파괴하는 시나리오를 생각해 보면
: :
: : 각각의 인덱스가 아래와 같이 있다고 가정하고,
: : 0, 1, 2, 3, 4
: :
: : 파괴를 위한 루핑을 시작합니다.
: : i 는 0 일때 1번 돌면
: : 0, 1, 2, 3
: :
: : i 는 1 일때 2번 돌면
: : 0, 1, 2
: :
: : i 는 2 일때 3번 돌면
: : 0, 1
: : 문제가 발생합니다.
: :
: : 때문에 리스트(Components)에 담긴 인스턴스를 파괴할려면
: :
: : for i := ComponentCount - 1 down 0 do
: : beign
: :   // Do destory Instance
: : end;
: : 

: : 와 같이 작업하셔야 합니다.
: :
: : 즐코하세요 :)
: :
: : 따랑 님이 쓰신 글 :
: : : 안녕하셔요
: : : 컴포넌트를 Button,Edit,Label등을 반목하여 생성하여 ㅅ해제후 또 생성하는 작업입니다
: : : 생성과 해제가 반복되는 작업입니다.
: : : 그런데 같은 컴포넌트를 찾아서 해제하는 작업에 문제가 있습니다.
: : : 부탁드립니다.
: : : 소스는 아래와 같습니다.
: : :
: : :        For i:=0 to Self.ComponentCount-1  Do Begin
: : :             If      (Pos('aSend_'  ,TButton(Self.Components[i]).Name)<>0) Or
: : :                     (Pos('aDelete' ,TButton(Self.Components[i]).Name)<>0) Then TButton(Self.Components[i]).Free
: : :             Else If (Pos('aEdit_'  ,TEdit  (Self.Components[i]).Name)<>0) Then TEdit  (Self.Components[i]).Free
: : :             Else If (Pos('aMemo_'  ,TMemo  (Self.Components[i]).Name)<>0) Then TMemo  (Self.Components[i]).Free
: : :             Else If (Pos('aLabel_' ,TLabel (Self.Components[i]).Name)<>0) Then TLabel (Self.Components[i]).Free
: : :             Else If (Pos('aShape_' ,TShape (Self.Components[i]).Name)<>0) Then TShape (Self.Components[i]).Free
: : :             Else If (Pos('aImage_' ,Timage (Self.Components[i]).Name)<>0) Then Timage (Self.Components[i]).Free;
: : :         End;
: : :     

+ -

관련 글 리스트
14643 컴포넌트를 못찾아요 이유를 모를겠습니다. 좀.... 따랑 1893 2013/04/05
14644     Re:컴포넌트를 못찾아요 이유를 모를겠습니다. 좀.... gomsun2 1912 2013/04/05
14645         Re:Re:컴포넌트를 못찾아요 이유를 모를겠습니다. 좀.... 따랑 1714 2013/04/09
14652             Re:Re:Re:컴포넌트를 못찾아요 이유를 모를겠습니다. 좀.... 별을보라 1887 2013/04/11
14654                 Re:Re:Re:Re:또다른 생성된 컴포넌트 질문입니다. 부탁드립니다. 따랑 1828 2013/04/12
14655                     Re:Re:Re:Re:Re:또다른 생성된 컴포넌트 질문입니다. 부탁드립니다. gomsun2 2567 2013/04/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.