2009-06-30 108 views
3

我有一個包含TOpenDialog組件(OpenDialog1)和一個按鈕的窗體。 OpenDialog1ofAllowMultiSelect(的Options)屬性設置爲true。無效的指針操作

一旦點擊執行方法AddFilesToListView按鈕:

procedure TForm4.AddFilesToListView(); 
var 
    ListItem : TListItem; 
    I: Integer; 
    F : File; 
    LengthOfAudio : TDateTime; 
    previousCursor : TCursor; 

begin 
    previousCursor := Self.Cursor; 
    Self.Cursor := crHourGlass; 

    if OpenDialog1.Execute then 
    begin 
    for I := 0 to OpenDialog1.Files.Count - 1 do begin 
     if FileExists(OpenDialog1.FileName) then begin 
     ListItem:=ListView1.Items.Add; 
     ListItem.Caption := 'Test'; 
     ListItem.SubItems.Add(ExtractFileName(OpenDialog1.Files[I])); 
     ListItem.SubItems.Add(ExtractFilePath(OpenDialog1.Files[I])); 
     end else 
     raise Exception.Create('File does not exist.'); 
    end; 
    end; 

    Self.Cursor := previousCursor; 

    OpenDialog1.Files.Free; 
end; 

運行應用程序時,選擇的第一個文件,我沒有任何問題,但想選擇第二個的時候,我得到一個錯誤說「 Project project3引發了一個異常類EInvalidPointer,並顯示消息'Invalid Pointer Operation'。「

這是什麼原因,我該如何糾正?

回答

22

「指針操作無效」表示釋放了不屬於您的內存。其中之一是原因:

  • 你的程序釋放了一些已經被釋放過的東西。
  • 你的程序釋放了一些從未分配的東西。
  • 您的程序釋放了一些已分配給不同內存管理器的內容。

在您的代碼中,您將釋放TOpenDialogFiles屬性。您沒有分配該字符串列表,並且文檔沒有告訴您釋放它,所以期望列表實際上屬於對話框組件並且該組件將在需要時將其釋放,這是合理的。檢查中的源代碼Dialogs.pas證實了這一點。既然你也已經釋放了這個對象,那麼你就有一個雙重的錯誤,它符合我上面列出的第一個標準。刪除該行。

由於Uwe pointed out,您還正在處理列表的文件名,但只檢查一個的存在。這是程序中的邏輯錯誤,但它不會導致您看到的異常。

+0

除了釋放不屬於您的內存之外,您可以獲得無效指針操作異常。它只是意味着你跟隨了一個糟糕的指針。釋放別人的數據是其中一個原因,而不是它的唯一原因。 – 2009-06-30 23:17:33

3

您應該檢查

if FileExists(OpenDialog1.Files[I]) then begin 

,而不是

if FileExists(OpenDialog1.FileName) then begin 

更好的投資在一個局部變量保存該值。

爲什麼這樣?

OpenDialog1.Files.Free; 
+0

嗨Uwe,我改變'如果FileExists(OpenDialog1.Files [I])然後開始',我註釋掉這一行:OpenDialog1.Files.Free; 並且錯誤消失。看起來最後一行是導致問題的原因。 – Attilah 2009-06-30 18:03:09

2

文件歸屬於TOpenDialog,不應直接釋放。