我有一个带有TTreeView控件的对话框,还有一个OK和Cancel按钮。按钮的Default和Canel属性分别设置为true,并且ModalResult已正确设置。
用户可以使用内置功能的控件编辑树节点的标题。
如果用户点击转义或在编辑树节点时输入 ,对话框将消失,而不是仅取消或接受对节点标题的编辑。
例如,在逃避的情况下,我希望一次点击转义以修改标题的编辑,然后再次点击转义以取消对话框。
处理这种情况的最佳方法是什么?
TMemo有WantReturns属性来处理这个问题,但我看不到TTreeView的任何内容。
答案 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
道具保持不变。