熟悉VCL开发的朋友:DBEdit(DBImage...)和DBGrig上数据如何进行同步的?(100分)

  • 主题发起人 主题发起人 greenbamboo
  • 开始时间 开始时间
G

greenbamboo

Unregistered / Unconfirmed
GUEST, unregistred user!
更正:后面应为 DBGrid.
 
DELPHI里面有一个控件Datalink,为数据敏感控件的列表,在进行数据更新时,对datalink上的每一个控件进行更新,就可以实现同步。
 
能告说我具体的流程吗,我看了好久还没看懂他们那些函数是怎么调用的。
对了对于DBEdit还有一个FieldDataLink感应类的。
谢谢。详细点。
 
假如现在是用DBGrid---DataLink---DataSource....Table 连起来得,
现在我更改Table 的TableName,他会经过一系列的刷新,到DBGrid上数据也刷新了。
请问:他们各个控件之间是如何通信或回调的?(一个即可)
(我现在通过找窗体上的控件,给他发消息,来实现同步和更新的)
 
delphi同时使用datasource和datalink对象进行双向交流:数据集合使用连接通知与数据相关控件可以得到新数据;
与数据相关控件使用边接请求字段当前值或更新它,并通知数据集全有关此事件。
有本书《delphi高级开发指南》上有讲解,我没找到电子版,没法拷给你的。
 
dbgrid是一个比较复杂的控件,它主要是包括多条记录,下面以dbedit为例:
创建:
constructor TDBEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
inherited ReadOnly := True;
ControlStyle := ControlStyle + [csReplicatable];
FDataLink := TFieldDataLink.Create;
FDataLink.Control := Self;
FDataLink.OnDataChange := DataChange;
FDataLink.OnEditingChange := EditingChange;
FDataLink.OnUpdateData := UpdateData;
FDataLink.OnActiveChange := ActiveChange;
end;
建立datalink,并赋于不同的事件。

在dbedit的keydown等事件触发后,也会引起datalink状态修改。
内容修改时调用datalink发出通知:
procedure TDBEdit.Change;
begin
FDataLink.Modified;
inherited Change;
end;

别的控件修改后,通过datalink收到消息,并处理,如下:
procedure TDBEdit.DataChange(Sender: TObject);
begin
if FDataLink.Field <> nil then
begin
if FAlignment <> FDataLink.Field.Alignment then
begin
EditText := ''; {forces update}
FAlignment := FDataLink.Field.Alignment;
end;
EditMask := FDataLink.Field.EditMask;
if not (csDesigning in ComponentState) then
begin
if (FDataLink.Field.DataType in [ftString, ftWideString]) and (MaxLength = 0) then
MaxLength := FDataLink.Field.Size;
end;
if FFocused and FDataLink.CanModify then
Text := FDataLink.Field.Text
else
begin
EditText := FDataLink.Field.DisplayText;
if FDataLink.Editing and FDataLink.FModified then
Modified := True;
end;
end else
begin
FAlignment := taLeftJustify;
EditMask := '';
if csDesigning in ComponentState then
EditText := Name else
EditText := '';
end;
end;


 
就是要定为数据记录指针
 
后退
顶部