我正在使用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这样的东西,但我不知道组件是否可能。
感谢。
答案 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;