2

「無効な浮動小数点演算」というエラー メッセージに問題があります。ポップアップ メニューは設計時のコントロールであり、名前はNavPopです。メニュー項目は割り当てられていません。の popupmenu として割り当てられPanel1ます。

次に、リストボックスからメニュー項目を動的に作成し、キャプションとクリック イベントを割り当てます。私が達成しようとしていることに関して、すべてが 100% 機能します。すなわちそれは動作します。

プログラムを閉じたときにのみ、取得しますか

浮動小数点演算が無効です

もしくはそうでないか:

アクセス違反アドレス 000007355。アドレス 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;
4

1 に答える 1

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 でテストしたところ、メモリ リークは発生しませんでした。

于 2012-05-22T17:28:59.830 に答える