2012-05-20 50 views
1

我有一個錯誤消息「無效的浮點操作」的問題。彈出菜單是一個設計時間控件,它被命名爲NavPop。它沒有分配菜單項。它被指定爲Panel1的彈出菜單。德爾福Dyncam創建彈出式菜單項 - 無效的指針操作/訪問衝突

然後,我從列表框中動態創建菜單項,並指定標題和單擊事件。就我所要完成的事情而言,一切都有效。即它工作。

只有當我關閉程序,做我得到

無效的浮點運算

或以其他方式:

訪問衝突地址000007355.讀Addrss 0000007355.

請請注意,除了關閉程序時發生的錯誤,所有內容都可以正常工作。我將不勝感激任何幫助。

// I declare the Array of TMenuItems 
private 
    { Private declarations } 
    ItemArray : array of TMenuItem; 

...  

procedure TMainForm.Button1Click(Sender: TObject); 
begin 
    CreateNavPop; 
end; 

// Create the menu items from listbox(Navlist) items and Link them 
// to events on a navigation bar. 
procedure TMainForm.CreateNavPop; 
var 
    I: Integer; 
    NavIndex: Integer; 
begin 
    SetLength(ItemArray, NavList.Items.Count); 
    NavIndex:=0; 
    For I:=0 to NavList.Items.Count-1 do 
    begin 
    NavIndex:=NavBar1.Items.ItemByCaption(NavList.Items.Strings[i]).Index; 
    ItemArray[i]:=TMenuItem.create(Nil); 
    ItemArray[i].Caption:=NavList.Items.Strings[i]; 
    ItemArray[i].OnClick:=NavBar1.Items.Items[Navindex].OnClick; 
    NavPop.Items.Add(ItemArray[i]); 
    end; 
end; 

// Call the Items free on program close 
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    FreeItems(ItemArray); 
end; 

// Free Dynamically created Menu Items on Form Close 
procedure TMainForm.FreeItems(MItems : array of TMenuItem); 
var 
    cnt : integer; 
begin 
    for cnt := High(MItems) downto Low(MItems) do 
    begin 
    MItems[cnt].Free; 
    MItems[cnt] := nil; 
    end; 
end; 
+0

不應該在構造函數中分配「TMenuItem」的所有者嗎?你現在將它設置爲「nil」。 – Pateman

+0

在保持TMenuItem列表中有一點值得注意嗎?只要像Pateman說的那樣在構造函數(navpop)中分配一個所有者就足夠了。 –

+2

有關示例,請參見[如何動態添加項目(保存自定義屬性)到TPopUp菜單](http://delphi.about.com/od/kbcurt/a/dynamicmenuitem.htm)。要調試您的程序,請使用FastMM和調試選項,如下所示:[如何打開/關閉Delphi XE下的FastMM內存泄漏報告?](http://stackoverflow.com/q/6075554/576719)或在這裏:[如何在FastMM4中啓用完整調試模式?](http://stackoverflow.com/a/8601505/576719)。 –

回答

2

發生這種情況是因爲TPopupMenu已經釋放了這些項目,並且您再次釋放它。

此代碼將導致「無效的指針操作」:

procedure TForm1.FormCreate(Sender: TObject); 
var 
    I: Integer; 
begin 
    for I := 0 to 3 do 
    PopupMenu1.Items.Add(TMenuItem.Create(nil)); 
end; 

destructor TForm1.Destroy; 
var 
    I: Integer; 
begin 
    for I := 3 downto 0 do 
    PopupMenu1.Items.Free; 
    inherited; 
end; 

Items屬性是TMenuItem例如,如果你看它的析構函數,它已經釋放所有的項目,你加入。

destructor TMenuItem.Destroy; 
begin 
... 
    while Count > 0 do Items[0].Free; 
... 

保持簡短,您不需要在FreeItems方法中再次執行此操作。

我使用ReportMemoryLeaksOnShutdown進行了測試:= True且不發生內存泄漏。

+0

雖然正確,但有一個類似的*刪除*答案OP已評論*「..我仍然得到相同的錯誤」*。這個問題也可能存在其他一些問題。 +1無論如何.. –

+1

感謝您指出,但在這種情況下,他應該更新他的問題與更多的細節和調用堆棧顯示AV出現的地方。感謝+1 :) –