Используя RTTI, можно получить значение для любого свойства.В приведенном ниже примере возвращается значение свойства TableName
, если оно есть.Я убедился, что код работает в небольшом проекте.
Основным преимуществом будет то, что он работает с любым производным классом TDataset
, который имеет свойство TableName
.(например, TTable
, но также TSQLTable
или TFDTable
)
....
uses DB,rtti;
function GetTableNameFromDataset(aDataset:TDataset):string;
VAR lTableNameProp:TRttiProperty;
lContext:TRttiContext;
begin
Result:='';
if Assigned(aDataset) then
begin
lContext.Create;
try
lTableNameProp:=lContext.GetType(aDataset.ClassInfo).GetProperty('TableName');
if Assigned(lTableNameProp) then
Result:=lTableNameProp.GetValue(aDataset).AsString;
finally
lContext.Free;
end;
end;
end;
....
Или альтернативное решение с использованием модуля typinfo старого стиля (проверено на RS 10.3, но я ожидаю, что оно будет работать на D7а также)
...
uses DB,typinfo;
function GetTableNameFromDataset(aDataset:TDataset):string;
VAR lPropInfo:PpropInfo;
begin
Result:='';
if Assigned(aDataset) then
begin
lPropInfo:=GetPropInfo(aDataset.ClassInfo,'TableName');
if Assigned(lPropInfo) then
Result:=GetPropValue(aDataset,lPropInfo);
end;
end;
...