当前位置:主页>销售管理软件> 列表

三层应用中clientDataSet控件的问题 找管家婆软件下载

库存管理软件版1楼: 客户端有一个DBGrid控件,一个DataSource,SocketConnection,Clientdataset还有一个DBEdit1控件,DBGrid和DBEdit1控件的Datasource都是连到Datasource控件,我现在遇到一个这样的问题就是当我修改DBEdit1中的值后,将鼠标移动其他控件,则修改后的值马上会在DBGrid1中显示,但我想DBEdit1修改后,对其进行加密,在DBGrid反应出的值是加密后的值。[red]我的意思也就是当修改了DBEdit1中的值后,在DBGrid1中显示的值是加密后的事。而更新到数据库的值也应该是加密后的值。[/red]
我只要将鼠标点击其他控件,则DBEdit1中的值就反应到DBGrid1中了。
我试着在DBedit1的事件onExit中加入对其值加密代码也没有用。在ClientDataSet的BeforePost中加入代码也没有用。
不知哪位大侠能指点一下,谢谢!

2楼: 在ClientDataSet中添加所有的表字段,然后找到需要加密字段的Onchange事件,在这个事件中将值加密后再赋值,出现的就是加密后的了。大致方法如下
procedure form1.Field1onchange(Sender:TField,....)
var
tpEvent:TNotifyFieldEvent;
begin
with Sender do
Try
TpEvent:=OnChange;
OnChange:=nil; //加把原来的onChange禁用一下,否则下一句重新赋值会引起多次事件触发


AsString:=Encode(AsString); //加密后重新赋值
Finally
OnChange:=tpEvent;
tpEvent:-nil
end;
end;
以上代码基本正确,但不排除拼写错误 如管家婆软件下载

3楼: 但我的ClientDataSet是动态取数据呀,也就是指定了commandtext值来取数据的。
那如何来取所有字段呢?

4楼: private
{ Private declarations }
Procedure MyOnChange(Sender:TField); //定义一个用于加密数据的过程
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

Procedure TForm1.MyOnChange(Sender:TField);
var tpEvent:TFieldNotifyEvent;
begin
With Sender do
try
tpEvent:=OnChange;
OnChange:=nil;
AsString:=''<''+AsString+''>''; //加密函数
Finally
OnChange:=tpEvent;
tpEvent:=nil;
end;
end;

procedure TForm1.ClientDataSet1AfterOpen(DataSet: TDataSet);


begin //在打开表之后找到那个要加密的字段,然后把过程入口赋值给加密字段
with Self.ClientDataSet1 do
if Assigned(FindField(''Code'')) then
FindField(''Code'').OnChange:=MyOnChange;
end;

以上实际测试过了,在D7 +XP 下通过

5楼: 不要跟我说动态的语句字段名也不知道哦

6楼: 为什么在ClientDataset的BeforePost中加入代码没有用?

库存管理软件版7楼: beforePost只有在记录被POST之前才会执行,此时如要你只改了字段值,但又没POST时(如state 是dsInsert 或者 dsEdit, 可以看表格的分隔栏,看是不是还是"I"样),输入数据就会在未加密前被显示

onChange的执行时机是在数据被改变,从键盘缓冲区进入内存后立即执行的,所以时机上比较好

8楼: 难道我修改了DBEdit1中的值后,再点击其他的控件,没有进行post吗?那为何DBGrid1中显示的是修改后的值?我理解是应该是post之后才会将修改后的数据显示在DBGrid1中呀?
实在愚笨,还请指点,谢谢!

9楼: 接受答案了.