gpt4 book ai didi

delphi:icontent的目的是什么?

转载 作者:行者123 更新时间:2023-12-03 15:51:39 27 4
gpt4 key购买 nike

icontent 的具体用途是什么?我知道它在 TContent 中使用,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;

最佳答案

IContentinterfaceTContent

TContent = class(TControl, IContent)

这只是为您提供对控件内容的访问。
因为它是一个正在传递的接口(interface),所以您只能访问 IContent 公开的方法,而不能访问其他任何内容。

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

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

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

您可以阅读the purpose of interfaces in Wikipedia

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

关于delphi:icontent的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39086792/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com