unit common;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,
  DBGrids, Menus;type
  TfrmCommon = class(TForm)
    PopupMenu1: TPopupMenu;
  private
    { Private declarations }
  public
    { Public declarations }
    procedure InitMenuItem(ADBGrid : TDBGrid);
    procedure MenuOnClick(Sender: TObject; ADBGrid : TDBGrid);    
    procedure DBGridDisplayInf(ADBGrid : TDBGrid);
  end;var
  frmCommon: TfrmCommon;implementation{$R *.dfm}//初始化 DBGrid 列为 PopupMenu 里面的项
procedure TfrmCommon.InitMenuItem(ADBGrid : TDBGrid);
var
  NewItem: TMenuItem;
  I : Integer;
begin
  for i:=0 to ADBGrid.Columns.Count-1 do
  begin
    NewItem := TMenuItem.Create(nil);
    NewItem.Caption := ADBGrid.Columns.Items[I].Title.Caption;
    NewItem.OnClick := MenuOnClick(Sender, ADBGrid);
    NewItem.Checked := True;
    PopupMenu1.Items.Add(NewItem);
  end;
end;
procedure TfrmCommon.MenuOnClick(Sender: TObject; ADBGrid : TDBGrid);
begin
  TMenuItem(Sender).Checked := not TMenuItem(Sender).Checked;
  DBGridDisplayInf(ADBGrid);
end;
procedure TfrmCommon.DBGridDisplayInf(ADBGrid : TDBGrid);
var
  I : Integer;
begin
  for I :=0 to PopupMenu1.Items.Count-1 do
  begin
    if not PopupMenu1.Items[i].Checked then
      ADBGrid.Columns[I].Visible := False
    else
      ADBGrid.Columns[I].Visible := True;
  end;
end;end.1、公共函数大致意思为,在运行时,控制 DBGrid 列是否显示
2、问题在于 NewItem.OnClick := MenuOnClick(Sender, ADBGrid);
3、由于写成了公共的,所以要传 DBGrid,不知道怎么写?
4、NewItem.OnClick := MenuOnClick(Sender, ADBGrid),这句话的意思算是接管事件吗?

解决方案 »

  1.   

    4、接管事件:NewItem.OnClick := MenuOnClick;procedure TfrmCommon.MenuOnClick(Sender: TObject; ADBGrid : TDBGrid);与标准的click事件类型不符合吧?
      

  2.   

    NewItem.OnClick := MenuOnClick(Sender, ADBGrid); 
    这句这样写不对,改成这样:
    NewItem.OnClick := MenuOnClick; 比如窗体上有个DBGrid1这样调:
    InitMenuItem(DBGrid1);
    另一个函数
    DBGridDisplayInf(DBGrid1);
      

  3.   

    注意 你定义MenuOnClick过程要和NewItem.OnClick 事件参数的要一致
      

  4.   

    NewItem.OnClick := MenuOnClick;这句话没问题,关键是 procedure TfrmCommon.MenuOnClick(Sender: TObject); 
    begin 
      TMenuItem(Sender).Checked := not TMenuItem(Sender).Checked; 
      DBGridDisplayInf(ADBGrid); 
    end;这里面  DBGridDisplayInf(ADBGrid) 的参数 ADBGrid ,从哪里来啊
      

  5.   

    声明要一致,试试下面的方法!unit common;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,
      DBGrids, Menus;type
      TfrmCommon = class(TForm)
        PopupMenu1: TPopupMenu;
      private
        { Private declarations }
      public
        { Public declarations }
        procedure InitMenuItem(ADBGrid : TDBGrid);
        procedure MenuOnClick(Sender: TObject);   
        procedure DBGridDisplayInf(ADBGrid : TDBGrid);
      end;var
      frmCommon: TfrmCommon;implementation{$R *.dfm}//初始化 DBGrid 列为 PopupMenu 里面的项
    procedure TfrmCommon.InitMenuItem(ADBGrid : TDBGrid);
    var
      NewItem: TMenuItem;
      I : Integer;
    begin
      for i:=0 to ADBGrid.Columns.Count-1 do
      begin
        NewItem := TMenuItem.Create(nil);
        NewItem.Caption := ADBGrid.Columns.Items[I].Title.Caption;
        NewItem.OnClick := MenuOnClick(Sender);
        NewItem.Checked := True;
        PopupMenu1.Items.Add(NewItem);
      end;
    end;
    procedure TfrmCommon.MenuOnClick(Sender: TObject);
    begin
      if Sender is TmenuItem then
      begin
        TMenuItem(Sender).Checked := not TMenuItem(Sender).Checked;
        if PopupMenu1.PopupComponent is TDBGrid then
           DBGridDisplayInf(TDBGrid(PopupMenu1.PopupComponent));
      end;
    end;
    procedure TfrmCommon.DBGridDisplayInf(ADBGrid : TDBGrid);
    var
      I : Integer;
    begin
      for I :=0 to PopupMenu1.Items.Count-1 do
      begin
        if not PopupMenu1.Items[i].Checked then
          ADBGrid.Columns[I].Visible := False
        else
          ADBGrid.Columns[I].Visible := True;
      end;
    end;end.
      

  6.   

    SmallHand(火龙)    PopupMenu1.Items.Add(NewItem);这句话报错了
      

  7.   

    按照 SmallHand(火龍) 所写的,有2处错误:
    1、 NewItem.OnClick := MenuOnClick(Sender);
        改成 NewItem.OnClick := MenuOnClick;
    2、PopupMenu1.Items.Add(NewItem);这句话报错,还未解决
      

  8.   

    已经搞定,在 TForm1.FormShow 里面写
    frmCommon.InitMenuItem(DBGrid1);
    可以了,谢谢各位了