gpt4 book ai didi

delphi - 使用键盘通过单击按钮添加字符时如何让光标移至字符串末尾

转载 作者:行者123 更新时间:2023-12-03 15:21:14 28 4
gpt4 key购买 nike

我正在构建一个表单,其功能类似于触摸屏上的键盘。我目前遇到的问题是,当我按下一个按钮(例如“1”按钮)时,它必须将该字符“1”添加到编辑框中,该编辑框显示已按下的键。现在我遇到的问题是,一旦有人按下一个键,我可以将字符添加到编辑框中已显示的字符串中,但光标会转到编辑框的前面,而不会出现在后面。我使用以下代码将字符添加到编辑框:

edtPassword.text := edtPassword.text + key;

现在只是将字符添加到编辑框的末尾,但是如何将光标移动到编辑框的末尾。

另外,我还有一个退格按钮,如果单击它,我将使用什么代码来删除编辑框中字符串的最后一个字符?

我使用的是 Delphi XE2

最佳答案

免责声明:

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

1。那么现成的组件呢?

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

2。它看起来很丑,我宁愿自己做:

当我看到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,然后发送 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;

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

您也可以违背引用文献并使用 SendKey来自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;

2.3。如何在不同的 View 中模拟击键?

关于delphi - 使用键盘通过单击按钮添加字符时如何让光标移至字符串末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12554094/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com