如何将制表符写入InputQuery?

How to write the tab character into the InputQuery?

我需要允许用户将制表符 (#9) 写入 InputQuery 函数的编辑器中。 按 tab 键将焦点移动到确定按钮上,按 Alt + 0 0 9 无效。

我找到的唯一方法是从文本编辑器(如记事本)复制选项卡并将其粘贴到 InputQuery 编辑器,但这对每个人来说都很不舒服...

有人知道其他方法吗?

那个“编辑器”只是一个TEdit。您所要做的就是按照您想要的方式将制表符输入 TEdit (默认情况下也不起作用)。如果你找不到办法做到这一点,那么你也不会有 InputQuery() 的运气。

但是,TMemo 已经在其 .WantTabs 属性 中加入了此功能。但话又说回来,这是一个多行输入控件 - 您必须自己决定这是否适合您。

重现 InputQuery() 的代码相当简单 - 它只是即时创建一个表单和控件,并在单击按钮后将它们全部释放。您还可以使用设计器来创建该表单。或者修改 Andreas' 代码以显示 TMemo 而不是 TEdit.

虽然 AmigoJack's 是正确的,但我建议采用不同的方法。

就个人而言,我希望 Tab 键在对话框中像往常一样工作。我希望它将焦点移到下一个控件。

所以我的建议是引入一个不同的热键,最好是Ctrl+I,插入一个#9插入符位置(替换任何选择)。

Ctrl+I for #9有点standard,因为I是第9个字母英文字母表。 (一个不同的常用热键是 Ctrl+Tab 但如果您使用页面控件或其他形式的选项卡,这会导致冲突。我更喜欢 Ctrl+I.)

很明显,这应该是编辑框的本地热键,这样Ctrl+I就不会被其他控件盗用了编辑框没有焦点。使用编辑框的 OnKeyPress 处理程序:

procedure TMyInputDialog.InputEditKeyPress(Sender: TObject; var Key: Char);
begin
  if Sender is TEdit then
    case Key of
      ^I:
        begin
          TEdit(Sender).SelText := #9;
          Key := #0;
        end;
    end;
end;

需要Key := #0语句来抑制无效输入的蜂鸣声。 (因为现在 Ctrl+Ivalid 输入。)