(如图)delphi中有关开发的一个问题。请大哥给出思路代码。

lijing15889662499 2013-08-05 12:20:56


现在红框内的信息都是通过扫描一维码。
但是有些人不规范操作,就用手输入这些信息,然后敲个回车。
有什么好方法可以杜绝这中情况吗?就是一定是扫描才可以。


跪求
...全文
186 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
simonhehe 2013-08-06
  • 打赏
  • 举报
回复
提供一个间接招: 界面放两个Edit, Edt1(只读, 供显示扫描码, 可获取焦点) Edt2(藏起来, 别让用户操作到, Tabstop设为false, 扫描枪的码首先进入edt2, 然后在Onchange事件中赋给Edt1)
zhengyc653 2013-08-05
  • 打赏
  • 举报
回复
在 KeyPress 事件中屏蔽一切按键
hsfzxjy 2013-08-05
  • 打赏
  • 举报
回复
将该框设为只读?
mdejtod 2013-08-05
  • 打赏
  • 举报
回复
ReadOnly 为true
lijing15889662499 2013-08-05
  • 打赏
  • 举报
回复
引用 11 楼 mdejtod 的回复:
[quote=引用 7 楼 feiba7288 的回复:] [quote=引用 6 楼 lijing15889662499 的回复:] [quote=引用 4 楼 xxcsoftware 的回复:] 把它的属性设为ReadOnly=True,这样不影响扫描的输入
只读模式,不影响扫描?????[/quote] 扫不了,呵呵,扫描枪接口和键盘接口是一样的,所以扫描枪扫描就等于是键盘输入。[/quote] 扫描后,可以得到编码吧,直接赋值不就可以了[/quote] 扫描的地方就可以手动输入。就不能限制了啊
mdejtod 2013-08-05
  • 打赏
  • 举报
回复
引用 7 楼 feiba7288 的回复:
[quote=引用 6 楼 lijing15889662499 的回复:] [quote=引用 4 楼 xxcsoftware 的回复:] 把它的属性设为ReadOnly=True,这样不影响扫描的输入
只读模式,不影响扫描?????[/quote] 扫不了,呵呵,扫描枪接口和键盘接口是一样的,所以扫描枪扫描就等于是键盘输入。[/quote] 扫描后,可以得到编码吧,直接赋值不就可以了
lijing15889662499 2013-08-05
  • 打赏
  • 举报
回复
引用 9 楼 feiba7288 的回复:
将那个10调小些,比如5
麻烦加一下我的QQ:345565208 请教你一下。
feiba7288 2013-08-05
  • 打赏
  • 举报
回复
将那个10调小些,比如5
lijing15889662499 2013-08-05
  • 打赏
  • 举报
回复
引用 5 楼 feiba7288 的回复:
给你个Demo,我在公司是这么用的:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    tKeyIn: TDateTime;
    FOldWndProc: TWndMethod;
  public
    { Public declarations }
    procedure NewWndProc(var Message: TMessage);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  tKeyIn := Now;
  FOldWndProc := Edit1.WindowProc;
  Edit1.WindowProc := NewWndProc;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  n: integer;
begin
  if Length(Edit1.Text) < 2 then
  begin
    tKeyIn := Now;
    exit;
  end;

  n := Round((Now - tKeyIn) *24*60*60);
  if n >= Ceil(Length(Edit1.Text) / 10) then//这里的10是一秒内允许输入的最大字符不超过10,你可以改大来
  begin
    MessageDlg('掃描時間超過' + IntToStr(Ceil(Length(Edit1.Text) / 20))
      + '秒!不可手動輸入,請用掃描槍掃描!', mtError, [mbCancel], 0);
    Key := #0;
    Edit1.Text := '';
    Edit1.SetFocus;
  end;
end;

procedure TForm1.NewWndProc(var Message: TMessage);
begin
  if (Message.Msg <> WM_CUT) and (Message.Msg <> WM_COPY) and (Message.Msg <> WM_PASTE) then
    FOldWndProc(Message);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Edit1.WindowProc := FOldWndProc;
end;

end.
那这和timer控件差不多吧? 我要输入的字符就是F1020-056 ,就这9个。 时间点掐不好啊,
feiba7288 2013-08-05
  • 打赏
  • 举报
回复
引用 6 楼 lijing15889662499 的回复:
[quote=引用 4 楼 xxcsoftware 的回复:] 把它的属性设为ReadOnly=True,这样不影响扫描的输入
只读模式,不影响扫描?????[/quote] 扫不了,呵呵,扫描枪接口和键盘接口是一样的,所以扫描枪扫描就等于是键盘输入。
lijing15889662499 2013-08-05
  • 打赏
  • 举报
回复
引用 4 楼 xxcsoftware 的回复:
把它的属性设为ReadOnly=True,这样不影响扫描的输入
只读模式,不影响扫描?????
feiba7288 2013-08-05
  • 打赏
  • 举报
回复
给你个Demo,我在公司是这么用的:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    tKeyIn: TDateTime;
    FOldWndProc: TWndMethod;
  public
    { Public declarations }
    procedure NewWndProc(var Message: TMessage);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  tKeyIn := Now;
  FOldWndProc := Edit1.WindowProc;
  Edit1.WindowProc := NewWndProc;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  n: integer;
begin
  if Length(Edit1.Text) < 2 then
  begin
    tKeyIn := Now;
    exit;
  end;

  n := Round((Now - tKeyIn) *24*60*60);
  if n >= Ceil(Length(Edit1.Text) / 10) then//这里的10是一秒内允许输入的最大字符不超过10,你可以改大来
  begin
    MessageDlg('掃描時間超過' + IntToStr(Ceil(Length(Edit1.Text) / 20))
      + '秒!不可手動輸入,請用掃描槍掃描!', mtError, [mbCancel], 0);
    Key := #0;
    Edit1.Text := '';
    Edit1.SetFocus;
  end;
end;

procedure TForm1.NewWndProc(var Message: TMessage);
begin
  if (Message.Msg <> WM_CUT) and (Message.Msg <> WM_COPY) and (Message.Msg <> WM_PASTE) then
    FOldWndProc(Message);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Edit1.WindowProc := FOldWndProc;
end;

end.
xxcsoftware 2013-08-05
  • 打赏
  • 举报
回复
把它的属性设为ReadOnly=True,这样不影响扫描的输入
feiba7288 2013-08-05
  • 打赏
  • 举报
回复
屏蔽掉粘贴功能,然后用输入时间来卡。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧