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),这句话的意思算是接管事件吗?
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),这句话的意思算是接管事件吗?
这句这样写不对,改成这样:
NewItem.OnClick := MenuOnClick; 比如窗体上有个DBGrid1这样调:
InitMenuItem(DBGrid1);
另一个函数
DBGridDisplayInf(DBGrid1);
begin
TMenuItem(Sender).Checked := not TMenuItem(Sender).Checked;
DBGridDisplayInf(ADBGrid);
end;这里面 DBGridDisplayInf(ADBGrid) 的参数 ADBGrid ,从哪里来啊
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.
1、 NewItem.OnClick := MenuOnClick(Sender);
改成 NewItem.OnClick := MenuOnClick;
2、PopupMenu1.Items.Add(NewItem);这句话报错,还未解决
frmCommon.InitMenuItem(DBGrid1);
可以了,谢谢各位了