Логин: Пароль:    Регистрация Всеми возможностями сайта можно пользоваться
только после авторизации.
   Забыли пароль?

Поиск
L



Статистика
u
Пользователи онлайн: нет
Гостей онлайн: 9
Всего онлайн: 9
Зарегистрировано юзеров: 7937
Комментариев на сайте: 698
Новый юзер: Micahmum



Последние комментарии
c
Dennisvoifs прокомментировал "Урок 3 - Конструкция IF...THEN...ELSE":
Пункт коммерческого учета цена, Ктп комплектные трансформаторные подстанции москва, Производство ктп москва и не только Вы найдете на нашем специализированном сайте: - Вам к нам!https://sviloguzov.ru/
Arthurneime прокомментировал "Урок 53 - Потоки в Delphi, (часть 1/3)":
[img]https://masterfutures.ru/wp-content/uploads/2020/03/14-2.png[/img] Online trading is becoming increasingly popular, as more people learn of the earning potential of platforms such as Broker, a broker which caters to a significant audience of digital traders (12 million and counting). Known for their excellent user interface, as well as fast deposit and withdrawal times, Broker provides multiple features to help traders earn on the markets. This overview will outline just some of the key aspects traders can expect to enjoy whilst working with Broker broker. Online trading is becoming increasingly popular, as more people learn of the earning potential of platforms such as Broker, a broker which caters to a significant audience of digital traders (12 million and counting). Known for their excellent user interface, as well as fast deposit and withdrawal times, Broker provides multiple features to help traders earn on the markets. This overview will outline just some of the key aspects traders can expect to enjoy whilst working with Broker broker. Broker Broker is operated by a dedicated team, whose main priority has always been to provide the best possible user experience, and ultimately satisfaction. Whether experienced in trading or a newcomer, the platform is easy to use and very responsive. The education section deserves special mention, particularly for assisting traders to learn and implement new strategies – which can be tested on the platforms free demo Source: [url=https://bit.ly/35fv3B6/]Broker[/url] https://bit.ly/35fv3B6/ Tags: Broker

Урок 75 - Создание и использование интерфейса (часть 2/2)

И так, продолжим. Несмотря на то что интерфейс всегда объявляется до объявления использующего его интерфейсного класса и, следовательно, известен компилятору, его методы обязательно должны быть перечислены в объявлении класса. В нашем случае простое указание

type
  TPainter = class(TInterfacedObject, IPaint)
  end;
  
было бы ошибкой: компилятор потребовал бы вставить описание методов CirclePaint и RectPaint. Подобно тому как все классы в Object Pascal порождены от единственного родителя TObject, все интерфейсные классы порождены от общего предка TInterfacedObject. Этот предок умеет распределять память для интерфейсных объектов и использует глобальный интерфейс lunknow:
type
  TInterfacedObject = class(TObject, lUnknown)private
    FRefCount: Integer;
  protected
    function Querylnterface(
      const IID: TGUID; out Obj): Integer; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  public
    property RefCount: Integer read FRefCount;
  end;
  
Если бы в предыдущем примере класс TPainter был описан так:
TPainter = class(IPaint)
  procedure CirclePaint(Canva: TCanvas; X, Y, R: Integer);
  procedure RectPaint(Canva: TCanvas; X1, Y1, X2, Y2: Integer);
end;
компилятор потребовал бы описать недостающие методы Queryinterface, _Add И _Release класса TInterfacedObject. Поле FRef Count этого класса служит счетчиком вызовов интерфейсного объекта и используется по принятой в Windows схеме: при каждом обращении к методу Add интерфейса IUnknow счетчик наращивается на единицу, при каждом обращении к Release - на единицу сбрасывается. Когда значение этого поля становится равно 0, интерфейсный объект уничтожается и освобождается занимаемая им память. Если интерфейс предполагается использовать в технологиях COM/DCOM или CORBA, его методы должны описывать с директивой stdcall или (для объектов Автоматизации) safecall К интерфейсному объекту можно применить оператор приведения типов as, чтобы использовать нужный интерфейс:
procedure PaintObjects(P: TInterfacedObject)
var
  X: IPaint;
begin
  try
    X := P as IPaint;
    X.CirclePaint(PaintBoxl.Canvas, 0, 0, 20)
  except
    ShowMessage('Объект не поддерживает интерфейс IPaint')
  end
end;
Встретив такое присваивание, компилятор создаст код, с помощью которого вызывается метод Queryinterface интерфейса IUnknow с требованием вернуть ссылку на интерфейс IPaint. Если объект не поддерживает указанный интерфейс, возникает исключительная ситуация. Интерфейсы, рассчитанные на использование в удаленных объектах, должны снабжаться глобально-уникальным идентификатором (guiD). Например:
IPaint = interface
  ['{A4AFEB60-7705-11D2-8B41-444553540000}']
  procedure CirclePaint(Canva: TCanvas; X, Y, R: Integer);
  procedure RectPaint(Canva: TCanvas; Xl, Yl, X2, Y2: Integer);
end;
Глобально-уникальные идентификаторы создаются по специальной технологии, гарантирующей ничтожно малую вероятность того, что два guid совпадут. Эта технология включена в Windows 32: чтобы получить guid для вновь созданного интерфейса в среде Delphi, достаточно нажать клавиши Ctrl+Shift+G. Для работы с guid в модуле System объявлены следующие типы:
type
  PGUID = ^TGUID;
  TGUID = record Dl: LongWord;
    D2: Word;
    D3: Word;
    D4: array[0..7] of Byte;
  end;
Программист может объявлять типизированные константы типа tguid, например:
const IID_IPaint: TGUID= ['{A4AFEB61-7705-11D2-8B41-444553540000}'] ; 
Константы guid могут использоваться вместо имен интерфейсов при вызове подпрограмм. Например, два следующих обращения идентичны:
procedure Paint(const IID: TGUID); 

Paint(IPaint) ; 
Paint(IID_Paint); 
С помощью зарезервированного слова implements программист может делегировать какому-либо свойству некоторого класса полномочия интерфейса. Это свойство должно иметь тип интерфейса или класса. Если свойство имеет тип интерфейса, имя этого интерфейса должно указываться в списке родителей класса, как если бы это был интерфейсный класс:
type
  IMylnterface = interface procedure P1; procedure P2;
  end;
  TMyClass = class(TObject, IMylnterface)
    FMyInterface: IMylnterface;
    property Mylnterface: IMylnterface
      read FMyInterface implements IMylnterface;
  end;
Обратите внимание: в этом примере класс TMyciass не является интерфейсным, т. е. классом, в котором исполняются методы p1 и P2. Однако если из него убрать определение уполномоченного свойства Mylnterface, он станет интерфейсным, и в нем должны быть описаны методы интерфейса IMylnterface. Уполномоченное свойство обязательно должно иметь часть read. Если оно имеет тип класса, класс, в котором оно объявлено, не может иметь других уполномоченных свойств.

Удачи!
Встретимся в следующем уроке!


Источник: www.thedelphi.ru
Автор: Савельев Александр
Опубликовано: 9 Августа 2013
Просмотров: 6924

Урок 74 - Создание и использование интерфейса (часть 1/2) Урок 76 - Работа с реестром

Зарегистрируйтесь или авторизуйтесь, чтобы добавлять комментарии.