1 function TCommandEnabledController.GetCommandVisible(const ACommandName: string): Boolean; 2 var 3 I: Integer; 4 //定义接口接收者 5 oCommandVisibleExecutor: ICommandVisibleExecutor; 6 begin 7 Result := True; 8 for I := 0 to FExecutors.Count - 1 do 9 begin 10 //判断接口是否支持 11 if Supports(FExecutors[I], ICommandVisibleExecutor, oCommandVisibleExecutor) then 12 begin 13 //使用接口接收者 14 if not oCommandVisibleExecutor.CommandVisible(ACommandName) then 15 begin 16 Result := False; 17 Break; 18 end; 19 end; 20 end; 21 end;
delphi中的函数Supports位于SysUtils单元
定义如下:
1 { Interface support routines } 2 3 function Supports(const Instance: IInterface; const IID: TGUID; out Intf): Boolean; overload; 4 function Supports(const Instance: TObject; const IID: TGUID; out Intf): Boolean; overload; 5 function Supports(const Instance: IInterface; const IID: TGUID): Boolean; overload; 6 function Supports(const Instance: TObject; const IID: TGUID): Boolean; overload; 7 function Supports(const AClass: TClass; const IID: TGUID): Boolean; overload;
实现如下:
1 { Interface support routines } 2 3 function Supports(const Instance: IInterface; const IID: TGUID; out Intf): Boolean; 4 begin 5 Result := (Instance <> nil) and (Instance.QueryInterface(IID, Intf) = 0); 6 end; 7 8 function Supports(const Instance: TObject; const IID: TGUID; out Intf): Boolean; 9 var 10 LUnknown: IUnknown; 11 begin 12 Result := (Instance <> nil) and 13 ((Instance.GetInterface(IUnknown, LUnknown) and Supports(LUnknown, IID, Intf)) or 14 Instance.GetInterface(IID, Intf)); 15 end; 16 17 function Supports(const Instance: IInterface; const IID: TGUID): Boolean; 18 var 19 Temp: IInterface; 20 begin 21 Result := Supports(Instance, IID, Temp); 22 end; 23 24 function Supports(const Instance: TObject; const IID: TGUID): Boolean; 25 var 26 Temp: IInterface; 27 begin 28 Result := Supports(Instance, IID, Temp); 29 end; 30 31 function Supports(const AClass: TClass; const IID: TGUID): Boolean; 32 begin 33 Result := AClass.GetInterfaceEntry(IID) <> nil; 34 end;