2013-08-08 3 views
0

this question을 읽은 후 런타임에 최종 사용자가 내 응용 프로그램의 스타일을 변경하도록했습니다. 이것은 다음과 같은 내용으로 메모리 누수의 매우 긴 목록으로 이어질했습니다런타임시 VCL 스타일을 변경하면 메모리 누수가 발생합니다.

A memory block has been leaked. The size is: 12 

This block was allocated by thread 0x130C, and the stack trace (return addresses) at 
the time was: 404B3E [frxDsgnIntf.pas][System][@GetMem$qqri][1993] 454B77 
[System.SysUtils][Sysutils.WideStrAlloc$qqrui] 454BB2 [System.SysUtils] 
Sysutils.StrNew$qqrpxb] 53046E [Vcl.Controls][Controls.TWinControl.DestroyWnd$qqrv] 
57E1C7 [Vcl.ComCtrls][Comctrls.TCustomTreeView.DestroyWnd$qqrv] A53DEE [JvComCtrls] 
TJvTreeView.DestroyWnd$qqrv] 530733 [Vcl.Controls] 
Controls.TWinControl.DestroyHandle$qqrv] 530703 [Vcl.Controls] 
Controls.TWinControl.DestroyHandle$qqrv] 530703 [Vcl.Controls] 
Controls.TWinControl.DestroyHandle$qqrv] 7552FEB6 [EnumThreadWindows] 530703 
[Vcl.Controls][Controls.TWinControl.DestroyHandle$qqrv] 

The block is currently used for an object of class: Unknown 

는 거의 모든 누출의 사용자가 스타일을 변경 할 수있는 형태의 모든 구성 요소를 제외하고, frxDsgnIntf.pas에 이 절차에 대한 모든 점 :

with TdlgSettings.Create(nil) do // leak here according to FastMM report 
    try 
    if ShowModal = mrOk then; 
    finally 
    Release; 
    end; 
내가 뭔가 잘못하고 있어요 경우

사람이 알고 있나요 또는이 스타일을 변경 TStyleManager예상 행동입니까? 다음은 런타임에 스타일을 변경하는 코드는 다음과 같습니다

procedure TdlgSettings.cbThemeChange(Sender: TObject); 
begin 
    TStyleManager.TrySetStyle(cbTheme.Text); // cbTheme.Items lists all the themes which are included the application 
end; 
+1

'frx'은 스타일과는 아무 상관이없는, 그것은 FastReports의 나타내고,'DsgnIntf'은 단지 코드의 의미 IDE의 디자인 타임에 사용됩니다. IOW, 여기에 문제가 없습니다. –

+0

@KenWhite 두 가지 포인트 : 1) frxDsgnIntf.pas가 내 응용 프로그램에 연결되어 있지 않으면 FastMM이 메모리 누수에 대해 불만을 표시하는 이유는 무엇입니까? 2) 누수 보고서가 끝나면 응용 프로그램 내에서 'TStyleManager.TrySetStyle (cbTheme.Text);'을 호출 할 때만 메모리 누수가 발생한다는 표시가 나타납니다. 'TStyleManager'가 현재 설정된 스타일을 바꿀 때 활성 폼이 적절하게 해제/재생성되지 않은 것처럼 보입니다. –

답변

관련 문제