Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在DevExpress';Quantum Grids,如何将带有复选框的单元格的单击区域限制为实际的复选框,而不是整个单元格_Delphi_Devexpress - Fatal编程技术网

Delphi 在DevExpress';Quantum Grids,如何将带有复选框的单元格的单击区域限制为实际的复选框,而不是整个单元格

Delphi 在DevExpress';Quantum Grids,如何将带有复选框的单元格的单击区域限制为实际的复选框,而不是整个单元格,delphi,devexpress,Delphi,Devexpress,我使用Delphi(2010)和DevXPress量子网格(6.52节) 当我有一个带有复选框编辑器的TcxGridColumn时,当用户单击单元格中的任意位置时,复选框将切换。我想限制这一点,以便用户必须单击实际复选框 有没有一个简单的方法可以做到这一点?我们的应用程序中有大量的网格,很多都带有复选框编辑器,所以我希望能有一个“神奇”的小技巧来帮我做到这一点。我不想为我们的应用程序中的每个网格编写自定义代码:-/如果您(或您的客户)希望在单击单元格时复选框不会立即更改,那么如果您(或您的客户)

我使用Delphi(2010)和DevXPress量子网格(6.52节)

当我有一个带有复选框编辑器的TcxGridColumn时,当用户单击单元格中的任意位置时,复选框将切换。我想限制这一点,以便用户必须单击实际复选框


有没有一个简单的方法可以做到这一点?我们的应用程序中有大量的网格,很多都带有复选框编辑器,所以我希望能有一个“神奇”的小技巧来帮我做到这一点。我不想为我们的应用程序中的每个网格编写自定义代码:-/

如果您(或您的客户)希望在单击单元格时复选框不会立即更改,那么如果您(或您的客户)将
ImmediatePost
属性设置为
false
,则会有所帮助如果您希望在单元格中单击时复选框不会立即更改,那么如果您将
ImmediatePost
属性设置为
false
,可能不是您想要的确切答案,但可能满足了客户的要求,则复选框可能会有所帮助

对于cxGrid中的每个单元格,可以打开或关闭ImmediateEditor属性。此属性确定单击相应单元格后是否立即激活特定列编辑器

从cxGrid版本6的帮助文件中:

属性直接编辑器:布尔值

描述


使用ImmediateEditor属性确定用户单击相应单元格时是否激活特定列编辑器。如果此属性值为False,则当焦点位于特定单元格内时,按Enter键可激活网格单元格编辑器。

可能不是您要寻找的确切答案,但它可能满足了客户的要求

对于cxGrid中的每个单元格,可以打开或关闭ImmediateEditor属性。此属性确定单击相应单元格后是否立即激活特定列编辑器

从cxGrid版本6的帮助文件中:

属性直接编辑器:布尔值

描述


使用ImmediateEditor属性确定用户单击相应单元格时是否激活特定列编辑器。如果此属性值为False,则当焦点位于特定单元格内时,按Enter键可激活网格单元格编辑器。

我向DevExpress发送了与支持请求相同的问题,我得到了以下答案:

“你好,斯文

感谢您的消息。您可以使用GridView的OnMouseDown事件处理程序并在那里检查命中信息来获得所需的结果。 附件是一个演示如何执行此任务的示例。请尝试此解决方案,并告诉我们您的结果。”

测试项目有一个带有复选框列的简单网格。GridView的OnMouseUp事件具有以下代码:

procedure TForm1.cxGrid1TableView1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  AHitTest: TcxCustomGridHitTest;
  ACellViewInfo: TcxGridDataCellViewInfo;
  AEditViewInfo: TcxCustomCheckBoxViewInfo;
  ARect: Trect;
  AValue: Variant;
begin
   AHitTest := TcxGridSite(Sender).GridView.GetHitTest(X, Y);
   if AHitTest is TcxGridRecordCellHitTest then
   begin
     ACellViewInfo := TcxGridRecordCellHitTest(AHitTest).ViewInfo as TcxGridDataCellViewInfo;
     if ACellViewInfo.EditViewInfo is TcxCustomCheckBoxViewInfo then
     begin
       AEditViewInfo := TcxCustomCheckBoxViewInfo(ACellViewInfo.EditViewInfo);
       ARect := AEditViewInfo.CheckBoxRect;
       if PtInRect(ARect, Point(X, Y)) then
       begin
         AValue := ACellViewInfo.GridRecord.Values[ACellViewInfo.Item.Index];
         TcxGridTableView(TcxGridSite(Sender).GridView).DataController.SetEditValue(
           ACellViewInfo.Item.Index, AValue = false, evsValue);
       end;
     end;
   end;
end;

不幸的是,由于MouseUp事件在网格上,而不是列上,我无法为复选框列创建存储库项,但至少现在我知道了一种方法

我向DevExpress发送了与支持请求相同的问题,我得到了以下回答:

“你好,斯文

感谢您的消息。您可以使用GridView的OnMouseDown事件处理程序并在那里检查命中信息来获得所需的结果。 附件是一个演示如何执行此任务的示例。请尝试此解决方案,并告诉我们您的结果。”

测试项目有一个带有复选框列的简单网格。GridView的OnMouseUp事件具有以下代码:

procedure TForm1.cxGrid1TableView1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  AHitTest: TcxCustomGridHitTest;
  ACellViewInfo: TcxGridDataCellViewInfo;
  AEditViewInfo: TcxCustomCheckBoxViewInfo;
  ARect: Trect;
  AValue: Variant;
begin
   AHitTest := TcxGridSite(Sender).GridView.GetHitTest(X, Y);
   if AHitTest is TcxGridRecordCellHitTest then
   begin
     ACellViewInfo := TcxGridRecordCellHitTest(AHitTest).ViewInfo as TcxGridDataCellViewInfo;
     if ACellViewInfo.EditViewInfo is TcxCustomCheckBoxViewInfo then
     begin
       AEditViewInfo := TcxCustomCheckBoxViewInfo(ACellViewInfo.EditViewInfo);
       ARect := AEditViewInfo.CheckBoxRect;
       if PtInRect(ARect, Point(X, Y)) then
       begin
         AValue := ACellViewInfo.GridRecord.Values[ACellViewInfo.Item.Index];
         TcxGridTableView(TcxGridSite(Sender).GridView).DataController.SetEditValue(
           ACellViewInfo.Item.Index, AValue = false, evsValue);
       end;
     end;
   end;
end;

不幸的是,由于MouseUp事件在网格上,而不是列上,我无法为复选框列创建存储库项,但至少现在我知道了一种方法

为什么,你为什么要这么做?为什么要使应用程序更难使用?许多用户远不像大多数程序员那样熟练地使用鼠标。你认为微软为什么让所有窗口的标题栏和“x”关闭按钮都比Win2K之前大?我想这样做是因为这是客户的直接要求。他们发现很容易像现在这样无意中切换复选框。有时他们点击一个单元格只是为了聚焦一个特定的行,甚至没有注意到他们已经改变了它!为什么复选框在网格中的工作方式与在表单中的工作方式不同?总之,我完全不同意你的观点:-)为什么,哦,你为什么要这么做?为什么要使应用程序更难使用?许多用户远不像大多数程序员那样熟练地使用鼠标。你认为微软为什么让所有窗口的标题栏和“x”关闭按钮都比Win2K之前大?我想这样做是因为这是客户的直接要求。他们发现很容易像现在这样无意中切换复选框。有时他们点击一个单元格只是为了聚焦一个特定的行,甚至没有注意到他们已经改变了它!为什么复选框在网格中的工作方式与在表单中的工作方式不同?总之,我完全不同意你的观点:-)不,这没什么区别。该复选框仍然会切换,并且一旦用户离开单元格,值就会被发布。不,这没有任何区别。复选框仍然会切换,并且一旦用户离开单元格,值就会被发布。这确实会使无意中切换复选框变得更加困难,并且它将解决人们单击一行来设置焦点的问题,但它将改变整个网格的行为,而不仅仅是复选框。但这将保持处理的一致性!您试图引入一个行为不同的特殊单元格/编辑器。也许是时候进行客户培训了!?;-)我很愿意,但我们的客户很少,我们不能冒险疏远他们:-)这确实会让无意中切换复选框变得更困难,而且会解决问题