我想在程序中让程序自动建立快捷菜单,比如说在我的程序单元中有几Button按钮,程序运行时,各按钮的名称能自动加入到快捷菜单中,并能响应其事件,我用下这段代码总是出错,各位同仁帮帮我吧
var pop:tpopupmenu;
    i:integer;
begin
  pop:=tpopupmenu.Create(nil);
  for i:=0 to componentcount-1 do
    begin
      if components[i] is TButton   then
        begin
         with pop.Items do
           begin
            add(Newitem(TButton (components[i]).Caption,0,false,true,TButton (components[i]).OnClick ,0,'menuitem'+inttostr(i)))
          end;
        end;  
     end;
Form1.PopupMenu:=pop;

解决方案 »

  1.   

    pop要声明成全局变量,否则你的函数调用结束,pop就被释放了
    下面的函数经过测试,正确var
      Form1: TForm1;
      pop: TPopupMenu; //声明为全局变量implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    var
     i: Integer;
    begin
     pop:=TPopupMenu.Create(Form1);
     //最好给它指定Owner,pop可以在Form1关闭时自动释放,
     //免得造成内存漏洞
     for i:=0 to Form1.ComponentCount-1 do
      if Form1.Components[i] is TButton then
       pop.Items.add(Newitem(TButton (components[i]).Caption,0,false,true,TButton (components[i]).OnClick ,0,'menuitem'+inttostr(i)));
     Form1.PopupMenu:=pop;
    end;