三层应用中clientDataSet控件的问题(20分)

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
客户端有一个DBGrid控件,一个DataSource,SocketConnection,Clientdataset还有一个DBEdit1控件,DBGrid和DBEdit1控件的Datasource都是连到Datasource控件,我现在遇到一个这样的问题就是当我修改DBEdit1中的值后,将鼠标移动其他控件,则修改后的值马上会在DBGrid1中显示,但我想DBEdit1修改后,对其进行加密,在DBGrid反应出的值是加密后的值。[red]我的意思也就是当修改了DBEdit1中的值后,在DBGrid1中显示的值是加密后的事。而更新到数据库的值也应该是加密后的值。[/red]
我只要将鼠标点击其他控件,则DBEdit1中的值就反应到DBGrid1中了。
我试着在DBedit1的事件onExit中加入对其值加密代码也没有用。在ClientDataSet的BeforePost中加入代码也没有用。
不知哪位大侠能指点一下,谢谢!
 
在ClientDataSet中添加所有的表字段,然后找到需要加密字段的Onchange事件,在这个事件中将值加密后再赋值,出现的就是加密后的了。大致方法如下
procedure form1.Field1onchange(Sender:TField,....)
var
tpEvent:TNotifyFieldEvent;
begin
with Senderdo
Try
TpEvent:=OnChange;
OnChange:=nil;
//加把原来的onChange禁用一下,否则下一句重新赋值会引起多次事件触发
AsString:=Encode(AsString);
//加密后重新赋值
Finally
OnChange:=tpEvent;
tpEvent:-nil
end;
end;
以上代码基本正确,但不排除拼写错误
 
但我的ClientDataSet是动态取数据呀,也就是指定了commandtext值来取数据的。
那如何来取所有字段呢?
 
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 Senderdo
try
tpEvent:=OnChange;
OnChange:=nil;
AsString:='<'+AsString+'>';
//加密函数
Finally
OnChange:=tpEvent;
tpEvent:=nil;
end;
end;

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

以上实际测试过了,在D7 +XP 下通过
 
不要跟我说动态的语句字段名也不知道哦
 
为什么在ClientDataset的BeforePost中加入代码没有用?
 
beforePost只有在记录被POST之前才会执行,此时如要你只改了字段值,但又没POST时(如state 是dsInsert 或者 dsEdit, 可以看表格的分隔栏,看是不是还是&quot;I&quot;样),输入数据就会在未加密前被显示
onChange的执行时机是在数据被改变,从键盘缓冲区进入内存后立即执行的,所以时机上比较好
 
难道我修改了DBEdit1中的值后,再点击其他的控件,没有进行post吗?那为何DBGrid1中显示的是修改后的值?我理解是应该是post之后才会将修改后的数据显示在DBGrid1中呀?
实在愚笨,还请指点,谢谢!
 
接受答案了.
 
后退
顶部