cxGrid控件怎么修改双击事件?

lee2068 2019-02-16 05:30:24
cxGridTableView有OnCellDblClick事件和OnDblClick事件,但是我想在触发的时候默认执行某些操作要怎么办?查了好久似乎要用override,但是具体应该怎么做?
...全文
807 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
lee2068 2019-02-20
  • 打赏
  • 举报
回复
引用 23 楼 BlueStorm 的回复:
在调试模式下,自己设置所需的断点,按F8一步步调试,看看问题出在哪里。

虽然还是没弄好,不过分还是给你吧
lee2068 2019-02-18
  • 打赏
  • 举报
回复
引用 14 楼 BlueStorm 的回复:
{执行双击事件的代码} 改为 {执行双击事件前的代码}

具体怎么引用?我uses里调用了这个unit,结果原本的窗口打不开了
doloopcn 2019-02-18
  • 打赏
  • 举报
回复
引用 5 楼 lee2068 的回复:
[quote=引用 4 楼 doloopcn 的回复:]
清除一个控件上的事件:
aControl.OnDblClick:=nil;

自定义一个控件上的事件:
aControl.OnDblClick:=自定义函数

procedure 自定义函数(sender : TOBject);
begin
//你的代码
end;

可不可以发下具体的代码?aControl好像没用过,不太懂。[/quote]

aControl就是你的cxGrid控件啊
就是在初始化的时候把cxGrid中的OnDblClick事件先保存起来(或置空),然后执行自己的代码,如在FormShow中对cxGrid初始化:
type
//用TProc保存之前的OnDblClick事件
TProc=procedure (Sender: TObject) of object;
TForm1 = class(TForm)
cxGrid: TDBGrid;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
myDblProc:TProc;
procedure MycxGridOnDblClick(Sender: TObject);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
//保存之前的cxGrid.OnDblClick事件
myDblProc:=cxGrid.OnDblClick;
end;

procedure TForm1.MycxGridOnDblClick(Sender: TObject);
begin
if Assigned(myDblProc) then
begin
myDblProc(cxGrid);//你如果不需要执行之前的代码,也可以把If的内容去掉
end;
//在下面写入你的代码
end;
BlueStorm 2019-02-18
  • 打赏
  • 举报
回复
{执行双击事件的代码} 改为 {执行双击事件前的代码}
BlueStorm 2019-02-18
  • 打赏
  • 举报
回复

 //未详细测试过代码,仅供参考
unit MycxGrid;

interface

uses
  Winapi.Windows, Winapi.Messages, System.Classes,  Vcl.Controls,
  cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxStyles,
  cxCustomData, cxFilter, cxData,  cxDataStorage, cxEdit, cxNavigator,
  cxDataControllerConditionalFormattingRulesManagerDialog, Data.DB, cxDBData,
  cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGridLevel,
  cxClasses, cxGridCustomView, cxGrid;

const
  WM_AFTERCREATE = WM_USER + 10001;

type
  TcxGrid = class(cxGrid.TcxGrid)
  private
    NewCellDblClick: TcxGridCellClickEvent;
    procedure DefaultCellDblClick(Sender: TcxCustomGridTableView;
      ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
      AShift: TShiftState; var AHandled: Boolean);
    procedure WmAfterCreate(var Msg: TMessage); Message WM_AFTERCREATE;
  public
    constructor Create(AOwner: TComponent); override;
  end;

implementation

constructor TcxGrid.Create(AOwner: TComponent);
begin
  inherited;
  PostMessage(Handle, WM_AFTERCREATE, 0, 0);
end;

procedure TcxGrid.WmAfterCreate(var Msg: TMessage);
var
  I: Integer;
  GridDBTableView: TcxGridDBTableView;
begin
  for I := 0 to ComponentCount-1 do
  begin
    if Components[I] is TcxGridDBTableView then
    begin
      GridDBTableView := TcxGridDBTableView(Components[I]);
      NewCellDblClick := GridDBTableView.OnCellDblClick;
      GridDBTableView.OnCellDblClick := DefaultCellDblClick;
    end;
  end;
end;

procedure TcxGrid.DefaultCellDblClick(Sender: TcxCustomGridTableView;
      ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
      AShift: TShiftState; var AHandled: Boolean);
begin
  begin
    {执行双击事件的代码}
  end;
  if Assigned(NewCellDblClick) then
    NewCellDblClick(Sender, ACellViewInfo, AButton, AShift, AHandled);
end;

end.
lee2068 2019-02-18
  • 打赏
  • 举报
回复
引用 11 楼 BlueStorm 的回复:
如果你有很多View, 就需要把代码中的<Break;>那一行去掉。

还显示找到不对应的.dfm文件,但我创建的是Unit,没有创建VCL Form。
BlueStorm 2019-02-18
  • 打赏
  • 举报
回复
如果你有很多View, 就需要把代码中的<Break;>那一行去掉。
BlueStorm 2019-02-18
  • 打赏
  • 举报
回复
不需要,这只不过时在现有类的基础上定义的一个新类(class)而已,不是一个新控件。
lee2068 2019-02-18
  • 打赏
  • 举报
回复
引用 7 楼 lyhoo163 的回复:
可以在OnCellDblClick事件中,直接写上执行的代码!

主要就是不想在每个TableView的OnDblClick的事件里写
lee2068 2019-02-18
  • 打赏
  • 举报
回复
引用 6 楼 BlueStorm 的回复:

//未详细测试过代码,仅供参考
unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxStyles,
cxCustomData, cxFilter, cxData, cxDataStorage, cxEdit, cxNavigator,
cxDataControllerConditionalFormattingRulesManagerDialog, Data.DB, cxDBData,
cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGridLevel,
cxClasses, cxGridCustomView, cxGrid, Vcl.StdCtrls;
const
WM_AFTERCREATE = WM_USER + 10001;

type
TcxGrid = class(cxGrid.TcxGrid)
private
NewCellDblClick: TcxGridCellClickEvent;
procedure DefaultCellDblClick(Sender: TcxCustomGridTableView;
ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
AShift: TShiftState; var AHandled: Boolean);
procedure WmAfterCreate(var Msg: TMessage); Message WM_AFTERCREATE;
public
constructor Create(AOwner: TComponent); override;
end;

TForm1 = class(TForm)
cxGrid1DBTableView1: TcxGridDBTableView;
cxGrid1Level1: TcxGridLevel;
cxGrid1: TcxGrid;
procedure cxGrid1DBTableView1CellDblClick(Sender: TcxCustomGridTableView;
ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
AShift: TShiftState; var AHandled: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

constructor TcxGrid.Create(AOwner: TComponent);
begin
inherited;
PostMessage(Handle, WM_AFTERCREATE, 0, 0);
end;

procedure TcxGrid.WmAfterCreate(var Msg: TMessage);
var
I: Integer;
GridDBTableView: TcxGridDBTableView;
begin
for I := 0 to ComponentCount-1 do
begin
if Components[I] is TcxGridDBTableView then
begin
GridDBTableView := TcxGridDBTableView(Components[I]);
NewCellDblClick := GridDBTableView.OnCellDblClick;
GridDBTableView.OnCellDblClick := DefaultCellDblClick;
break;
end;
end;
end;

procedure TcxGrid.DefaultCellDblClick(Sender: TcxCustomGridTableView;
ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
AShift: TShiftState; var AHandled: Boolean);
begin
begin
{在执行双击事件前的代码}
end;
if Assigned(NewCellDblClick) then
NewCellDblClick(Sender, ACellViewInfo, AButton, AShift, AHandled);
end;

procedure TForm1.cxGrid1DBTableView1CellDblClick(Sender: TcxCustomGridTableView;
ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
AShift: TShiftState; var AHandled: Boolean);
begin
{在执行双击事件后的代码}
end;

end.

这算是从TcxGrid继承出来的一个新控件,需要安装吗?
BlueStorm 2019-02-18
  • 打赏
  • 举报
回复
在调试模式下,自己设置所需的断点,按F8一步步调试,看看问题出在哪里。
lee2068 2019-02-18
  • 打赏
  • 举报
回复
引用 21 楼 BlueStorm 的回复:
要保证在不引用MycxGrid的情况下,你的程序是能正常工作的。
等到你原有的程序能正常工作的情况,再在uses列表的最后之处加入MycxGrid

原程序是没问题的,uses列表中引用了MyCXgrid之后也可以正常工作,但是双击表格控件没有执行我写进去的showmessage('A')代码跳出提示
BlueStorm 2019-02-18
  • 打赏
  • 举报
回复
要保证在不引用MycxGrid的情况下,你的程序是能正常工作的。 等到你原有的程序能正常工作的情况,再在uses列表的最后之处加入MycxGrid
lee2068 2019-02-18
  • 打赏
  • 举报
回复
不行,会提示错误,引用之后新创建的表格控件也没生效。
lee2068 2019-02-18
  • 打赏
  • 举报
回复
引用 17 楼 BlueStorm 的回复:
看来你是一个新的很厉害的新手

unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxStyles,
cxCustomData, cxFilter, cxData, cxDataStorage, cxEdit, cxNavigator,
cxDataControllerConditionalFormattingRulesManagerDialog, Data.DB, cxDBData,
cxGridLevel, cxClasses, cxGridCustomView, cxGridCustomTableView,
cxGridTableView, cxGridDBTableView, cxGrid, MycxGrid;

type
TForm1 = class(TForm)
cxGrid1DBTableView1: TcxGridDBTableView;
cxGrid1Level1: TcxGridLevel;
cxGrid1: TcxGrid;
private
{ Private declarations }
public
{ Public declarations }
end;

BlueStorm 2019-02-18
  • 打赏
  • 举报
回复
MycxGrid必须是uses列表里面最后一个
BlueStorm 2019-02-18
  • 打赏
  • 举报
回复
看来你是一个新的很厉害的新手

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxStyles,
  cxCustomData, cxFilter, cxData, cxDataStorage, cxEdit, cxNavigator,
  cxDataControllerConditionalFormattingRulesManagerDialog, Data.DB, cxDBData,
  cxGridLevel, cxClasses, cxGridCustomView, cxGridCustomTableView,
  cxGridTableView, cxGridDBTableView, cxGrid, MycxGrid;

type
  TForm1 = class(TForm)
    cxGrid1DBTableView1: TcxGridDBTableView;
    cxGrid1Level1: TcxGridLevel;
    cxGrid1: TcxGrid;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
lee2068 2019-02-17
  • 打赏
  • 举报
回复
引用 2 楼 lee2068 的回复:
[quote=引用 1 楼 qtc26 的回复:]
改写message,重新安装,或继承改写message。
直接写个函数执行某些操作,事件引用不就完事?

具体要怎么做?message这方面每台接触过。[/quote]
可能没太说明白,默认执行的操作不是在双击事件内的,而是在触发了双击事件但在执行双击事件内代码之前。例如继承TcxButton控件,override它的click事件,跳出提示A,然后再inherit,这样继承出来的TcxButton点击的时候即使控件的click函数没有代码,也会跳出提示A。
lee2068 2019-02-17
  • 打赏
  • 举报
回复
引用 1 楼 qtc26 的回复:
改写message,重新安装,或继承改写message。
直接写个函数执行某些操作,事件引用不就完事?

具体要怎么做?message这方面每台接触过。
lyhoo163 2019-02-17
  • 打赏
  • 举报
回复
可以在OnCellDblClick事件中,直接写上执行的代码!
加载更多回复(4)
一些Delphi7的例子,包含下面内容:(高手就别看了,新手可看看,也是好多年没做了,又要做个小东西,练手做的例子) 有的是本人练习做的,少数是下载别人的或修改过的,也有1个似乎是明日科技的配套代码-此处没有删除,懒得删除直接打包了。 用这些分,只是用来备用下载其他东西而用,你觉得不值得,你留言分退给你(我来也不是常来这里),我认为是值得的。 还有一些其他的清单没罗列出来 如数据库表结构找不到,根据名字找这个文件名:EquipmentSQL_20170528_ok, 如果没就是没有了,因为一个连接服务器,一个是本机上的练习数据库,如没有请见谅 大致类型: cxGrid的几个例子、ini连接数据库、明日科技配套代码(文件上传下载)、 时间差相减(可参考Delphi函数里面的综合运用)、基本件应用 cxGrid查找功能 cxGrid的列属性 cxGrid应用交流实例一_ok eg_Add_cbbValue_IntoMemo_test_20170401 eg_Check_Checkbox_Change eg_counter eg_cxGrid_Right_2 eg_cxGrid_Right_更细权限的bit值到表中 eg_cxGrid_SumRecord_1 eg_DCom_connection_20170606 eg_ImportToSQL eg_LoadRecord_Improve_Original eg_LoadRZCheckTree_1 eg_LoadRZCheckTree_连带设置_2 eg_LoadRZCheckTree_双击用户设置_del eg_LoadTree_1 eg_ReadIni_独立数据模块 eg_test_ImportExcelToSQL_ComOBJ_2 eg_update_bit_20170528 eg_报废时间月日格式只有1位时问题_20170609 eg_测试某列的条件改变另外列的Edit属性(cxGrid的例子) eg_对BoolToStr后的值进行再次转换_最后循环取bit值 eg_时间差计算_2 FileMS(明日科技的配套代码,关于文件上传下载的那个) EquipmentSQL_20170528_ok(如没数据库的,在这里查表结构,有的表结构不在这里,只能参考一下了)

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧