事情是这个样子的
俺在一个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 框架的双向绑定 也有点 数据敏感的 味道。


















