我如何定义当用户按下F1键时,自动触发OnEditButtonClick事件?
procedure TForm1.DBGrid1EditButtonClick(Sender: TObject);
begin
TfrmLookUp.Create(nil).ShowModal;
end;procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
If dbgrid1.SelectedField.FieldName='bh' then
begin
if key=char(Vk_F1) then
DbGrid1EditButtonClick(nil) //好象起不到作用呀另外想问一下,如何将这个省略号改成一个下拉箭头?
end;
end;
procedure TForm1.DBGrid1EditButtonClick(Sender: TObject);
begin
TfrmLookUp.Create(nil).ShowModal;
end;procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
If dbgrid1.SelectedField.FieldName='bh' then
begin
if key=char(Vk_F1) then
DbGrid1EditButtonClick(nil) //好象起不到作用呀另外想问一下,如何将这个省略号改成一个下拉箭头?
end;
end;
声明:
本人保证所提供的方法是所知的最好方法
解答问题纯属公益性质
所以请不要向我追问
如果有时间自会关注后续问题
分析:
TWinControl.OnKeyPress事件是当输入可接受字符时触发
如:F1、F2...Enter、Up、Down...都不是可接受字符
所以在DBGrid1KeyPress事件中是无法响应F1的
TWinControl.OnKeyDown、TWinControl.OnKeyUp是响应任意键按下的情况(除非被截获)
问题1:如何响应功能按键?
问题2:如何改变DBGrid中编辑筐中的按钮图标? //必要性不大,本人不做实现
设计:Zswang
日期:2002-09-29
方案1-1:使用TWinControl.OnKeyDown //建议
方案1-2:使用TWinControl.OnKeyUp //代码同上
方案2:下载使用第三方控件
附言:动态创建的窗体要释放掉,否则很消耗内存
//*)///////Begin Demo
procedure TForm1.DBGrid1EditButtonClick(Sender: TObject);
begin
if UpperCase(TDBGrid(Sender).SelectedField.FieldName) <> 'BH' then Exit;
//避免大小写冲突
with TfrmLookUp.Create(nil) do try
ShowModal;
finally
Free; //<--
end;
end;procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if not Assigned(TDBGrid(Sender).SelectedField) then Exit; //安全检查
case Key of
VK_F1: DBGrid1EditButtonClick(Sender);
end;
end;
///////End Demo
begin
if not Assigned(TDBGrid(Sender).SelectedField) then Exit; //安全检查 //换一下位置
if UpperCase(TDBGrid(Sender).SelectedField.FieldName) <> 'BH' then Exit;
//避免大小写冲突
with TfrmLookUp.Create(nil) do try
ShowModal;
finally
Free; //<--
end;
end;procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_F1: DBGrid1EditButtonClick(Sender);
end;
end;
第二个问题:将省略号按钮图标,改成下列图标。我的做法是在指定列上绑架一个COMBOBOX控件。但总是做不好,在外观上无法消除combobox的边框,不能达到PackList时的那种完全融合的效果。代码如下:供各位对此进行塑造、雕刻!
procedure TfrmScjl.dbScjlDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
If (gdFocused in State) then
begin
If UpperCase(dbScjl.SelectedField.FieldName='CP_NO') then
begin
Dbscjl.Canvas.FillRect(Rect);
cbSearch.Left := Rect.Left + dbScjl.Left+2 ;
cbSearch.Top := Rect.Top +dbScjl.Top+2;
cbSearch.Width := Rect.Right - Rect.Left;
cbSearch.Height := Rect.Bottom - Rect.Top;
cbSearch.Clear;
cbSearch.Visible := True;
cbSearch.SetFocus;
end;
end;
end; procedure TfrmScjl.dbScjlColExit(Sender: TObject);
begin
If UpperCase(dbScjl.SelectedField.FieldName='CP_NO') then
cbSearch.Visible := False;
end;