2012-05-20 1 views
1

"잘못된 부동 소수점 연산"오류 메시지에 문제가 있습니다. 팝업 메뉴는 디자인 타임 컨트롤이고 이름은 NavPop입니다. 메뉴 항목이 할당되어 있지 않습니다. Panel1에 대한 팝업 메뉴로 지정됩니다.델파이 비동기식으로 생성 된 팝업 메뉴 항목 - 잘못된 포인터 연산/액세스 위반

그런 다음 목록 상자에서 메뉴 항목을 동적으로 만들고 캡션 및 클릭 이벤트를 할당합니다. 모든 것은 내가 성취하려고 노력하는 관점에서 100 % 작동합니다. 즉 작동합니다. Addrss 0000007355.

액세스 위반 주소 000007355. 읽기 : 내가 프로그램을 닫을 때

만, 내가

잘못된 부동 소수점 연산

또는 기타를받을 수 있나요

프로그램을 닫을 때의 오류를 제외하고는 모든 것이 완벽하게 작동한다는 점에 유의하십시오. 나는 어떤 도움을 주셔서 감사합니다.

// 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

TMenuItems의 목록을 유지하는 것이 중요합니까? 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; 

항목 속성은 TMenuItem 인스턴스이며, 당신이 그것을 보면 소멸자, 그것은 모든 항목이 이미 무료 당신은 덧붙였다.

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

간단히 말하면 FreeItems 메서드에서 다시 할 필요가 없습니다.

ReportMemoryLeaksOnShutdown : = True로 테스트하여 메모리 누수가 발생하지 않았습니다.

+0

올바른 동안 OP가 주석 처리 한 유사한 * deleted * 대답이 있습니다. ".. 나는 여전히 동일한 오류가 발생합니다"*.또한이 질문에서 분명하지 않은 다른 문제가있을 수 있습니다. +1 어쨌든 .. –

+1

그 점을 지적 주셔서 감사합니다,하지만 그 경우에는 더 자세한 내용과 AV 발생 위치를 보여주는 호출 스택을 업데이트해야합니다. +1 주셔서 감사합니다 :) –