我正在尝试将程序从Delphi7升级到DelphiXE8。
在程序中有一些TEdit字段。您可以通过键盘或USB扫描仪在该字段中输入数据。 USB扫描仪模拟键盘,可在所有其他程序中正常工作。 (Delphi7中的相同程序,Firefox,编辑器等......)
如果我在Delphi XE8中使用扫描仪,TEdit字段无法获得正确的数据。如果我触发KeyDown事件,我会看到有许多Key 16/17/18进入,但KeyChar总是#0。
与TMemo相同的问题。
我只是尝试了不同的东西:
在VCL项目中,扫描仪工作正常。 在FMX项目中,扫描仪失败。
扫描仪是Birch BF-481BU / N.
有什么想法可以解决这个问题吗?
答案 0 :(得分:0)
我的扫描仪有Caps Lock设置。
自动
Alt +键盘
大写锁定关闭
大写锁定开
使用“自动”,“关闭”,“开启”扫描仪可以正常使用FMX。 使用“Alt +键盘”,FMX中的扫描失败。
答案 1 :(得分:0)
我尝试使用普通USB扫描仪(键盘楔),此代码可以正常工作。
procedure TForm2.Edit1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
Shift: TShiftState);
begin
if KeyChar = #13 then ShowMessage('Your code is ' + Edit1.Text);
end;
Alt + Keypad is used to enter particular chars typing the ascii code.
As an example if you press ALT + 126 the result will be "~"
So probably you have to remove the Alt+Keypad settings on your scanner.
答案 2 :(得分:0)
我在游戏中遇到了这个问题。似乎关键代码正在处理"处理"并在它甚至到达表单之前设置为null。看起来他们只是在按下ALT或CTRL键时传递信息。
为了解决这个特殊问题,我在FMX.Platform.Win
中注释掉了一行procedure CurrentChar(Msg: tagMsg; var Key: Word; var Ch: WideChar; var Shift: TShiftState);
begin
Key := wParam;
Ch := WideChar(Msg.wParam);
Shift := KeyDataToShiftState(lParam);
if (Ch >= ' ') then
begin
if ((Shift * [ssAlt, ssCtrl]) = [ssAlt, ssCtrl]) then
begin
// AltGr + Char (in German keyboard)
Shift := Shift - [ssAlt, ssCtrl];
end;
//WHYYYY?!?!?!?!?!?!?
//if (([ssAlt, ssCtrl, ssCommand] * Shift) = []) then
// Key := 0;
end;
if ((([ssAlt, ssCtrl, ssCommand] * Shift) <> []) or (Ch < ' ')) and (Key > 0) then
Ch := #0;
end;
我首先做的是将FMX源文件夹复制到您自己的私有源树中并从那里构建它。然后你的应用程序将使用你添加的任何小补丁来构建,但它比安装被黑的设计时包更简单。
一旦你拥有了自己的私人FMX源,那么你可以开始攻击它(你将不时这样做)。
开始一个新项目时应该做的第一件事就是将FMX源文件夹复制到您自己的私有源树中并从那里构建。
FMX在它是一个全面的跨平台解决方案之前还有很长的路要走,但它越来越近了,所以你偶尔也要乱用它。使用类似的方法,我添加了Android笔支持,修复了一些BLE问题......你可能会遇到自己的问题。