Обнаружение класса, где свойство сначала публикуется с несколькими уровнями наследования

Я нашел, что использование любой из следующих опций работает:

SET DEF OFF

или

SET SCAN OFF

я не знаю достаточно о базах данных, чтобы знать, являетесь ли Вы лучше или "более правильными", чем другой. Кроме того, если существует что-то лучше, чем любой из них, сообщите мне.

7
задан Daniel Daranas 2 August 2013 в 16:52
поделиться

2 ответа

У меня работает.
Суть заключается в получении родительского 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;
4
ответ дан 7 December 2019 в 10:04
поделиться

Я не знаю, сможете ли вы найти это с помощью RTTI, доступного в Delphi 2007. Большинство свойств в дереве TComponent объявлены как protected в исходном классе, и затем повторно объявлено как опубликовано ниже, и у вас есть только RTTI для опубликованных участников.

Я был прав, когда собирался описать нечто очень похожее на решение Ливена, когда увидел, что он меня опередил. Он найдет первый класс, в котором свойство было опубликовано, если это то, что вы ищете, но не найдет, где свойство было изначально объявлено. Если вам нужно, вам понадобится расширенный RTTI Delphi 2010.

2
ответ дан 7 December 2019 в 10:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: