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

时间:2009-08-25 11:21:14

标签: delphi

我有一个带有TTreeView控件的对话框,还有一个OK和Cancel按钮。按钮的Default和Canel属性分别设置为true,并且ModalResult已正确设置。

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

如果用户点击转义或在编辑树节点时输入 ,对话框将消失,而不是仅取消或接受对节点标题的编辑。

例如,在逃避的情况下,我希望一次点击转义以修改标题的编辑,然后再次点击转义以取消对话框。

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

TMemo有WantReturns属性来处理这个问题,但我看不到TTreeView的任何内容。

5 个答案:

答案 0 :(得分:3)

你应该从按钮中删除默认和取消属性,而不应该在表格keyDown上按下键,然后执行确定或取消。

编辑:

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。

答案 1 :(得分:2)

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

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

或mrCancel

答案 2 :(得分:2)

在这种情况下我要做的是在表单中添加一个OnCloseQuery事件处理程序,以便在TTreeView成为焦点控件时阻止它关闭。

答案 3 :(得分:1)

在TTreeView.OnEditing中暂时将Default和Cancel设置为False并在TTreeView.OnEdited中将其恢复为True可能会有所帮助。没有OnCancelEdit - 这可能是个问题。

答案 4 :(得分:1)

我想我找到了最好的解决方案。一点点理论:点击Escape press在TButton.CMDialogKey中启动,由TCustomForm.CMDialogKey通过继承的方法TWinControl.CMDialogKey调用,该方法只使用给定的消息调用其所有控件的WndProc。 所以我们要做的就是覆盖form的方法:

// 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道具保持不变。