grid绑定的数据放到数据库里面的时候需要加密,显示的时候需要解密。请问大侠们grid控件上显示的数据和数据库里面放的数据对应起来的时候有什么中间的过程可以加我的加密和解密,或者说还有什么别的实现的办法啊
解决方案 »
- 太喜欢delphpi了.可惜一直没时间学
- 请问谁有关于计划类的Grid控件
- splitter问题
- 请问为什么我在程序里将Timer控件的enable设为false,他里面的程序还在继续运行?
- 请问非可视化组件能不能拥有Picture属性
- 有没有那位大师用过这种功能?
- 请教,什么是TRS连接方式,第一次听说Delphi与oracle数据库用这种方式?哪位知道???
- 高手看过来。请问:我用鼠标在image上画了一个矩形,怎样标出它的长和宽?
- 现在学那一种程序语言最实用?提都有分!!(100分大放送)
- 我有五六个问题,实在是结不了分。因为回答不甚满意,没有那种一锤定音的回答。有些遗憾。
- delphi发送stream出现Stream read error
- 请教各位一个语法问题,看看为什么有这个结果?
比如,加密字段是 abc ,计算字段是 xyz ,解密函数为 Decrypt,代码可以这么写:
procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet);
begin
ADOQuery1xyz.AsString:=Decrypt(ADOQuery1abc);
end;然后,感知表格中显示 ADOQuery1xyz 字段的数据。
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.
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.
可以在那个里面处理数据