能否取消某个字符串的输入?

努力偷懒 2008-01-06 01:04:28
我想在一个文本框中,或者是别的控件中,我想当如果检测到客户输入某个字符串以后就showmessage一段话,而文本框中的内容把刚才输入的那段话删掉它。不知道该怎么实现呢?谢谢!
...全文
83 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
努力偷懒 2008-01-07
  • 打赏
  • 举报
回复
m_INT:array of integer; //真实保存的结果
m_Time:array of integer; //真实保存的时间间隔
上面两个变量好像没用的。

这个是一个ID卡读取的方法,能判断出读取出一串连续快速出现的字符串。现在为止适合ID卡的读取,其他的还没测试,一些参数说明后面有注释的,需要的可以参考一下!
努力偷懒 2008-01-07
  • 打赏
  • 举报
回复
unit Unit1;

interface

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

type
TIDCheck=class( TObject)
protected
m_INTCheck:array of integer;//结果的检测用
m_TimeCheck:array of integer;//时间的检测用
m_INT:array of integer; //真实保存的结果
m_Time:array of integer; //真实保存的时间间隔
m_Begin:integer;//检测录入的字符第一个开始时间。
m_MaxTime:Smallint;//超出该时间证明不是ID的录入时间范围
m_Length:integer;//读取长度
m_LastResult:string;//上一次读取的结果
procedure DoClear;//当检测到符合清空条件的,则还原所有变量
function CheckID:Boolean;
function GetIDResult:string;
procedure DoAddKey(var key:word);//符合条件的进行处理。
public
aForm:TForm;
function KeyDownCheck(var key:word):string;
property IDResult:string read GetIDResult;
property LastResult:string read m_LastResult;
constructor Create(MaxTime:integer=30;Length:integer=10);
destructor Destroy; override;
end;

TForm1 = class(TForm)
Timer1: TTimer;
Memo1: TMemo;
Edit1: TEdit;
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
m_End,m_first:integer;
IDTest:TIDCheck;
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.dfm}
function TIDCheck.CheckID: Boolean;
begin
if m_INTCheck[m_Length-1]<0 then
result:=false
else
result:=true;
end;

constructor TIDCheck.Create(MaxTime: integer;Length:integer);
begin
m_MaxTime:=MaxTime;
m_Length:=Length;
SetLength(m_INTCheck,m_Length);
SetLength(m_TimeCheck,m_Length);
SetLength(m_INT,m_Length);
SetLength(m_Time,m_Length);
DoClear;
end;

destructor TIDCheck.Destroy;
begin
Finalize(m_INTCheck);
Finalize(m_TimeCheck);
Finalize(m_INT);
Finalize(m_Time);
inherited;
end;

procedure TIDCheck.DoAddKey(var key: word);
var
i:Smallint;
begin
for i:=0 to m_Length-1 do
if m_INTCheck[i]<0 then
begin
m_INTCheck[i]:=key;
m_TimeCheck[i]:=GetTickCount-m_Begin;
m_Begin:=GetTickCount;
break;
end;
if i=m_Length then//没有空间记录,把所有数据前移并把新的放在最后一位。
begin
for i:=1 to m_Length-1 do
begin
m_INTCheck[i-1]:=m_INTCheck[i];
m_TimeCheck[i-1]:=m_TimeCheck[i];
end;
m_INTCheck[m_Length]:=key;
m_TimeCheck[m_Length]:=GetTickCount-m_Begin;
m_Begin:=GetTickCount;
end;
if (m_TimeCheck[i]>=m_MaxTime) and (i>0) then //超出ID卡读取范围则清空
DoClear;
end;

procedure TIDCheck.DoClear;
var
i:integer;
begin
for i:=0 to m_Length-1 do
begin
m_INTCheck[i]:=-1;
m_INT[i]:=-1;
m_TimeCheck[i]:=-1;
m_Time[i]:=-1;
end;
m_Begin:=0;
aForm.Caption:=aForm.Caption+'clear';
end;

function TIDCheck.GetIDResult: string;
var
i:Shortint;
begin
if CheckID then
begin
for i:=0 to m_Length-1 do
result:=result+char(m_INTCheck[i]);
end;
end;

function TIDCheck.KeyDownCheck(var key:word):string;
begin
result:='';
case key of
48..57:DoAddKey(key);
13:begin
if checkid then //检测到结果则把结果返回
begin
result:=GetIDResult;
m_LastResult:=result;
DoClear;//清空重新处理。
end
else
DoClear;//清空重新处理。
end;
else//非数字的要清空并重新处理
DoClear;
end;
end;


procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
aStr:string;
begin
{
if key=13 then
begin
m_end:=GetTickCount;
memo1.Lines.Add('结束:'+inttostr(m_end-m_first));
m_first:=0;
end
else
begin
if m_first=0 then
begin
m_first:=GetTickCount;
memo1.Lines.Add('开始');
end;
end;

if key=13 then
begin
m_first:=0;
exit;
end;

if m_first=0 then
begin
m_first:=GetTickCount;
end
else
begin
memo1.Lines.Add('Key:'+char(key)+'keyCode'+inttostr(key)+'时间:'+inttostr(GetTickCount-m_first));
m_first:=GetTickCount;
end;
}
aStr:=IDTest.KeyDownCheck(key);
if length(aStr)>0 then
begin
memo1.Lines.Add(aStr);
key:=0;
end;
{
if self.ActiveControl is TEdit then
TEdit(self.ActiveControl).Text:=;
}
end;

procedure TForm1.FormShow(Sender: TObject);
begin
memo1.Clear;
m_End:=0;
m_first:=0;
IDTest:=TIDCheck.Create;
IDTest.aForm:=self;
end;

end.

还是感谢上面的两位,pazee 的想法和我的想法一样,不过,是根据时间来进行处理而已。和我当初的想法一样。谢谢。
jadeluo 2008-01-06
  • 打赏
  • 举报
回复
下面的代码是在TEdit的Change事件中进行判断的例子:

procedure TForm1.Edit1Change(Sender: TObject);
const
sCheck = 'Hello'; //要判断的字符串
var
AEdit: TEdit;
iPos : Integer;
begin
AEdit := TEdit(Sender);
iPos := Pos(sCheck, AEdit.Text);
if iPos > 0 then
begin
ShowMessage ('You type "' + sCheck + '"');
AEdit.Text := AnsiReplaceStr(AEdit.Text, sCheck, '');
AEdit.SelStart := iPos - 1;
end;
end;
耙子 2008-01-06
  • 打赏
  • 举报
回复
OnkeyPress 时间里面处理

16,748

社区成员

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

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