---- 用delphi开发数据库软件,经常使用DBGrid控件实现数据的输入与显示,像大家熟悉的Excel97、VFP中的BROWS就是采用了这种数据网格的形式。很多情况下,在进行数据输入时,有些字段只允许某几个固定的条目,像学生档案管理中学生的所在系别,只有学校固定好的几个系,还有像学生的政治面貌等等,可否从一个下拉列表中进行选择,从而方便输入和避免输入错误呢?,Delphi的数据网格控件DBGrid支持的下拉列表编程可以实现此功能(见http://www.computerworld.com.cn/99/tips/9903/030302_05.asp),但有明显的缺陷,就是使用不方便,为显示某字段的下拉框需按两次回车键,然后用鼠标点击下拉列表的下拉按钮,下拉列表才能出现,输入数据时总是按动鼠标非常别扭。下面介绍的下拉列表的实现方法可以在不修改DBGrid控件或利用钩子函数的基础上实现下拉列表方便的开合,操作时不再需要按动鼠标,最大限度的方便了数据输入人员。
---- 基本思路
---- 利用一个浮动式菜单PopupMenu,浮动式菜单的各菜单条是用于选择的相应条目。以此来实现下拉列表的功能。为了实现浮动式菜单与相应字段的结合,还需要做以下的工作:
---- (1)在DBGrid控件属性中有PoppupMenu一栏,添入浮动式菜单名,此时,程序运行时,按鼠标右键即可打开PoppupMenu进行选择。
---- (2)为使键盘控制PoppupMenu的开合还需将装载DBGrid的窗体的Keypreview属性设为true,在DBGrid的KeyDown事件中写入一事件,来控制PoppupMenu的开合的位置与显示条件。
---- 下面以一个学生信息库中的学生的系别为例(字符串类型)为例,给出一个具体的例子:
unitUnit1; interface uses Windows,Messages,SysUtils,Classes, Graphics,Controls,Forms,Dialogs, Db,Menus,DBTables,Grids,DBGrids; type TForm1=class(TForm) DBGrid1:TDBGrid; DataSource1:TDataSource; Table1:TTable; PopupMenu1:TPopupMenu; N1:TMenuItem; N2:TMenuItem; N3:TMenuItem; Table1XH:TStringField; Table1XM:TStringField; Table1XB:TStringField; N4:TMenuItem; procedureDBGrid1KeyDown (Sender:TObject;varKey:Word; Shift:TShiftState); procedureN1Click(Sender:TObject); procedureN2Click(Sender:TObject); procedureN3Click(Sender:TObject); procedureN4Click(Sender:TObject); private {Privatedeclarations} public {Publicdeclarations} end; var Form1:TForm1; implementation {$R*.DFM} procedureTForm1.DBGrid1KeyDown (Sender:TObject;varKey:Word; Shift:TShiftState); var LastEditCol:integer; begin LastEditCol:=DbGrid1.SelectedIndex; ifLastEditCol< > 2thenexit;//让浮动式菜单只对第二列起作用 if(Key=VK_RETURN)//VK_***是您的热键的虚键值 then PopupMenu1.Popup(336,222);//336,222浮动式菜单显示的位置 end; procedureTForm1.N1Click(Sender:TObject); begin table1.Edit; table1.FieldValues[‘XB‘]:=‘物理系‘; table1.post; end; procedureTForm1.N2Click(Sender:TObject); begin table1.Edit; table1.FieldValues[‘XB‘]:=‘数学系‘; table1.post; end; procedureTForm1.N3Click(Sender:TObject); begin table1.Edit; table1.FieldValues[‘XB‘]:=‘计算机系‘; table1.post; end; procedureTForm1.N4Click(Sender:TObject); begin table1.Edit; table1.FieldValues[‘XB‘]:=‘中文系‘; table1.post; end; end.
|