我正在尝试将一个程序从Delphi7升级到DelphiXE8。
在程序中有一些TEdit字段。您可以通过键盘或usb扫描仪输入该字段中的数据。usb扫描仪模拟键盘,并在所有其他程序中工作良好。( Delphi7、火狐、编辑器等相同的程序.)
如果我在Delphi XE8中使用扫描仪,那么TEdit字段就不会得到正确的数据。如果触发一个KeyDown事件,我会看到有许多键16/17/18即将出现,但KeyChar总是#0。
TMemo也有同样的问题。
我只是尝试了一些不同的东西:
在VCL项目中,扫描仪工作得很好。在FMX项目中,扫描仪失败。
扫描仪是桦木BF-481BU/N。
有什么办法能解决这个问题吗?
发布于 2015-07-13 15:49:33
我的扫描仪有一个Caps设置。
自动
Alt+Keypad
帽锁
帽锁
与“自动”,“关闭”,"On“扫描仪工作良好与FMX。使用"Alt+Keypad“扫描在FMX中失败。
发布于 2015-07-13 21:56:41
我尝试了一个正常的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.发布于 2016-01-03 18:42:01
我正在制作的游戏有这个问题。似乎键代码在到达表单之前就被“处理”并设置为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问题.你可能会遇到你自己的东西。
https://stackoverflow.com/questions/31381334
复制相似问题