事情是这个样子的
俺在一个C# 群里,一个问:"打开form2,可以同步显示form1的表格内容,在form2增删改表格内容之后,可以同步到form1中"。 俺 打开 delphi 放了几个 数据敏感 控件,演示了一下。还说了 一行代码都不用写。
先看视频
实现的功能:在四个窗体里进行数据的 增、删、改,数据能够自动同步显示。行位置、编辑状态等也同步显示。随便在那个窗体进行操作都可以,其他3个窗体的数据和显示会自动同步。
一种数据敏感的处理
我们来分析代码
其实没啥好分析的。窗体的代码里只是 多开了3同样的窗体。
procedure TForm1.FormActivate(Sender: TObject);
begin
if Form2 <> nil then
exit; Form2 := TForm1.Create(Application);
Form2.Left := Form1.Width + 3;
Form2.Show();
Form3 := TForm1.Create(Application);
Form3.top := Form1.height + 3;
Form3.Show();
Form4 := TForm1.Create(Application);
Form4.top := Form1.height + 3;
Form4.Left := Form1.Width + 3;
Form4.Show();
end;
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.ExtCtrls, Vcl.DBCtrls,
Vcl.Grids, Vcl.DBGrids, Unit_dm;
type
TForm1 = class(TForm)
Panel1: TPanel;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Form2: TForm1;
Form3: TForm1;
Form4: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormActivate(Sender: TObject);
begin
if Form2 <> nil then
exit;
Form2 := TForm1.Create(Application);
Form2.Left := Form1.Width + 3;
Form2.Show();
Form3 := TForm1.Create(Application);
Form3.top := Form1.height + 3;
Form3.Show();
Form4 := TForm1.Create(Application);
Form4.top := Form1.height + 3;
Form4.Left := Form1.Width + 3;
Form4.Show();
end;
end.
用不同的窗体也可以,只要数据源指向同一个。指向了同一个数据源之后,每个表格就可以自动同步数据和显示。
我们再看 数据源,数据源更简单,就一行代码 ADODataSet1.CreateDataSet; 执行这行代码创建数据集。
unit Unit_dm;
interface
uses
System.SysUtils, System.Classes, Data.DB, Data.Win.ADODB;
type
TDataModule1 = class(TDataModule)
ADODataSet1: TADODataSet;
ADODataSet1ID: TStringField;
ADODataSet1名称: TStringField;
ADODataSet1备注: TStringField;
DataSource1: TDataSource;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
DataModule1: TDataModule1;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
ADODataSet1.CreateDataSet;
end;
end.
综上所述
这种 数据敏感 的写法,在2000年左右特别流行,差不多是25年前了。现在已经很少看到这种写法了。当然现在也还有很多 数据敏感的 控件,其实很多JS 框架的双向绑定 也有点 数据敏感的 味道。