TypeCasting:下面两行代码有什么区别?

时间:2015-06-04 07:40:58

标签: delphi delphi-7

以下2行代码之间的区别是什么。两者都试图获得路径,一个正在运行,另一个正在抛出错误。我正在研究Delphi-7

Path:= (((FFormOwner as TForm).Designer) as IDesigner).GetPrivateDirectory; --Working
Path:= IDesigner(TForm(FFormOwner).Designer).GetPrivateDirectory ;  --Error

下面是使用代码行来获取路径的代码。

constructor TsampleComponent.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FFormOwner:=TForm(Owner);
  if not (Owner is TForm) then
    repeat
      FFormOwner:=TForm(FFormOwner.Owner);
    until (FFormOwner is TForm) or (FFormOwner.Owner=nil);

  if (csDesigning in ComponentState) then
    Path:= (((FFormOwner as TForm).Designer) as IDesigner).GetPrivateDirectory
  else
    Path:=ExtractFilePath(Application.EXEName);
.
.

end;

1 个答案:

答案 0 :(得分:8)

IDesigner(TForm(FFormOwner).Designer)

这会执行Designer的简单重新解释。它会失败,因为Designer类型为IDesignerHook,与IDesigner不同。

(FFormOwner as TForm).Designer) as IDesigner

这会为IDesigner执行运行时查询,并通过调用QueryInterface解决。这是从现有接口获取不同接口的正确方法。