2012-06-21 2 views
1

TChart를 제거하고 모든 메모리를 할당 해제하기위한 올바른 방법을 찾고 있습니다. 나는 표준의 TeeChart와 Delphi2007을 사용하고 7프로그래밍 방식으로 TChart를 폼에서 제거하십시오.

나는 프로그래밍 TChart입니다을 만들 :

var parentform: TForm; 
begin 
newchart:= TChart.Create(parentform); 
newchart.Parent:= parentform; 
... 

그런 다음, 나는 (양식 자체를 폐쇄하지 않음) 형태에서만 차트를 제거하려면,하지만 난 얻을 차트는 비어있게하고 양식에 남아 것만 :

newChart.FreeAllSeries; 
FreeAndNil(newChart); 

내가 사용하는 경우

NewChart.Parent := nil, 

더 이상 차트가 표시되지 않지만 TChart 개체가 여전히 존재한다고 생각합니다 (상위 폼이 소멸 될 때까지). 이 작업을 수행 할 수있는 구체적인 방법이 있습니까?

newChart.Free; 

당신은 당신이 경우 대신 FreeAndNil를 호출 할 수 는

+1

'FreeAndNil' 호출 후에 차트가 존재하지 않습니다. –

+0

왜 TChart.Create를 호출하고 첫 번째 것을 누설 했습니까? 이게 진짜 코드인가요? 차트를 확보하면 충분합니다. –

+0

사실이 코드는 단순화 된 부분이며 복사 및 붙여 넣기 오류입니다. 신속한 응답을 주셔서 대단히 감사합니다. 원래 코드로 다시 시도했으며 작동합니다. FreeAndNil 호출하지 않고 이전 버전을 테스트하는 가정 ... 그리고 FreeandNil stackoverflow에 대한이 질문을 시도 할 것 같아요! – lib

답변

5

가장 간단한 방법은 TChart 제어 제거, 아니면 그냥 모든 컨트롤에 대해, 그 문제에 관해서, 그것에 Free를 호출하는 것입니다받을 주셔서 감사합니다 소원. 이는 Free을 호출하는 것과 동일한 효과를 가지지 만 변수의 값도 nil으로 설정합니다. 나중에 변수의 값을 테스트하여 여전히 컨트롤에 액세스 할 수 있는지 여부를 감지 할 때 유용합니다. 변수를 다시 참조하지 않으면 FreeAndNil은별로 도움이되지 않습니다.

컨트롤은 자동으로 FreeAllSeries으로 해제 한 시리즈와 같이 소유하고있는 다른 것들을 자동으로 해제합니다. 너 자신을 해방 할 필요는 없다.

컨트롤의 Parent 속성을 지우는 것만으로 컨트롤이 해제되지 않습니다. Parent 속성을 다시 할당하고 화면에 컨트롤이 다시 표시됨을 확인하면이를 증명할 수 있습니다. 그 통제가 존재하지 않는다면 그것은 일어나지 않을 것입니다.

컨트롤을 해제 한 후에도 화면에 계속 표시되면 다른 문제가 발생합니다. 어쩌면 상위 컨트롤이 제대로 다시 그려지지 않았을 수 있습니다. 상위 컨트롤에서 Refresh을 호출 해보십시오. 여러 컨트롤을 볼 수도 있습니다. 결국, 질문의 코드는 두 개의 차트 컨트롤을 생성하므로, 그 중 하나가 계속 표시 될 수 있으며 사용자가 파괴 한 컨트롤에 대해 잘못 판단한 것일 수 있습니다.

+0

구성 요소에'Free' 대신'Release'을 사용하는 것이 바람직하지 않습니까? –

+4

@Arnaud : 아니요. '출시'는 완전히 다른 목적으로 설계되었습니다. 이것은 폼을 릴리즈하기위한 것이며, 그 폼의 이벤트 핸들러 내부로부터 컴포넌트를 모두 가지고 있습니다. 자세한 내용은 [문서] (http://docwiki.embarcadero.com/Libraries/en/Vcl.Forms.TCustomForm.Release)를 참조하십시오. –

+0

차트 고유의 방법 중 하나에서 차트 구성 요소를 해제 한 경우 예, @Arnaud를 사용하면 '릴리스'와 비슷한 기술을 사용하는 것이 좋습니다. 그러나 'TComponent'에는 그러한 메소드가 없습니다.게다가, 그러한 합병증이 필요하다는 의문의 여지가 없습니다. 일반적인 방법으로 효과가 없다면 후속 질문을 할 수 있습니다. –