cxGrid如何让单元格获得焦点并选中单元格的内容

delphi莎 2013-10-16 11:32:45
需要实现功能如下:
在单元格内输入内容,离开时若内容有误,弹出提示框,提示框关闭时,此单元格获得焦点,且内容被选中,必须改好才能离开单元格,否则报错。

请大神指点方法,谢谢!
...全文
1216 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
delphi莎 2013-10-26
  • 打赏
  • 举报
回复
引用 17 楼 gykthh 的回复:

  private
    str:string;
  publice
  end;

  if DisplayValue='AAA' then
    begin
      if str<>DisplayValue then
      begin
        ShowMessage('已存在');
        str:=DisplayValue;
      end else
       str:='';
      Abort;
    end ;
引用 17 楼 gykthh 的回复:

  private
    str:string;
  publice
  end;

  if DisplayValue='AAA' then
    begin
      if str<>DisplayValue then
      begin
        ShowMessage('已存在');
        str:=DisplayValue;
      end else
       str:='';
      Abort;
    end ;
什么意思哦,我没懂,好像报错诶。现在有两种情况,第一种是我点“退出”,应该直接退出,就不用弹框“已存在”了。第二种是我点“保存”,弹框一次“已存在”。这两种我都实现不了,应该怎么做啊?
Blessed_Chuan 2013-10-25
  • 打赏
  • 举报
回复

  private
    str:string;
  publice
  end;

  if DisplayValue='AAA' then
    begin
      if str<>DisplayValue then
      begin
        ShowMessage('已存在');
        str:=DisplayValue;
      end else
       str:='';
      Abort;
    end ;
delphi莎 2013-10-23
  • 打赏
  • 举报
回复
引用 15 楼 gykthh 的回复:
不用客气的 学习的都是要互相帮忙的
你教我的那个办法我发现一个问题,如果我填完,直接点按钮,它会执行两次,弹两次框。这个你知道怎么解决么?
Blessed_Chuan 2013-10-21
  • 打赏
  • 举报
回复
不用客气的 学习的都是要互相帮忙的
Blessed_Chuan 2013-10-18
  • 打赏
  • 举报
回复
引用 10 楼 gykthh 的回复:

procedure TForm1.cxgrdbclmnGrid1DBTableView1AddressLine2PropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if DisplayValue='AAA' then
  begin
    ShowMessage('已存在');
    Error:=True;
  end ;
end;
修改如下

if DisplayValue='AAA' then
  begin
    ShowMessage('已存在');
    Abort;
  end ;
Blessed_Chuan 2013-10-18
  • 打赏
  • 举报
回复

procedure TForm1.cxgrdbclmnGrid1DBTableView1AddressLine2PropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if DisplayValue='AAA' then
  begin
    ShowMessage('已存在');
    Error:=True;
  end ;
end;
delphi莎 2013-10-18
  • 打赏
  • 举报
回复
引用 8 楼 gykthh 的回复:
你可以试试在cdsdept的事件中添加控制呢
怎么控制啊?我现在主要就是实现不了怎么将焦点回到原来的单元格
Blessed_Chuan 2013-10-18
  • 打赏
  • 举报
回复
你可以试试在cdsdept的事件中添加控制呢
delphi莎 2013-10-18
  • 打赏
  • 举报
回复
引用 13 楼 gykthh 的回复:
你可以试试看 如果错误他会一直停留在这个单元格内
我试了,真的可以哦,谢谢谢谢,万分感谢!!
Blessed_Chuan 2013-10-18
  • 打赏
  • 举报
回复
你可以试试看 如果错误他会一直停留在这个单元格内
delphi莎 2013-10-18
  • 打赏
  • 举报
回复
引用 11 楼 gykthh 的回复:
[quote=引用 10 楼 gykthh 的回复:]

procedure TForm1.cxgrdbclmnGrid1DBTableView1AddressLine2PropertiesValidate(
  Sender: TObject; var DisplayValue: Variant; var ErrorText: TCaption;
  var Error: Boolean);
begin
  if DisplayValue='AAA' then
  begin
    ShowMessage('已存在');
    Error:=True;
  end ;
end;
修改如下

if DisplayValue='AAA' then
  begin
    ShowMessage('已存在');
    Abort;
  end ;
[/quote]能私聊么?我说的是焦点问题,但是你没提焦点的事情啊,我感觉在这里说不清楚
delphi莎 2013-10-17
  • 打赏
  • 举报
回复
引用 4 楼 twtynk1 的回复:
cxGridDBColumn1.FocusWithSelection;
我试了,没反应
delphi莎 2013-10-17
  • 打赏
  • 举报
回复
引用 5 楼 gykthh 的回复:
如果值不改变 则点下一行是可以的

procedure TForm1.tvGrid1DBTableView1EditValueChanged(
  Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
var
 newvalue:string;
begin
  if sender.DataController.FocusedRecordIndex<>-1 then
  begin
   newvalue := Sender.Controller.EditingController.Edit.EditingValue;
   if  newvalue<>'AAA' then
   begin
     Sender.Controller.EditingController.Edit.SetFocus;
     ShowMessage('值不正确');
     Abort;
   end;
  end;
end;
不能这么写,我是连了数据集的,我现在是这么写的,现在只需要将焦点回到这个单元格
procedure TfrmBuMen.cxGrid1DBTableView1Column2PropertiesEditValueChanged(
  Sender: TObject);
var
  i, j: Integer;
begin
  inherited;
  cdsdept.Post;
  cdsdept.Edit;
  if cxGrid1DBTableView1Column2.DataBinding.Field.AsString = '' then Exit;

  j := cxGrid1DBTableView1.DataController.FocusedRecordIndex;
  for i := 0 to cxGrid1DBTableView1.DataController.RecordCount - 1 do
  begin
    if (cxGrid1DBTableView1.DataController.Values[i,1] = cxGrid1DBTableView1.DataController.Values[j,1]) and (i <> j) then
    begin
      ShowMessageX('部门代码' + cxGrid1DBTableView1.DataController.Values[j,1] + '已存在,不可重复!');
      Break;
    end;
  end;
end;
Blessed_Chuan 2013-10-16
  • 打赏
  • 举报
回复
可以在该单元格值改变事件中处理
Blessed_Chuan 2013-10-16
  • 打赏
  • 举报
回复
如果值不改变 则点下一行是可以的

procedure TForm1.tvGrid1DBTableView1EditValueChanged(
  Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem);
var
 newvalue:string;
begin
  if sender.DataController.FocusedRecordIndex<>-1 then
  begin
   newvalue := Sender.Controller.EditingController.Edit.EditingValue;
   if  newvalue<>'AAA' then
   begin
     Sender.Controller.EditingController.Edit.SetFocus;
     ShowMessage('值不正确');
     Abort;
   end;
  end;
end;
Alex-16888 2013-10-16
  • 打赏
  • 举报
回复
cxGridDBColumn1.FocusWithSelection;
Blessed_Chuan 2013-10-16
  • 打赏
  • 举报
回复
编辑的时候 能获取正在编辑的行,列索引号 定位到就可以了
delphi莎 2013-10-16
  • 打赏
  • 举报
回复
引用 1 楼 gykthh 的回复:
可以在该单元格值改变事件中处理
我知道,我想知道的是怎么将焦点指向该单元格,且选中单元格内容

5,392

社区成员

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

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