代码如下: unit qry_edit;interfaceuses Windows, Messages, SysUtils, Classes, Controls, StdCtrls,Dialogs,ADODB,db,Graphics,QExtCtrls;
type field_type=(tAll,tInt,tFloat); type TChangeEvent = procedure(Sender: TObject; Value: integer) of object; type Tqry_edit = class(TEdit) private Fdata_field_type:field_type; Fdata_field: string; Fdata_field_empty: Boolean; Fdata_field_PRIMARY: Boolean; Fdata_qry: TADOQuery; FTimerEvent: TNotifyEvent; tmr1:TTimer; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure KeyPress(var Key: Char); override; procedure KeyDown(var Key: Word; Shift: TShiftState); override; { Private declarations } protected { Public declarations } published //procedure procedure getvalue; procedure setvalue; property data_field: string read Fdata_field write Fdata_field; property data_field_empty: Boolean read Fdata_field_empty write Fdata_field_empty; property data_field_PRIMARY: Boolean read Fdata_field_PRIMARY write Fdata_field_PRIMARY; property data_field_type:field_type read Fdata_field_type write Fdata_field_type default Tall; property data_qry: TADOQuery read Fdata_qry write Fdata_qry; property OnTimer: TNotifyEvent read FTimerEvent write FTimerEvent; { Published declarations } end;procedure Register;implementationprocedure Register; begin RegisterComponents('MYPRO', [Tqry_edit]); end;{ Tqry_edit }constructor Tqry_edit.Create(AOwner: TComponent); begin inherited Create(AOwner); // tmr1:=TTimer.Create(aowner); // tmr1.Interval:=1000; // tmr1.Enabled:=False; end;destructor Tqry_edit.Destroy; begin inherited; tmr1.Destroy; end;procedure Tqry_edit.getvalue; begin Text:=Fdata_qry.FieldValues[Fdata_field]; end;procedure Tqry_edit.KeyDown(var Key: Word; Shift: TShiftState); begin if Key = VK_DELETE then if Self.SelStart=pos('.',Self.Text)-1 then Key := 0; inherited KeyDown(Key,Shift);end;procedure Tqry_edit.KeyPress(var Key: Char); var kv: Integer; begin kv := Ord(Key); case Fdata_field_type of tInt: if (((kv>58) or (kv<48)) and (kv<>3) and (kv<>22) and (kv<>8) and (kv<>13)) then Key := chr(0); tFloat: begin if (((kv>58) or (kv<48)) and (kv<>3) and (kv<>22) and (kv<>46) and (kv<>8) and (kv<>13)) then Key := chr(0) else begin if (kv=46) and (Pos('.',self.Text)>0) then//已有小数点 Key := chr(0) end; end; end; inherited KeyPress(Key); end;procedure Tqry_edit.setvalue; var i,state:integer; bj:Boolean; begin case fdata_qry.State of dsInsert:state:=1; dsEdit:state:=2; end; bj:=true; if Fdata_qry.State in [dsinsert,dsEdit] then begin if (text='') and (Fdata_field_empty) then begin showmessage('请添入数据'); SetFocus; Color:=clRed; Fdata_qry.Cancel; bj:=False; exit; end else if Fdata_field_PRIMARY then begin Fdata_qry.First; while not Fdata_qry.Eof do begin if Text=Fdata_qry.FieldValues[Fdata_field] then begin showmessage('此数据不能重复输入!'); SetFocus; Color:=clInfoBk; Fdata_qry.Cancel; bj:=False; exit; end; Fdata_qry.Next; end; end; if bj then begin if (Fdata_qry.State<>dsinsert) and (Fdata_qry.State<>dsinsert)then begin case state of 1:Fdata_qry.Insert; 2:Fdata_qry.Edit; end; end; Fdata_qry.FieldValues[Fdata_field]:=Text; Color:=clWindow; end; end; end;end.
procedure test; begin //在这里进行你的操作 ...... end;procedure TForm1.FormCreate(Sender: TObject); begin timer.ontimer :=test; end;
//自定义定时器事件 unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type TmyTimer = class private { Private declarations } procedure mTimer(Sender: TObject); public { Public declarations } end; type TForm1 = class(TForm) Timer1: TTimer; Label1: TLabel; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm} procedure TmyTimer.mTimer(Sender: TObject); begin form1.Label1.Caption :=datetimetostr(now); end;procedure TForm1.FormCreate(Sender: TObject); var tm:TmyTimer; begin tm:=TmyTimer.Create ; Timer1.OnTimer :=tm.mTimer;//设置事件处理 tm.Free ; end;end.
應該在 edit 的onchange or onExit 事件中判斷!!你的思路應該不對
timer.ontime := 你定义的事件
unit qry_edit;interfaceuses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls,Dialogs,ADODB,db,Graphics,QExtCtrls;
type field_type=(tAll,tInt,tFloat);
type
TChangeEvent = procedure(Sender: TObject; Value: integer) of object;
type
Tqry_edit = class(TEdit) private
Fdata_field_type:field_type;
Fdata_field: string;
Fdata_field_empty: Boolean;
Fdata_field_PRIMARY: Boolean;
Fdata_qry: TADOQuery;
FTimerEvent: TNotifyEvent;
tmr1:TTimer;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure KeyPress(var Key: Char); override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
{ Private declarations }
protected
{ Public declarations }
published
//procedure
procedure getvalue;
procedure setvalue;
property data_field: string read Fdata_field write Fdata_field;
property data_field_empty: Boolean read Fdata_field_empty write
Fdata_field_empty;
property data_field_PRIMARY: Boolean read Fdata_field_PRIMARY write
Fdata_field_PRIMARY;
property data_field_type:field_type read Fdata_field_type write
Fdata_field_type default Tall;
property data_qry: TADOQuery read Fdata_qry write Fdata_qry;
property OnTimer: TNotifyEvent read FTimerEvent write FTimerEvent; { Published declarations }
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('MYPRO', [Tqry_edit]);
end;{ Tqry_edit }constructor Tqry_edit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
// tmr1:=TTimer.Create(aowner);
// tmr1.Interval:=1000;
// tmr1.Enabled:=False;
end;destructor Tqry_edit.Destroy;
begin
inherited;
tmr1.Destroy;
end;procedure Tqry_edit.getvalue;
begin
Text:=Fdata_qry.FieldValues[Fdata_field];
end;procedure Tqry_edit.KeyDown(var Key: Word; Shift: TShiftState);
begin
if Key = VK_DELETE then
if Self.SelStart=pos('.',Self.Text)-1 then
Key := 0;
inherited KeyDown(Key,Shift);end;procedure Tqry_edit.KeyPress(var Key: Char);
var
kv: Integer;
begin
kv := Ord(Key);
case Fdata_field_type of
tInt:
if (((kv>58) or (kv<48)) and (kv<>3) and (kv<>22) and (kv<>8) and (kv<>13)) then
Key := chr(0);
tFloat:
begin
if (((kv>58) or (kv<48)) and (kv<>3) and (kv<>22) and (kv<>46) and (kv<>8) and (kv<>13)) then
Key := chr(0)
else
begin
if (kv=46) and (Pos('.',self.Text)>0) then//已有小数点
Key := chr(0)
end;
end;
end; inherited KeyPress(Key);
end;procedure Tqry_edit.setvalue;
var
i,state:integer;
bj:Boolean;
begin
case fdata_qry.State of
dsInsert:state:=1;
dsEdit:state:=2;
end;
bj:=true;
if Fdata_qry.State in [dsinsert,dsEdit] then
begin
if (text='') and (Fdata_field_empty) then
begin
showmessage('请添入数据');
SetFocus;
Color:=clRed;
Fdata_qry.Cancel;
bj:=False;
exit;
end else
if Fdata_field_PRIMARY then
begin
Fdata_qry.First;
while not Fdata_qry.Eof do
begin
if Text=Fdata_qry.FieldValues[Fdata_field] then
begin
showmessage('此数据不能重复输入!');
SetFocus;
Color:=clInfoBk;
Fdata_qry.Cancel;
bj:=False;
exit;
end;
Fdata_qry.Next;
end;
end;
if bj then
begin
if (Fdata_qry.State<>dsinsert) and (Fdata_qry.State<>dsinsert)then
begin
case state of
1:Fdata_qry.Insert;
2:Fdata_qry.Edit;
end;
end;
Fdata_qry.FieldValues[Fdata_field]:=Text;
Color:=clWindow;
end;
end;
end;end.
begin
//在这里进行你的操作
......
end;procedure TForm1.FormCreate(Sender: TObject);
begin
timer.ontimer :=test;
end;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TmyTimer = class
private
{ Private declarations }
procedure mTimer(Sender: TObject);
public
{ Public declarations }
end; type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
procedure TmyTimer.mTimer(Sender: TObject);
begin
form1.Label1.Caption :=datetimetostr(now);
end;procedure TForm1.FormCreate(Sender: TObject);
var tm:TmyTimer;
begin
tm:=TmyTimer.Create ;
Timer1.OnTimer :=tm.mTimer;//设置事件处理
tm.Free ;
end;end.