Я нашел, что использование любой из следующих опций работает:
SET DEF OFF
или
SET SCAN OFF
я не знаю достаточно о базах данных, чтобы знать, являетесь ли Вы лучше или "более правильными", чем другой. Кроме того, если существует что-то лучше, чем любой из них, сообщите мне.
У меня работает.
Суть заключается в получении родительского TypeInfo из переданного дочернего TypeInfo
procedure InheritanceLevel(AClassInfo: PTypeInfo; const AProperty: string; var level: Integer);
var
propInfo: PPropInfo;
propCount: Integer;
propList: PPropList;
ix: Integer;
begin
if not Assigned(AClassInfo) then Exit;
propCount := GetPropList(AClassInfo, propList);
for ix := 0 to propCount - 1 do
begin
propInfo := propList^[ix];
if propInfo^.Name = AProperty then
begin
Inc(level);
InheritanceLevel(GetTypeData(AClassInfo).ParentInfo^, AProperty, level)
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
level: Integer;
begin
level := 0;
InheritanceLevel(PTypeInfo(TForm.ClassInfo), 'Tag', level);
end;
Я не знаю, сможете ли вы найти это с помощью RTTI, доступного в Delphi 2007. Большинство свойств в дереве TComponent объявлены как protected в исходном классе, и затем повторно объявлено как опубликовано ниже, и у вас есть только RTTI для опубликованных участников.
Я был прав, когда собирался описать нечто очень похожее на решение Ливена, когда увидел, что он меня опередил. Он найдет первый класс, в котором свойство было опубликовано, если это то, что вы ищете, но не найдет, где свойство было изначально объявлено. Если вам нужно, вам понадобится расширенный RTTI Delphi 2010.