加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 当使用键盘通过按钮单击添加字符时,如何让光标移到字

发布时间:2020-12-15 09:36:33 所属栏目:大数据 来源:网络整理
导读:我正在建立一个像触摸屏上的键盘一样的形式.我现在遇到的问题是,当我按下按钮例如“1”按钮时,它必须将该字符“1”添加到编辑框,该编辑框显示已经按下的按键.现在我遇到的问题是,一旦一个人按下一个键,我就可以将char添加到已经显示在编辑框中的字符串,但是
我正在建立一个像触摸屏上的键盘一样的形式.我现在遇到的问题是,当我按下按钮例如“1”按钮时,它必须将该字符“1”添加到编辑框,该编辑框显示已经按下的按键.现在我遇到的问题是,一旦一个人按下一个键,我就可以将char添加到已经显示在编辑框中的字符串,但是光标会转到编辑框的前面,而不会出现在后面.我使用以下代码将char添加到编辑框:

edtPassword.text := edtPassword.text + key;

现在,只需将char添加到编辑框的末尾,但如何将光标移动到编辑框的末尾.

另外我还有一个退格按钮,如果你点击它,我会用什么代码擦除编辑框中字符串的最后一个字符?

我正在使用Delphi XE2

解决方法

免责声明:

我没有回答这个问题.当我需要一个虚拟键盘时,我正试图提出一种我宁愿遵循的方法.

1.现成的组件怎么样?

我建议你使用TTouchKeyboard组件,它是一个VCL组件,代表一个虚拟键盘.也就是说,你正在开发一些东西,这已经成为Delphi发行版的一部分.自2010年以来它是Delphi的一部分,但我不能说在哪个发行版中.

它看起来很难看,我宁愿做自己的:

当我第一次看到TTouchKeyboard组件时,我希望允许所有者绘图.嗯,不幸的是没有.在这种情况下,我会尝试自己模拟击键,而不是为你可能很快或稍后使用的其他组件解决这样的情况.

2.1.如何以自己的方式模拟击键?

以下代码使用SendInput函数模拟击键,它基于TTouchKeyboard组件使用的代码:

type
  TKeyState = (ksDown,ksUp);

function SendInputKey(AVirtualKey: Integer; AScanCode: Integer;
  AKeyState: TKeyState): Boolean;
var
  Input: TInput;
begin
  Input.Itype := INPUT_KEYBOARD;
  if (AVirtualKey = -1) and (AScanCode >= 0) then
  begin
    Input.ki.wVk := MapVirtualKey(AScanCode,MAPVK_VSC_TO_VK);
    Input.ki.wScan := AScanCode;
  end
  else if (AVirtualKey >= 0) and (AScanCode = -1) then
  begin
    Input.ki.wVk := AVirtualKey;
    Input.ki.wScan := MapVirtualKey(AVirtualKey,MAPVK_VK_TO_VSC);
  end
  else if (AVirtualKey >= 0) and (AScanCode >= 0) then
  begin
    Input.ki.wVk := AVirtualKey;
    Input.ki.wScan := AScanCode;
  end;
  case AKeyState of
    ksDown: Input.ki.dwFlags := 0;
    ksUp: Input.ki.dwFlags := KEYEVENTF_KEYUP;
  end;
  Result := SendInput(1,Input,SizeOf(TInput)) = 1;
end;

以及上述功能的用法.您可以将虚拟密钥,扫描代码或两者传递给此功能.如果您不确定其中任何一个,则传递值-1,并且密钥代码将由MapVirtualKey函数另外映射.以下示例显示如何发送Backspace然后转换A:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  SendInputKey(VK_BACK,-1,ksDown);
  SendInputKey(VK_BACK,ksUp);
  SendInputKey(VK_SHIFT,ksDown);
  SendInputKey(Ord('A'),ksUp);
end;

2.2.如何以禁止的方式模拟击键?

您也可能违反参考,并使用Vcl.Touch.Keyboard SendKey.在参考文献中声明SendKey在内部使用,不应该被调用,但它在单元外部可见,如果你足够大胆,你可以像这样使用它:

uses
  Vcl.Touch.Keyboard,Vcl.Touch.KeyboardTypes;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  KeyData: TKeyData;
begin
  KeyData := VKey(VK_BACK,-1);
  SendKey(KeyData,ksDown);
  SendKey(KeyData,ksUp);
  KeyData := VKey(VK_SHIFT,ksDown);
  KeyData := VKey(Ord('A'),ksUp);
end;

2.3.如何在不同的视图中模拟击键?

> How to send text to another application ?
> How to send keys to another application ?
> How to send keys without using SendMessage and PostMessage ?
> How to programmatically simulate user input ?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读