delphi:icontent的目的是什么?

时间:2016-08-22 18:53:59

标签: delphi firemonkey

icontent的目的究竟是什么?我知道它在TContent中使用,它是滚动条的所有控件的容器(例如),但我真的不明白为什么要使用它?它的目的是什么?什么时候使用它而不使用它?

我在delphi源代码中看到这些函数使用了icontent但是不明白它会为滚动条改变什么(例如)

function TControl.GetAbsoluteClipRect: TRectF;
var
  R: TRectF;
  LControl: TControl;
  LContent: IContent;
begin
  Result := TRectF.Empty;
  R := AbsoluteRect;
  if (Root = nil) or not (Root.GetObject is TCommonCustomForm and IntersectRect(R, R,
    TCommonCustomForm(Root.GetObject).ClientRect)) then
  begin
    LControl := ParentControl;
    while LControl <> nil do
    begin
      if LControl.ClipChildren and not (LControl.GetInterface(IContent, LContent) or IntersectRect(R, R,
        LControl.AbsoluteRect)) then
        Exit;
      LControl := LControl.ParentControl;
    end;
    Result := R;
  end;
end;


procedure TFmxObject.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
  I, J: Integer;
  Content: IContent;
begin
  inherited;
  if Supports(Self, IContent) then
    Exit;
  if FChildren <> nil then
    for I := 0 to FChildren.Count - 1 do
    begin
      if Supports(FChildren[I], IContent, Content) and (Content.ChildrenCount > 0) then
      begin
        for J := 0 to Content.ChildrenCount - 1 do
          if Content.GetObject.Children[J].Stored then
            Proc(Content.GetObject.Children[J]);
      end;
      if FChildren[I].Stored then
        Proc(FChildren[I]);
    end;
end;


function TFmxObject.GetParentComponent: TComponent;
var
  Content: IContent;
begin
  if (FParent <> nil) and Supports(FParent, IContent, Content) then
    Result := Content.Parent
  else
    Result := FParent;
  if (Result = nil) and (FRoot <> nil) then
    Result := FRoot.GetObject;
end;

1 个答案:

答案 0 :(得分:4)

IContentinterfaceTContent

  

TContent = class(TControl, IContent)

这只是让您访问控件的内容 因为它是一个被传递的界面,所以您只能访问IContent公开的方法,而不能访问任何其他方法。

以下是IContent提供的方法列表:http://docwiki.embarcadero.com/Libraries/Seattle/en/FMX.Types.IContent_Methods

这是TControl提供的方法的子集 如果FMX传递TControl,它会给你太多的访问权限。

接口在FMX中大量使用,但在VCL中很少使用 这是因为VCL早于Delphi 3中接口的引入。

您可以阅读the purpose of interfaces in Wikipedia

您的示例
在显示的代码中,GetChildern枚举控件中包含的所有子控件,并将对这些子项的引用传递给用户提供的函数。
Parent相同,但控件只能有一个父级,因此不需要枚举。