Delphi - Visual Form继承 - 组件基础classe检测

时间:2011-01-17 13:14:05

标签: delphi rtti

我正在使用VFI(Visual Form Inheritance),我需要检查实例化表单的组件是属于formclass还是属于表单超类。

任何想法?

  unit1

  TFormStatus = class(TForm)
    cpPanel: TPanel;
    lblStatus: TLabel;
  end;

  unit 2

  TFormCodigo = class(TFormStatus)
    lblCodigo: TLabel;
  end;

  frmCodigo: TFormCodigo:

在frmCodigo的任何情况下,我想检测lblCodigo是TFormCodigo的本地,cpPanel / lblStatus是继承的组件;

  for i:=0 to Self.ComponentCount-1 do begin        
      if "InheritedComponent" (Self.Components[i]) then ...
  end;

对于对象属性,可以使用RTTI这样的东西,但我不知道组件是否可能。

感谢。

3 个答案:

答案 0 :(得分:1)

如果我理解正确,你需要TRttiMember.Parent。例如,请看Rob Love的这个article。您需要Delphi 2010或更高版本。

实际上这只是excellent series of articles的一部分 - 这些文章还会告诉你如何掌握字段,属性等,而不必知道他们的名字。

答案 1 :(得分:0)

也许像“傻瓜”这样的东西

function TFormStatus.IsStatusComponent(AComponent: TComponent): Boolean;
begin
  Result := (AComponent = cpPanel) or (AComponent = lblStatus);
end;

已满足您的需求?

答案 2 :(得分:0)

在TFormCordigo中,您可以覆盖每次为特定表单读取资源时调用的ReadState方法。继承的名为ComponentCount后,包含创建到当前层次结构成员的组件数,因此毕竟您有可以保存在其他位置的组件的边框列表。

下面的代码说明了这种方法

procedure TInhTestForm.Button3Click(Sender: TObject);
var
  i: integer;
begin
  inherited;

  Memo1.Lines.Clear;
  for i:=0 to ComponentCount-1 do
  begin
    Memo1.Lines.Add(format('%s inroduced in %s', [Components[i].Name, ComponentParent(i).ClassName]));
  end;
end;

function TInhTestForm.ComponentParent(Index: integer): TClass;
var
  i, j: integer;
begin
  Result:=Nil;
  for i:=Low(fComponentBorders) to High(fComponentBorders) do
  begin
    if Index <= fComponentBorders[i] - 1 then
    begin
      j:=i;
      Result:=Self.ClassType;
      while j < High(fComponentBorders) do
      begin
        Result:=Result.ClassParent;
        Inc(j);
      end;
      break;
    end;
  end;
end;

procedure TInhTestForm.ReadState(Reader: TReader);
begin
  inherited;
  SetLength(fComponentBorders, Length(fComponentBorders) + 1);
  fComponentBorders[High(fComponentBorders)]:=ComponentCount;
end;