먼저 델파이는 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;
: : :