我如何定义当用户按下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;

解决方案 »

  1.   

    (*//
    声明:
      本人保证所提供的方法是所知的最好方法
      解答问题纯属公益性质
      所以请不要向我追问
      如果有时间自会关注后续问题
    分析:
      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
      

  2.   

    procedure TForm1.DBGrid1EditButtonClick(Sender: TObject);
    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;
      

  3.   

    看了:胖水   的回复,甚看一本书呀(实在的)。这种解决方式,对我们初学者来说真的帮助好大!第一个问题已经解决了。
    第二个问题:将省略号按钮图标,改成下列图标。我的做法是在指定列上绑架一个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;