代码之家  ›  专栏  ›  技术社区  ›  Jamie

如何在编辑ttreeview节点时停止对话框默认和取消行为

  •  5
  • Jamie  · 技术社区  · 15 年前

    我有一个对话框,上面有一个t预览控件和一个确定和取消按钮。按钮的默认和canel属性分别设置为true,并且modalresult设置正确。

    用户可以使用内置的控件功能编辑树节点的标题。

    如果用户点击Escape或Enter 编辑树节点时 对话框将不显示,而只是取消或接受对节点标题的编辑。

    例如,在转义的情况下,我希望按一下escape一次可以编辑标题,然后再按一下escape取消对话框。

    处理这种情况的最佳方法是什么?

    tmemo有wantreturns属性来处理这个问题,但我看不到ttreeview的任何内容。

    5 回复  |  直到 7 年前
        1
  •  3
  •   Wael Dalloul    15 年前

    您应该从按钮中删除默认和取消属性,而应该将按下的键放在窗体上,然后执行“确定”或“取消”。

    编辑:

    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
    if (Key = VK_ESCAPE)and not (TreeView1.IsEditing) then
      CancelClick(sender)
    else
      if (Key = VK_RETURN) and not (TreeView1.IsEditing) then
        OkClick(sender);
    end;
    

    还需要将keypreview设置为true。

        2
  •  2
  •   Stijn Sanders    15 年前

    不要只在“确定”和“取消”按钮上设置modalresult属性,而是创建onclick事件处理程序并使用

    if not(TreeView1.IsEditing) then ModalResult:=mrOk
    

    或mrcancel

        3
  •  2
  •   Mason Wheeler    15 年前

    在这种情况下,我要做的是将onCloseQuery事件处理程序添加到表单中,如果ttreeview是焦点控件,则表单将阻止它关闭。

        4
  •  1
  •   Uli Gerhardt    15 年前

    在ttreeview.onediting中将default和cancel临时设置为false,在ttreeview.oneditd中将其重新设置为true可能会有所帮助。没什么可取消的-这可能是个问题。

        5
  •  1
  •   Fr0sT    7 年前

    我想我找到了最好的解决办法。一点理论:但是点击Escape Press在 TButton.CMDialogKey 它是由 TCustomForm.CMDialogKey 通过继承方法 TWinControl.CMDialogKey 这只是用给定的消息调用wndproc的所有控件。 所以我们要做的就是重写表单的方法:

    // Ignore ESCAPE when TV is in edit mode
    procedure TForm1.CMDialogKey(var Msg: TWMKey);
    begin
      if (Msg.CharCode = VK_ESCAPE) and (KeyDataToShiftState(Msg.KeyData) = []) and
         (ActiveControl = tvTree) and tvTree.IsEditing
        then // do nothing
        else inherited; // continue as usual
    end;
    

    这是你所需要的, ModalResult 按钮和 Cancel 道具保持不变。