我有DataSource1 (TDataSource)
,并且有一些DB-Aware控件链接到它(通过SomeDBControl.DataSource=DataSource1
)
如何在代码中找出(枚举)哪些控件链接到给定的TDataSource?
答案 0 :(得分:2)
下面的代码使用RTTI,在D7中为我工作,通过递归搜索容器对象(即表单及其组件)来列出具有DataSource或MasterSource属性的组件。
(显然,你可以对你感兴趣的任何其他表格/数据模块做类似的事情)
更新#1:此答案的原始版本生成了表单上每个组件的列表以及其DataSource / MasterSource的名称(如果有)。我已经改变它以提供与你在q的身体中提出的更好的匹配。
更新#2:这修复了Update#1版本中的一些漏洞,并以一种避免在检查没有的组件时生成异常的方式重新实现HasDataSource函数一个DataSource / MasterSource属性。
function HasDataSource(AComponent : TComponent; var ADataSource : TDataSource) : Boolean;
function GetDataSource(APropName : String) : TDataSource;
var
AObject : TObject;
PInfo : PPropInfo;
begin
Result := Nil;
PInfo := GetPropInfo(AComponent, APropName);
if PInfo = Nil then
exit;
AObject := GetObjectProp(AComponent, PInfo);
Result := TDataSource(AObject);
end;
begin
Result := False;
ADataSource := GetDataSource('DataSource');
if ADataSource <> Nil then
Result := True;
if Result then exit;
ADataSource := GetDataSource('MasterSource');
if ADataSource <> Nil then
Result := True;
end;
procedure TForm1.Log(Msg: String);
begin
Memo1.Lines.Add(Msg);
end;
procedure TForm1.FindDataSourceObjects(AContainer : TComponent);
var
i : Integer;
ADataSource : TDataSource;
procedure LogDataSourceName(AContainer : TComponent);
begin
Log(AContainer.Name + ' Datasource: ' + ADataSource.Name);
end;
begin
if HasDataSource(AContainer, ADataSource) then
LogDataSourceName(AContainer);
for i := 0 to AContainer.ComponentCount - 1 do begin
FindDataSourceObjects(AContainer.Components[i]);
end;
end;
procedure TForm1.btnFindClick(Sender: TObject);
begin
FindDataSourceObjects(Self);
end;
我的表单的DFM是
object Form1: TForm1
Left = 195
Top = 124
Width = 623
Height = 303
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object DBText1: TDBText
Left = 307
Top = 56
Width = 65
Height = 17
DataSource = DataSource1
end
object Panel1: TPanel
Left = 307
Top = 80
Width = 281
Height = 161
Caption = 'Panel1'
TabOrder = 0
object DBText2: TDBText
Left = 24
Top = 64
Width = 65
Height = 17
DataSource = DataSource2
end
end
object Memo1: TMemo
Left = 8
Top = 16
Width = 281
Height = 225
TabOrder = 1
end
object btnFind: TButton
Left = 307
Top = 16
Width = 75
Height = 25
Caption = 'Find'
TabOrder = 2
OnClick = btnFindClick
end
object DataSource1: TDataSource
DataSet = ClientDataSet1
Left = 448
Top = 16
end
object DataSource2: TDataSource
DataSet = ClientDataSet2
Left = 544
Top = 16
end
object ClientDataSet1: TClientDataSet
Aggregates = <>
Params = <>
Left = 408
Top = 16
end
object ClientDataSet2: TClientDataSet
Aggregates = <>
MasterSource = DataSource1
PacketRecords = 0
Params = <>
Left = 496
Top = 16
end
end