grid绑定的数据放到数据库里面的时候需要加密,显示的时候需要解密。请问大侠们grid控件上显示的数据和数据库里面放的数据对应起来的时候有什么中间的过程可以加我的加密和解密,或者说还有什么别的实现的办法啊

解决方案 »

  1.   

    在数据集建立计算字段,然后在该计算字段的OnCalcFields事件进行解密,显示的时候,不是直接显示加密字段,而是显示该计算字段。
    比如,加密字段是 abc ,计算字段是 xyz ,解密函数为 Decrypt,代码可以这么写:
    procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet);
    begin
      ADOQuery1xyz.AsString:=Decrypt(ADOQuery1abc);
    end;然后,感知表格中显示 ADOQuery1xyz 字段的数据。
      

  2.   

    如果我是动态传入sql语句而且根据字段进行解密 如何实现 是否需重写CalcFields方法?
      

  3.   

    我是动态传入sql语句 对某个字段进行解密 是否需要重写CalcFields方法
      

  4.   

    例子:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB;type
      TForm1 = class(TForm)
        Button1: TButton;
        ADOConnection1: TADOConnection;
        ADOTable1: TADOTable;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        ADOQuery1: TADOQuery;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure SetDecryptField(ADOset: TADOQuery; SQLText: String; Field_ID: integer);
        procedure ADOsetCalcFields(DataSet: TDataSet);
        function Decrypt(EncryptStr: String): String;//解密函数
      end;
    var
      Form1: TForm1;
    implementationvar DecryptFieldIndex: integer;//加密字段的索引{$R *.dfm}procedure TForm1.SetDecryptField(ADOset: TADOQuery; SQLText: String;
      Field_ID: integer);
    var i: integer;
        Field : TField;
        Field_tmpstr: TStringField;
    begin
      with ADOset do begin
        Close;
        Sql.Text:=SQLText;//传入的查询语句
        Open;
        FieldDefs.Update;
        Close;
        //建立静态字段:
        for i := 0 to FieldDefs.Count -1 do begin
          Field := FieldDefs.Items[i].FieldClass.Create(ADOset);
          Field.FieldName := FieldDefs.Items[i].Name;
          Field.FieldKind := fkData;
          Field.Size := FieldDefs.Items[i].Size;
          Field.DataSet := ADOset;
        end;
        FieldDefs.UpDate;
        //建立计算字段:
        Field_tmpstr := TStringField.Create(Self);
        Field_tmpstr.FieldName := 'myfield';
        Field_tmpstr.FieldKind := fkcalculated;
        Field_tmpstr.Name := Name + Field_tmpstr.FieldName;
        Field_tmpstr.DataSet := ADOset;
        FieldDefs.UpDate;
        DecryptFieldIndex:= Field_ID;//用全局变量保存加密字段的索引值
        ADOset.Fields[Field_ID].Visible:=false;//隐藏加密字段
        Open;
        OnCalcFields:= ADOsetCalcFields;//关联计算事件给数据集
      end;
    end;procedure TForm1.ADOsetCalcFields(DataSet: TDataSet);//动态数据集的计算事件
    begin
      DataSet.FieldByName('myfield').AsString:=
        Decrypt(DataSet.Fields.Fields[DecryptFieldIndex].AsString);//通过解密函数对计算字段赋值
    end;
    function TForm1.Decrypt(EncryptStr: String): String;
    begin
      Result:= '';
      if length(EncryptStr) < 7 then exit;
      Result:= EncryptStr[1]+EncryptStr[5]+EncryptStr[7];//假定解密算法是抽取第1、5、7个字符
    end;procedure TForm1.Button1Click(Sender: TObject);//应用例子
    var s: string;
        indx: integer;
    begin
      s:='select * from abc';//假设的动态查询语句
      indx:= ADOQuery1.FieldByName('加密字段名').Index;
      SetDecryptField(ADOQuery1,s,indx);//生成动态计算字段
    end;end.
      

  5.   

    例子:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB;type
      TForm1 = class(TForm)
        Button1: TButton;
        ADOConnection1: TADOConnection;
        ADOTable1: TADOTable;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        ADOQuery1: TADOQuery;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure SetDecryptField(ADOset: TADOQuery; SQLText: String; Field_ID: integer);
        procedure ADOsetCalcFields(DataSet: TDataSet);
        function Decrypt(EncryptStr: String): String;//解密函数
      end;
    var
      Form1: TForm1;
    implementationvar DecryptFieldIndex: integer;//加密字段的索引{$R *.dfm}procedure TForm1.SetDecryptField(ADOset: TADOQuery; SQLText: String;
      Field_ID: integer);
    var i: integer;
        Field : TField;
        Field_tmpstr: TStringField;
    begin
      with ADOset do begin
        Close;
        Sql.Text:=SQLText;//传入的查询语句
        Open;
        FieldDefs.Update;
        Close;
        //建立静态字段:
        for i := 0 to FieldDefs.Count -1 do begin
          Field := FieldDefs.Items[i].FieldClass.Create(ADOset);
          Field.FieldName := FieldDefs.Items[i].Name;
          Field.FieldKind := fkData;
          Field.Size := FieldDefs.Items[i].Size;
          Field.DataSet := ADOset;
        end;
        FieldDefs.UpDate;
        //建立计算字段:
        Field_tmpstr := TStringField.Create(Self);
        Field_tmpstr.FieldName := 'myfield';
        Field_tmpstr.FieldKind := fkcalculated;
        Field_tmpstr.Name := Name + Field_tmpstr.FieldName;
        Field_tmpstr.DataSet := ADOset;
        FieldDefs.UpDate;
        DecryptFieldIndex:= Field_ID;//用全局变量保存加密字段的索引值
        ADOset.Fields[Field_ID].Visible:=false;//隐藏加密字段
        Open;
        OnCalcFields:= ADOsetCalcFields;//关联计算事件给数据集
      end;
    end;procedure TForm1.ADOsetCalcFields(DataSet: TDataSet);//动态数据集的计算事件
    begin
      DataSet.FieldByName('myfield').AsString:=
        Decrypt(DataSet.Fields.Fields[DecryptFieldIndex].AsString);//通过解密函数对计算字段赋值
    end;
    function TForm1.Decrypt(EncryptStr: String): String;
    begin
      Result:= '';
      if length(EncryptStr) < 7 then exit;
      Result:= EncryptStr[1]+EncryptStr[5]+EncryptStr[7];//假定解密算法是抽取第1、5、7个字符
    end;procedure TForm1.Button1Click(Sender: TObject);//应用例子
    var s: string;
        indx: integer;
    begin
      s:='select * from abc';//假设的动态查询语句
      indx:= ADOQuery1.FieldByName('加密字段名').Index;
      SetDecryptField(ADOQuery1,s,indx);//生成动态计算字段
    end;end.
      

  6.   

    Column有一个OnGetDisplayText事件属性!
    可以在那个里面处理数据