2015-06-04 17 views
3

В чем разница между двумя строками кода. Оба пытаются получить путь, а один работает, а другой бросает ошибку. я работаю над Delphi-7TypeCasting: какая разница между двумя строками кода?

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; 
+0

Возможный дубликат [В чем разница между использованием каста с использованием (Object as TClass) и TClass (Object)] (http://stackoverflow.com/questions/2449790/whats-the-difference-between-casting-using-object -as-tclass-and-tclassobject) – fantaghirocco

+5

@fantaghirocco Это не обман, потому что это интерфейсы –

ответ

8
IDesigner(TForm(FFormOwner).Designer) 

Это выполняет простой Переинтерпретация бросок Designer. Он не сработает, потому что Designer имеет тип IDesignerHook, который не совпадает с IDesigner.

(FFormOwner as TForm).Designer) as IDesigner 

Это выполняет запрос для выполнения IDesigner и решается с помощью вызова QueryInterface. Это правильный способ получить другой интерфейс от существующего.