Delphi и COM


         

Интерфейсы и TComponent


В базовом классе VCL TComponent имеется полный набор методов, позволяющих реализовать интерфейс IUnknown, хотя сам класс данный интерфейс не реализует. Это позволяет наследникам TComponent реализовывать интерфейсы, не заботясь о реализации IUnknown. Однако методы TComponent._AddRef и TComponent._Release на этапе выполнения программы не реализуют механизм подсчета ссылок, и, следовательно, для классов-наследников TComponent, реализующих интерфейсы, не действует автоматическое управление памятью. Это позволяет запрашивать у них интерфейсы, не опасаясь, что объект будет удален из памяти при выходе переменной за область видимости. Таким образом, следующий код совершенно корректен и безопасен:

type IGetData = interface   ['{B5266AE0-5E77-11D4-84DD-9153115ABFC3}']     function GetData: String;   end;     TForm1 = class(TForm, IGetData)   private     function GetData: String;   end;   …   var   I: Integer;   GD: IGetData;   S: String; begin   S := '';   for I := 0 to Pred(Screen.FormCount) do begin     if Screen.Forms[I].GetInterface(IGetData, GD) then       S := S + GD.GetData + #13;   end;   ShowMessage(S); end;

Этот код проверяет наличие у всех форм в приложении возможности реализации интерфейса IGetData и в случае, если форма реализует этот интерфейс, вызывает его метод.



Содержание раздела