M
muree
Unregistered / Unconfirmed
GUEST, unregistred user!
如果想通过 PopupMenu 的菜单控制 DBGrid 中各列的显示/隐藏,如 PopupMenu 的三个菜单:编号、姓名、工资(Caption属性)的 Name(控件名称) 分别为 N1、N2、N3,控制 DBGrid 中的对应列。我在 N1、N2、N3 共用的 OnClick 事件中写了一部分程序(想了点小方法,先在界面设计阶段将 N1、N2、N3 的 Tag 分别设置为 100、101、102),如下:
procedure TForm1.N1Click(Sender: TObject);
...
(Sender as TMenuItem).Checked := not (Sender as TMenuItem).Checked;
//if Sender = N1 then DBGrid1.Columns[0].Visible := N1.Checked;
//if Sender = N2 then DBGrid1.Columns[1].Visible := N2.Checked;
//if Sender = N3 then DBGrid1.Columns[2].Visible := N3.Checked;
//以下是简化的小方法
DBGrid1.Columns[(Sender as TMenuItem).Tag - 100].Visible := (Sender as TMenuItem).Checked;
...
这在 DBGrid 的各列没有拖动(变换位置)时可行得通,但在拖动后就对应不起来了。主要是 DBGrid 的各列不是一个单独的控件,没有象 N1、N2、N3 一样有固定的控件名称来对应控制 Visible 属性。如果再增加点难度,有另两个按钮 Button1、Button2 的显示/隐藏对应与 DBGrid 中姓名、工资列的显示/隐藏完全一致,该如何操作?
好象有一种方法,在 DBGrid 的 OnColumnMoved 事件中,按照 DBGrid 拖动后各列的位置生成对应的菜单,如 DBGrid 的列排列为:工资、编号、姓名,PopupMenu 从上到下的排序也如此(可以在 TCheckListBox 中这样实现),但不知具体如何在 PopupMenu 中实现?是不是每次要动态创建 N1、N2、N3,又要动态释放?且如果 PopupMenu 的三个菜单:编号、姓名、工资保持不变,而要显示/隐藏已经拖动后的 DBGrid 对应列,又该怎么办?请高手多指教!!!
procedure TForm1.N1Click(Sender: TObject);
...
(Sender as TMenuItem).Checked := not (Sender as TMenuItem).Checked;
//if Sender = N1 then DBGrid1.Columns[0].Visible := N1.Checked;
//if Sender = N2 then DBGrid1.Columns[1].Visible := N2.Checked;
//if Sender = N3 then DBGrid1.Columns[2].Visible := N3.Checked;
//以下是简化的小方法
DBGrid1.Columns[(Sender as TMenuItem).Tag - 100].Visible := (Sender as TMenuItem).Checked;
...
这在 DBGrid 的各列没有拖动(变换位置)时可行得通,但在拖动后就对应不起来了。主要是 DBGrid 的各列不是一个单独的控件,没有象 N1、N2、N3 一样有固定的控件名称来对应控制 Visible 属性。如果再增加点难度,有另两个按钮 Button1、Button2 的显示/隐藏对应与 DBGrid 中姓名、工资列的显示/隐藏完全一致,该如何操作?
好象有一种方法,在 DBGrid 的 OnColumnMoved 事件中,按照 DBGrid 拖动后各列的位置生成对应的菜单,如 DBGrid 的列排列为:工资、编号、姓名,PopupMenu 从上到下的排序也如此(可以在 TCheckListBox 中这样实现),但不知具体如何在 PopupMenu 中实现?是不是每次要动态创建 N1、N2、N3,又要动态释放?且如果 PopupMenu 的三个菜单:编号、姓名、工资保持不变,而要显示/隐藏已经拖动后的 DBGrid 对应列,又该怎么办?请高手多指教!!!