我的窗体上面是个dbgrid,中间是一堆dbedit,下面有'增加记录''删除记录''保存记录''刷新''关闭'5个按纽.我想判断dbedit1即工号的合法性,要求是'JD0001'格式的,输入的时候只输'0001',自动加上前缀.可现在的问题是老提示,'adoquery 不在edit状态'.这问题以前也碰过,以前解决的时候都把判断放到点击按纽事件里面,现在我想就在输入的时候判断.我的代码如下 unit Unit5;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, DBCtrls, Mask, Grids, DBGrids, DB, ADODB,
  jpeg, bsSkinCtrls, bsSkinData, bsdbctrls, bsSkinBoxCtrls, bsSkinGrids,
  bsDBGrids;type
  TForm5 = class(TForm)
    Image1: TImage;
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    DBMemo1: TDBMemo;
    DBEdit1: TDBEdit;
    DBEdit2: TDBEdit;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;
    DBEdit6: TDBEdit;
    DBEdit7: TDBEdit;
    bsSkinData1: TbsSkinData;
    bsCompressedStoredSkin1: TbsCompressedStoredSkin;
    bsSkinButton1: TbsSkinButton;
    bsSkinButton2: TbsSkinButton;
    bsSkinButton3: TbsSkinButton;
    bsSkinButton4: TbsSkinButton;
    bsSkinButton5: TbsSkinButton;
    bsSkinDBNavigator1: TbsSkinDBNavigator;
    bsSkinDBComboBox1: TbsSkinDBComboBox;
    bsSkinDBGrid1: TbsSkinDBGrid;
    bsSkinScrollBar1: TbsSkinScrollBar;
    bsSkinScrollBar2: TbsSkinScrollBar;
    
    procedure FormCreate(Sender: TObject);
    procedure bsSkinButton1Click(Sender: TObject);
    procedure bsSkinButton2Click(Sender: TObject);
    procedure bsSkinButton3Click(Sender: TObject);
    procedure bsSkinButton4Click(Sender: TObject);
    procedure bsSkinButton5Click(Sender: TObject);
   // procedure DBEdit1Exit(Sender: TObject);
    procedure DBEdit1KeyPress(Sender: TObject; var Key: Char);
    procedure DBEdit1Exit(Sender: TObject);
   // procedure ADOQuery1AfterScroll(DataSet: TDataSet);
   
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form5: TForm5;implementation{$R *.dfm}procedure TForm5.bsSkinButton1Click(Sender: TObject);
begin
adoquery1.Insert;
dbedit1.SetFocus;
end;procedure TForm5.bsSkinButton2Click(Sender: TObject);
begin
if messagebox(0,'确认要删除?','信息提示!',mb_yesno+mb_iconinformation+mb_taskmodal)=idyes then
adoquery1.Delete;
end;procedure TForm5.bsSkinButton3Click(Sender: TObject);
begin
try
  if AdoQuery1.state in [dsinsert,dsEdit] then
begin
if MessageBox(Handle,'是否真要保存修改信息吗?','提示',MB_ICONQUESTION
                or MB_YESNO) = idYes then
                adoquery1.post;
end;
ADOQuery1.UpdateBatch();
except
  raise;end;
end;procedure TForm5.bsSkinButton4Click(Sender: TObject);
begin
adoquery1.Close;
adoquery1.Active:=false;
adoquery1.Open;
adoquery1.Active:=true;
end;procedure TForm5.bsSkinButton5Click(Sender: TObject);
begin
close;
end;procedure TForm5.FormCreate(Sender: TObject);var
  loginstr:string;
beginloginstr:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='+ExtractFilePath(ParamStr(0)) +'人事管理系统.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";';
ADOConnection1.Connected:=false;
ADOConnection1.ConnectionString:=loginstr;
ADOConnection1.Connected:=true;ADOQuery1.Active:=true;
end;
procedure TForm5.DBEdit1KeyPress(Sender: TObject; var Key: Char);
begin
if   not   (Key   in   ['0'..'9',   #13,   #8])   then
                  Key   :=   #0;end;
procedure TForm5.DBEdit1Exit(Sender: TObject);
begin
if  (TWinControl(Screen.ActiveControl).Name <> 'bsSkinButton5')  then
begin
if Trim(dbedit1.Text)='' then
begin
 showmessage('工号不能为空');
 dbedit1.SetFocus;endelse if(length(dbedit1.Text)<>4) then
begin
showmessage('请输入四位编号');
dbedit1.SetFocus;
dbedit1.Text:='';
end
else
begin
dbedit1.Text:='JD'+dbedit1.Text;
end;
end;
end;end.还有如何判断它已经是'JD0001'格式了,即已经合法了 

解决方案 »

  1.   

    帮你重新整下:unit Unit5;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, DBCtrls, Mask, Grids, DBGrids, DB, ADODB,
      jpeg, bsSkinCtrls, bsSkinData, bsdbctrls, bsSkinBoxCtrls, bsSkinGrids,
      bsDBGrids;type
      TForm5 = class(TForm)
        Image1: TImage;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Label4: TLabel;
        Label5: TLabel;
        Label6: TLabel;
        Label7: TLabel;
        Label8: TLabel;
        Label9: TLabel;
        DBMemo1: TDBMemo;
        DBEdit1: TDBEdit;
        DBEdit2: TDBEdit;
        DBEdit3: TDBEdit;
        DBEdit4: TDBEdit;
        DBEdit6: TDBEdit;
        DBEdit7: TDBEdit;
        bsSkinData1: TbsSkinData;
        bsCompressedStoredSkin1: TbsCompressedStoredSkin;
        bsSkinButton1: TbsSkinButton;
        bsSkinButton2: TbsSkinButton;
        bsSkinButton3: TbsSkinButton;
        bsSkinButton4: TbsSkinButton;
        bsSkinButton5: TbsSkinButton;
        bsSkinDBNavigator1: TbsSkinDBNavigator;
        bsSkinDBComboBox1: TbsSkinDBComboBox;
        bsSkinDBGrid1: TbsSkinDBGrid;
        bsSkinScrollBar1: TbsSkinScrollBar;
        bsSkinScrollBar2: TbsSkinScrollBar;
        
        procedure FormCreate(Sender: TObject);
        procedure bsSkinButton1Click(Sender: TObject);
        procedure bsSkinButton2Click(Sender: TObject);
        procedure bsSkinButton3Click(Sender: TObject);
        procedure bsSkinButton4Click(Sender: TObject);
        procedure bsSkinButton5Click(Sender: TObject);
       // procedure DBEdit1Exit(Sender: TObject);
        procedure DBEdit1KeyPress(Sender: TObject; var Key: Char);
        procedure DBEdit1Exit(Sender: TObject);
       // procedure ADOQuery1AfterScroll(DataSet: TDataSet);
       
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form5: TForm5;implementation{$R *.dfm}procedure TForm5.bsSkinButton1Click(Sender: TObject);
    begin
      if AdoQuery1.Active then adoquery1.Insert;
      if DBEdit1.canFocus then dbedit1.SetFocus;
    end;procedure TForm5.bsSkinButton2Click(Sender: TObject);
    begin
      if messagebox(0,'确认要删除?','信息提示!',mb_yesno+mb_iconinformation+mb_taskmodal)=idyes then
      begin
       if not AdoQuery1.IsEmpty then
        adoquery1.Delete;
      end;
    end;{这个你错得太离谱了,注意对比}
    procedure TForm5.bsSkinButton3Click(Sender: TObject);
    begin
      try
        if AdoQuery1.state in [dsinsert,dsEdit] then
        begin
          if MessageBox(Handle,'是否真要保存修改信息吗?','提示',MB_ICONQUESTION
                       or MB_YESNO) = idYes then
          begin
            adoquery1.post;
            ADOQuery1.UpdateBatch();
          end;
        end;
      except
        raise;
      end;
    end;procedure TForm5.bsSkinButton4Click(Sender: TObject);
    begin
      adoquery1.Close;
      adoquery1.Active:=false;
      adoquery1.Open;
      adoquery1.Active:=true;
    end;procedure TForm5.bsSkinButton5Click(Sender: TObject);
    begin
      close;
    end;procedure TForm5.FormCreate(Sender: TObject);
    var
      loginstr:string;
    beginloginstr:='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source='+ExtractFilePath(ParamStr(0)) +'人事管理系统.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";';
    ADOConnection1.Connected:=false;
    ADOConnection1.ConnectionString:=loginstr;
    ADOConnection1.Connected:=true;ADOQuery1.Active:=true;
    end;
    procedure TForm5.DBEdit1KeyPress(Sender: TObject; var Key: Char);
    begin
    if   not   (Key   in   ['0'..'9',   #13,   #8])   then
                      Key   :=   #0;end;
    procedure TForm5.DBEdit1Exit(Sender: TObject);
    begin
    if  (TWinControl(Screen.ActiveControl).Name <> 'bsSkinButton5')  then
    begin
     if Trim(dbedit1.Text)='' then
     begin
       showmessage('工号不能为空');
       dbedit1.SetFocus;
    endelse if(length(dbedit1.Text)<>4) then
    begin
      showmessage('请输入四位编号');
      dbedit1.SetFocus;
      dbedit1.Text:='';
    end
    else
    begin
      dbedit1.Text:='JD'+dbedit1.Text;
    end;
    end;
    end;end.
      

  2.   


    处理必须输入6个字符的问题
    AdoQuery1.beforepost 中写下面的代码procedure AdoQuery1BeforePost(DataSet: TDataSet);
    begin
     
     if AdoQuery1.state in [dsinset,dsEdit] then 
     begin
      //dbedit1指几的字段名我不知道,先这样处理了
       if AdoQuery1.fieldbyname(DBEdit1.fieldname).isNull then begin
         showMessage('此字段必须输入');
         abort;
       end;
       if length(AdoQuery1.fieldbyname(DBEdit1.fieldname).AsString) <> 6 then begin
         showMessage('此字段输入的长度不合法');
         abort;
       end;   if Lowercase(leftstr(AdoQuery1.fieldbyname(DBEdit1.fieldname).AsString,2)) <> 'jd' then 
       begin
          showMessage('前两位字符必须为 JD');
         abort;
       end;
     end;
    end;