当使用键盘通过按钮点击添加字符时,如何让光标移到字符串的末尾

Jap*_*ter 4 delphi delphi-xe2

我正在建立一个像触摸屏上的键盘一样的形式.我现在遇到的问题是,当我按下按钮例如"1"按钮时,它必须将该字符"1"添加到编辑框,该编辑框显示已经按下的按键.现在我遇到的问题是,一旦一个人按下一个键,我就可以将char添加到已经显示在编辑框中的字符串,但是光标会转到编辑框的前面,而不会出现在后面.我使用以下代码将char添加到编辑框:

edtPassword.text := edtPassword.text + key;
Run Code Online (Sandbox Code Playgroud)

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

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

我正在使用Delphi XE2

TLa*_*ama 6

免责声明:

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

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;
Run Code Online (Sandbox Code Playgroud)

以及上述功能的用法.您可以将虚拟密钥,扫描代码或两者传递给此功能.当你不确定它们中的任何一个时,传递值为-1,键MapVirtualKey函数将由函数另外映射.以下示例显示如何发送a Backspace然后Shift + A:

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

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

您也可能违反参考并使用SendKeyfrom Vcl.Touch.Keyboard单元.在引用中声明它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, -1);
  SendKey(KeyData, ksDown);
  KeyData := VKey(Ord('A'), -1);
  SendKey(KeyData, ksDown);
  SendKey(KeyData, ksUp);
  KeyData := VKey(VK_SHIFT, -1);
  SendKey(KeyData, ksUp);
end;
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个非常好的和全面的答案:-) (3认同)

归档时间:

查看次数:

1998 次

最近记录:

13 年,4 月 前