2011-01-10 87 views
1

我遇到了TScrollBox內由多個框架(通常爲25)組成的界面的問題。德爾福:框架的TList的問題

有2個問題,我希望其中一個是另一個的後果......

背景:

當應用程序啓動時,我創建了25幀,每片含約。 20個控件,然後填充默認信息。然後,用戶可以點擊一個控制來限制搜索到的在我釋放這點信息的一個子集,並重新創建我的幀(如搜索可能返回< 25條記錄)

問題:

如果我在初次搜索後退出了應用程序,然後大約需要。 5秒鐘後返回德爾福。第二次搜索後(和處理/重新創建幀)大約需要。 20秒)

雖然我可以重寫應用程序只創建一次幀,我想了解發生了什麼。

這裏是我創建常規:

procedure TMF.CreateFrame(i: Integer; var FrameBottom: Integer); 
var 
    NewFrame: TSF; 
begin 
    NewFrame := TSF.Create(Self); 
    NewFrame.Name := 'SF' + IntToStr(i); 
    if i = 0 then 
     NewSF.Top := 8 
    else 
     NewSF.Top := FrameBottom + 8; 
    FrameBottom := NewFrame.Top + NewFrame.Height; 
    NewFrame.Parent := ScrollBox1; 
    FrameList.Add(NewFrame); 
end; 

這裏是我的日常刪除:

procedure TMF.ClearFrames; 
var 
    i: Integer; 
    SF: TSF; 
begin 
    for i := 0 to MF.FrameList.Count -1 do 
    begin 
     SF := FrameList[i]; 
     SF.Free; 
    end; 
    FrameList.Clear; 
end; 

我缺少什麼?

+0

FrameList是什麼類型的?順便說一下,在ClearFrame中,你指的是for循環中的MF.Framelist。在這裏看起來不正確。 – 2011-01-10 17:08:24

+0

Framelist是在TMF主窗體的公共部分中聲明的TList。 ClearFrames中的MF是多餘的,但它本身不應該引起任何問題?更多皮帶和大括號... – 2011-01-10 17:12:10

回答

1

當您正在控制您通過Free'ing創建的Frame的內存分配時,所以不需要在create構造函數中提供Self作爲owner參數。通過零,而不是防止所有者試圖釋放框架。

此外,不喜歡你的ClearFrames例程的外觀。試試這個:

while FrameList.count > 0 do 
begin 
    TSF(Framelist[0]).free; 
    Framelist.delete(0); 
end; 
Framelist.clear; 
1

如果你想知道爲什麼你的應用需要花費這麼長時間來做某些事情,請嘗試分析它。針對您的程序嘗試運行Sampling Profiler。該幫助文件解釋瞭如何將分析僅限制到應用程序的特定部分,您可以使用該部分僅在清除或創建部件上獲取抽樣結果。這應該告訴你實際上你花費大部分時間在哪裏,並從中汲取大量猜測。

+2

對於性能分析來說,一種非常快速和骯髒的選擇是在調試器下運行,而長時間運行的操作正在發生,中斷執行,暫停執行或任何被調用。你做了幾次,就像那個窮人的取樣分析器。如果沒有很好的理由(甚至是出於正當的理由)出現某種令人驚訝的消耗CPU的情況,那麼你通常會闖入它的中間並且意識到明白。 – 2011-01-10 18:39:50