我的要求是:dbedit连接临时表的某个字段field,在我输入0-1之间的数字,离开的时候,显示为 *100后的数字,比如输入0.5,离开时显示为50,但是临时表中还是保存为0.5。有什么好办法吗?求指教

解决方案 »

  1.   

    你可以参照一下Lookup控件
    有Value和DisplayText
    参照一下处理方法
      

  2.   

    可以这样,不过如果是用表格控件(比如DBGrid),则不能这样做;改用计算字段吧,但计算字段不能編輯procedure TForm1.ADOQuery1AfterOpen(DataSet: TDataSet);
    var
      F:TField;
    begin
      F:=DataSet.FieldByName('字段名');
      TFloatField(F).DisplayFormat:=FloatToStr(F.AsFloat*100);
      TFloatField(F).EditFormat:='#.#';
    end;
      

  3.   

    新建工程、双击窗体,用下列代码覆盖你的unit1:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, StdCtrls, Mask, DBCtrls, Grids, DBGrids, ADODB, DBClient,
      Provider;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        procedure CDSetCalcFields(DataSet: TDataSet);
        procedure DBEditExit(Sender: TObject);
        procedure DBEditEnter(Sender: TObject);
        procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
        procedure DBEditKeyPress(Sender: TObject; var Key: Char);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses ComObj;
    var DSProvider:TDataSetProvider;
        CDSet: TClientDataSet;
        DSource:TDataSource;
        DBGrid: TDBGrid;
        DBEdit: TDBEdit;
        ADOQry: TADOQuery;
    {$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    const ConnectionStr:string='Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;'
              +'Data Source=.\db2.mdb;Mode=Share Deny None;Extended Properties="";'
              +'Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database '
              +'Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet '
              +'OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;'
              +'Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;'
              +'Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don'+#39+'t Copy Locale on Compact=False;'
              +'Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';//连接串
    var AccessDB:OleVariant;
        tmpField:TField;
        i:integer;
    begin
      //窗体设置:
      Height:=360;
      Width:=480;
      Caption:='让数据增大100倍在DBEdit显示';
      Position:=poScreenCenter;
      OnCloseQuery:=FormCloseQuery;
      //表格设置:
      DBGrid:=TDBGrid.Create(self);
      try
        DBGrid.Parent:=Form1;
        DBGrid.Align:=alTop;
        DBGrid.Height:=260;
      except
        FreeAndNil(DBGrid);
        close;
        exit;
      end;
      //输入框设置:
      DBEdit:=TDBEdit.Create(self);
      try
        DBEdit.Parent:=Form1;
        DBEdit.Left:=168;
        DBEdit.Top:=280;
        DBEdit.OnEnter:=DBEditEnter;
        DBEdit.OnExit:=DBEditExit;
        DBEdit.OnKeyPress:=DBEditKeyPress;
      except
        FreeAndNil(DBEdit);
        close;
        exit;
      end;
      //数据集设置:
      ADOQry:=TADOQuery.Create(self);
      if not FileExists('.\db2.mdb')then begin //如果文件db2.mdb不在当前位置
        //建立库文件:
        try
          AccessDB:=CreateOleObject('ADOX.Catalog');
          AccessDB.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\db2.mdb');
        finally
          AccessDB:=VarNull;
        end;
        //建立表Tab1
        try
          with ADOQry do begin
            ConnectionString:=ConnectionStr;
            SQL.Text:='Create Table Tab1(ID Counter,项目 string,数据 numeric(10,3))';
            ExecSQL;
            for i:=1 to 10 do begin
              ADOQry.Close;
              SQL.Text:='INSERT INTO Tab1 (项目,数据) VALUES ('+QuotedStr('第'+IntToStr(i)+'笔')+','+FloatToStr(i*1.5)+')';
              ExecSQL;
            end;
          end;
        except
          FreeAndNil(ADOQry);
          close;
          exit;
        end;
      end;
      try
        with ADOQry do begin
          Close;
          ConnectionString:=ConnectionStr;//连接db2.mdb
          SQL.Text:='select * from Tab1';//打开表Tab1
          Open;
        end;
      except
        FreeAndNil(ADOQry);
        close;
        exit;
      end;
      DSProvider:=TDataSetProvider.Create(self);
      DSProvider.Name:='DSProvider';
      DSProvider.DataSet:=ADOQry;
      CDSet:=TClientDataSet.Create(self);
      CDSet.ProviderName:='DSProvider';
      //固定字段:
      tmpField:=TAutoIncField.Create(CDSet);
      tmpField.FieldName:='ID';
      tmpField.DataSet:=CDSet;
      tmpField.FieldKind:=fkData;
      tmpField:=TWideStringField.Create(CDSet);
      tmpField.FieldName:='项目';
      tmpField.DataSet:=CDSet;
      tmpField.FieldKind:=fkData;
      tmpField:=TBCDField.Create(CDSet);
      tmpField.FieldName:='数据';
      tmpField.Size:=ADOQry.FieldByName('数据').Size;
      tmpField.DataSet:=CDSet;
      tmpField.FieldKind:=fkData;
      //计算字段:
      tmpField:=TBCDField.Create(CDSet);
      tmpField.FieldName:='用于显示';
      tmpField.DataSet:=CDSet;
      tmpField.FieldKind:=fkInternalCalc;
      //数据关联:
      CDSet.OnCalcFields:=CDSetCalcFields;
      CDSet.Open;
      DSource:=TDataSource.Create(self);
      DSource.DataSet:=CDSet;
      DBEdit.DataField:='用于显示';
      DBEdit.DataSource:=DSource;
      DBGrid.DataSource:=DSource;
    end;procedure TForm1.CDSetCalcFields(DataSet: TDataSet);
    begin
      CDSet.FieldByName('用于显示').AsFloat:=CDSet.FieldByName('数据').AsFloat*100;
    end;procedure TForm1.DBEditExit(Sender: TObject);
    begin
      CDSet.FieldByName('数据').AsFloat:=CDSet.FieldByName('用于显示').AsFloat;
      CDSet.Post;
      CDSet.ApplyUpdates(0);//将数据的变化反映到数据库
    end;procedure TForm1.DBEditEnter(Sender: TObject);
    begin
      CDSet.Edit;
      CDSet.FieldByName('用于显示').AsFloat:=CDSet.FieldByName('数据').AsFloat;
    end;procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
      //释放控件:
      if DBGrid<>nil then DBGrid.Free;
      if DBEdit<>nil then DBEdit.Free;
      DSource.Free;
      CDSet.Free;
      DSProvider.Free;
      if ADOQry<>nil then ADOQry.Free;
    end;procedure TForm1.DBEditKeyPress(Sender: TObject; var Key: Char);
    begin
      if key=#13 then perform(wm_nextdlgctl,0,0);//当按回车时,焦点移到下一可获焦点的控件
    end;end.
      

  4.   

    自己搞定了,在onValidate中编辑对应记录,然后在编辑和查询的时候,修改值就行。散分
      

  5.   

    dbedit是感知控件,小心它数据源的自动保存功能,如果自动保存,你就惨了。