procedure TForm1.N4Click(Sender: TObject);
  var MenuItem:TMenuItem;
begin
  
  datamodule2.Query2.Close;
  datamodule2.Query2.SQL.clear;
  datamodule2.Query2.sql.add(' select * from 传输系统 order by xuhao ');
  datamodule2.Query2.Open;
  if not datamodule2.Query2.Eof then
  while not datamodule2.Query2.Eof do
  begin
   MenuItem         :=TMenuItem.create(self);
   MenuItem.Name    :='m'+trim(datamodule2.Query2.fieldbyname('xuhao').asstring);
   MenuItem.Caption :=    trim(datamodule2.Query2.fieldbyname('name').asstring);
   MainMenu1.Items[2].add(MenuItem) ;
   datamodule2.Query2.next;
   MenuItem.OnClick:=Pro_Click;
   end;
  end;
  procedure tform1.Pro_Click;
begin
  ShowMessage('鼠标点击事件');
    end;
现在出现逻辑问题,当我第一次点n4菜单时,可以从数据库中把内容取出来,并且一切正常,但是我第二次点n4菜单时候,系统提示,a component  name m1 already exists
请高手指点,万分感谢

解决方案 »

  1.   

    在创建前,先释放(包括把事件指为NIL)
      

  2.   

    procedure TForm1.N4Click(Sender: TObject);
      var MenuItem:TMenuItem;
    begin
      
      datamodule2.Query2.Close;
      datamodule2.Query2.SQL.clear;
      datamodule2.Query2.sql.add(' select * from 传输系统 order by xuhao ');
      datamodule2.Query2.Open;
      if not datamodule2.Query2.Eof then
      while not datamodule2.Query2.Eof do
      begin
       MenuItem         :=TMenuItem.create(self);
       MenuItem.Name    :='m'+trim(datamodule2.Query2.fieldbyname('xuhao').asstring);
       MenuItem.Caption :=    trim(datamodule2.Query2.fieldbyname('name').asstring);
       MainMenu1.Items[2].add(MenuItem) ;
       datamodule2.Query2.next;
       MenuItem.OnClick:=Pro_Click;
       end;
    TForm1.N4Click:=nil; 
     end;
      

  3.   

    procedure TForm1.N4Click(Sender: TObject);
      var MenuItem:TMenuItem;
    begin
      
      datamodule2.Query2.Close;
      datamodule2.Query2.SQL.clear;
      datamodule2.Query2.sql.add(' select * from 传输系统 order by xuhao ');
      datamodule2.Query2.Open;
      if not datamodule2.Query2.Eof then
      while not datamodule2.Query2.Eof do
      begin
       MenuItem         :=TMenuItem.create(self);
       MenuItem.Name    :='m'+trim(datamodule2.Query2.fieldbyname('xuhao').asstring);
       MenuItem.Caption :=    trim(datamodule2.Query2.fieldbyname('name').asstring);
       MainMenu1.Items[2].add(MenuItem) ;
       datamodule2.Query2.next;
       MenuItem.OnClick:=Pro_Click;
       end;
    TForm1.N4.enabled:=false; 
     end;
      

  4.   

    zjybestzjybest(zjybestzjybest) 你好,我用了你说的方法。第一次用TForm1.N4Click:=nil; 时编译提示
    两个错误: 1。Not enough actual parameters ;2。 Could not compile used unit 'Unit1.pas'  第二个用TForm1.N4.enabled:=false; 这样显然使N4不可用,可是不可行的。还有其他的办法吗?很急,谢谢了。
      

  5.   

    procedure TForm1.N4Click(Sender: TObject);
    const
      S = 'select * from 传输系统 order by xuhao';
    var
      nParent, MenuItem:TMenuItem;
    begin
      nParent := MainMenu1.Items[2];
      with DataModule2, Query2 do begin
        Close;
        SQL.Text := S;
        Open;
        First;
        while not Eof do begin
          if not Assigned(FindComponent('m' + Trim(FieldByName('xuhao').AsString))) then
          begin
            MenuItem         := TMenuItem.Create(Self);
            MenuItem.Name    := 'm' + Trim(FieldByName('xuhao').AsString);
            MenuItem.Caption := Trim(Query2.FieldByName('name').AsString);
            MenuItem.OnClick := Pro_Click;
            nParent.add(MenuItem) ;
          end;
          Next;
        end;
      end;
    end;
      

  6.   

    largewang(成都:王珍义[老王]) ,都谢帮忙,可以问题还一样
    第二次点n4菜单时候,系统提示,a component  name m1 already exists
      

  7.   

    这个问题真让我头疼
    我头都大了,我觉得在创建前先释放是对的,可以怎么释放呢
    MainMenu1.Items[2].Clear;吗
      

  8.   


    procedure TMainForm.CreateWindowMenu;
    var
      i:Integer;
      AMenu:TMenuItem;
    begin
      WindowMenu.Clear;
      for i:=0 to High(FormList) do
      begin
        AMenu:=TMenuItem.Create(self);
        AMenu.Caption:=FormList[i].Caption;
        AMenu.Checked:=True;
        AMenu.tag:=i;
        AMenu.OnClick:=ShowWindows;
        WindowMenu.Add(AMenu);
      end;
    end;我的类似代码,先MainMenu1.Items[2].Clear,不要给NAME赋值。
      

  9.   

    var
      Form1: TForm1;
      aItems:Array of TMenuItem;
    implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    Var  I:integer;
    begin
      datamodule2.Query2.Close;
      datamodule2.Query2.SQL.clear;
      datamodule2.Query2.sql.add(' select * from 传输系统 order by xuhao ');
      datamodule2.Query2.Open;
      For i:=0 to Length(aItems)-1 do
        if Assigned(AItems[i]) then AItems[i].Free;
      SetLength(aItems,datamodule2.Query2.recordCount);
      for i:=0 to datamodule2.Query2.recordCount-1 do
      begin
         aItems[i]:=TMenuItem.Create(Application);
         aItems[i].Name :='m'+trim(datamodule2.Query2.fieldbyname('xuhao').asstring);
         aItems[i].Caption :=    trim(datamodule2.Query2.fieldbyname('name').asstring);
         aItems[i].OnClick:=Pro_Click;
         DBISAMTable1.next;
     end;
    MainMenu1.Items[0].Add(aItems);
    end
      

  10.   

    var
      Form1: TForm1;
      aItems:Array of TMenuItem;
      FMenu:TSeSkinItem;
      NewChildClass: TFormClass;
      NewChildForm: TForm;
    implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    Var  I:integer;
    begin
      datamodule2.Query2.Close;
      datamodule2.Query2.SQL.clear;
      datamodule2.Query2.sql.add(' select * from 传输系统 order by xuhao ');
      datamodule2.Query2.Open;
      For i:=0 to Length(aItems)-1 do
        if Assigned(AItems[i]) then AItems[i].Free;
      SetLength(aItems,datamodule2.Query2.recordCount);
      for i:=0 to datamodule2.Query2.recordCount-1 do
      begin
         aItems[i]:=TMenuItem.Create(Application);
         aItems[i].Name :='m'+trim(datamodule2.Query2.fieldbyname('xuhao').asstring);
         aItems[i].tag:=datamodule2.Query2.fieldbyname('xuhao').asinteger;
         aItems[i].Caption :=    trim(datamodule2.Query2.fieldbyname('name').asstring);
         aItems[i].OnClick:=Pro_Click;
         datamodule2.Query2.next;
     end;
    MainMenu1.Items[0].Add(aItems);
    end;procedure TForm1.Pro_Click(Sender: TObject);
    if Assigned(NewChildForm) then
    Begin
    Try
      NewChildForm.Free;
    finally
      FMenu.Enabled :=True;
    end;
    end;Case (Sender As TSeSkinItem).tag of
         11:    NewChildClass:= TFrmCarInfo;
         12:    NewChildClass:= TFrmDriverInfo;
         13:    NewChildClass:= TFrmMasterInfo;
         21:    NewChildClass:= TFrmTax;
         22:    NewChildClass:= TFrmInsurance;
         31:    NewChildClass:= TFrmPeccancy;
         32:    NewChildClass:= TFrmAccident;
         33:    NewChildClass:= TFrmRePair;
         34:    NewChildClass:= TFrmLearn;     61:    NewChildClass:= TFrmRules;
         71:    NewChildClass:= TFrmBaseTable;
         72:    NewChildClass:= TFrmSysInit;
         73:    NewChildClass:= TFrmprivilageSet;
         74:    NewChildClass:= TFrmpayRuleSet;
         75:    NewChildClass:= TFrmDBBackup;
        else    NewChildClass:=nil;
    end;if Assigned(NewChildClass) then
    Begin
      NewChildForm :=NewChildClass.Create(Application);
      With NewChildForm do
      Try
        Hint:=AppTitle;
        BorderStyle:= bsNone;
        BorderIcons:=[];
        Parent:=Self.Panel1;
        WindowState:=wsMaxiMized;
        Align:=alClient;
        Show;
      finally
        FMenu:= Sender as TSeSkinItem;
        FMenu.Enabled :=False;
      end;
    end;
    Self.Caption :=AppTitle+'管理系统 -> '+NewChildForm.Caption;
    end
      

  11.   

    procedure TForm1.N4Click(Sender: TObject);
      var MenuItem:TMenuItem;
    begin
      
      datamodule2.Query2.Close;
      datamodule2.Query2.SQL.clear;
      datamodule2.Query2.sql.add(' select * from 传输系统 order by xuhao ');
      datamodule2.Query2.Open;
      datamidule2.query2.first;
      //if not datamodule2.Query2.Eof then 这句是多余的,问题也就出在这里
      while not datamodule2.Query2.Eof do
      begin
       MenuItem         :=TMenuItem.create(self);
       try
         MenuItem.Name    :='m'+trim(datamodule2.Query2.fieldbyname('xuhao').asstring);
         MenuItem.Caption :=    trim(datamodule2.Query2.fieldbyname('name').asstring);
         MainMenu1.Items[2].add(MenuItem) ;
         datamodule2.Query2.next;
         MenuItem.OnClick:=Pro_Click;
       finally
         menuitem.free;
       end;
       end;
      end;
      procedure tform1.Pro_Click;
      begin
        ShowMessage('鼠标点击事件');
      end;
      

  12.   

    成功了,谢谢所有帮我的的人
    procedure TForm1.N4Click(Sender: TObject);
      var I:integer;
    begin
      datamodule2.Query2.Close;
      datamodule2.Query2.SQL.clear;
      datamodule2.Query2.sql.add(' select * from 传输系统 order by xuhao ');
      datamodule2.Query2.Open;
      For i:=0 to Length(aItems)-1 do
        if Assigned(AItems[i]) then AItems[i].Free;
      SetLength(aItems,datamodule2.Query2.recordCount);
      for i:=0 to datamodule2.Query2.recordCount-1 do
      begin
     aItems[i]:=TMenuItem.Create(Application);
         aItems[i].Name :='m'+trim(DATAmodule2.Query2.Fieldbyname('xuhao').asstring);
         aItems[i].Caption :=    trim(DATAmodule2.Query2.Fieldbyname('name').asstring);
         aItems[i].OnClick:=Pro_Click;
         datamodule2.Query2.next;
     end;
    MainMenu1.Items[2].Add(aItems);
    end;
    procedure tform1.Pro_Click;
      begin
        ShowMessage('鼠标点击事件');
        end;
    end.