Добавление Delphi компонента в Гедымин

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
 
(не показаны 15 промежуточных версий 2 участников)
Строка 1: Строка 1:
В платформу Гедымин встроено несколько сотен уже готовых визуальных и невизуальных компонентов. При необходимости можно добавить свои компоненты. Для этого придется взять с сайта исходный код платформы, внести в него изменения и перекомпилировать. Предположим, что у нас есть компонент TMyLabel, наследованный от TLabel. Данный компонент позволяет выводить текст под любым углом и даже обводить его одинарной или двойной рамкой. Компонент расширяет родительский TLabel методом Flash, который на долю секунды отрисовывает текст в инвертированном цвете.
+
В платформу [[Гедымин]] встроено несколько сотен уже готовых визуальных и невизуальных компонентов. При необходимости можно добавить свои компоненты. Для этого придется взять с сайта исходный код платформы, внести в него изменения и перекомпилировать.  
  
 +
Предположим, что у нас есть компонент TMyLabel, наследованный от TLabel. Данный компонент позволяет выводить текст под любым углом и даже обводить его одинарной или двойной рамкой. Компонент расширяет родительский TLabel методом Flash, который на долю секунды отрисовывает текст в инвертированном цвете. Ниже приводится определение соответсвующего класса:
 +
 +
<syntaxhighlight lang="delphi">
 
   type
 
   type
 
     // тип рамки вокруг текста: нет, одинарная или двойная
 
     // тип рамки вокруг текста: нет, одинарная или двойная
Строка 16: Строка 19:
 
     property Angle: Integer read FAngle write FAngle;
 
     property Angle: Integer read FAngle write FAngle;
 
   end;
 
   end;
 +
</syntaxhighlight>
 +
 +
Наша задача: добавить компонент TMyLabel в Гедымин так, чтобы можно было создавать экземпляры из макросов вызовом:
 +
 +
  Designer.CreateObject(Owner, "TMyLabel", name)
 +
 +
а также, чтобы пиктограммка компонента появилась на палитре компонентов в дизайнере экранных форм.
 +
 +
=== Добавление интерфейса в библиотеку типов (TLB) ===
 +
 +
Первым шагом следует открыть из Делфи библиотеку типов gedemin/report/gedemin.tlb и добавить в нее новый интерфейс IgsMyLabel:
 +
 +
http://gsbelarus.com/gs/images/gs/2007/wiki_delphi_comp_1.jpg
 +
 +
Интерфейс следует наполнить необходимыми методами и свойствами:
 +
 +
http://gsbelarus.com/gs/images/gs/2007/wiki_delphi_comp_2.jpg
 +
 +
Далее, следует создать CoClass с именем gs_gsMyLabel и добавить в список поддерживаемых интерфейсов IgsMyLabel:
 +
 +
http://gsbelarus.com/gs/images/gs/2007/wiki_delphi_comp_3.jpg
 +
 +
На этом следует закончить работу с библиотекой типов и сохранить сделанные изменения. В процессе сохранения могут появиться предупреждения, но на них не стоит обращать внимание.
 +
 +
=== Создание класса оболочки ===
 +
 +
Класс-оболочка реализует созданный нами интерфейс. Оболочки стандартных компонент хранятся в модуле gedemin\property\obj_WrapperDelphiClasses.pas. Оболочка для нашего гипотетического класса могла бы выглядеть следующим образом:
 +
 +
<syntaxhighlight lang="delphi">
 +
  TwrpMyLabel = class(TwrpLabel, IgsMyLabel)
 +
  private
 +
    function  GetMyLabel: TMyLabel;
 +
  protected
 +
    function Get_Angle: Integer; safecall;
 +
    procedure Set_Angle(Value: Integer); safecall;
 +
    function Get_BorderStyle: Integer; safecall;
 +
    procedure Set_BorderStyle(Value: Integer); safecall;
 +
    procedure Flash; safecall;
 +
  end;
 +
 +
  ...
 +
 +
  function TwrpMyLabel.GetMyLabel: TMyLabel;
 +
  begin
 +
    Result := GetObject as TMyLabel;
 +
  end;
 +
 +
  function TwrpMyLabel.Get_Angle: Integer;
 +
  begin
 +
    Result := GetObject.Angle;
 +
  end;
 +
 +
  procedure TwrpMyLabel.Set_Angle(Value: Integer);
 +
  begin
 +
    GetMyLabel.Angle := Value;
 +
  end;
 +
 
 +
  function TwrpMyLabel.Get_BorderStyle: Integer;
 +
  begin
 +
    Result := Integer(GetObject.BorderStyle);
 +
  end;
 +
 +
  procedure TwrpMyLabel.Set_BorderStyle(Value: Integer);
 +
  begin
 +
    GetMyLabel.BorderStyle := TBorderStyle(Value);
 +
  end;
 +
 +
  procedure TwrpMyLabel.Flash;
 +
  begin
 +
    GetMyLabel.Flash;
 +
  end;
 +
</syntaxhighlight>
 +
 +
=== Регистрация класса ===
 +
 +
Осталось зарегистрировать класс, чтобы он стал виден из макросов. Соответствующий вызов функции [[RegisterGdcOLEClass]] лучше всего располагать в initialization секции юнита:
 +
 +
<syntaxhighlight lang="delphi">
 +
  RegisterGdcOLEClass(TMyLabel, TwrpMyLabel, ComServer.TypeLib, IID_IgsMyLabel);
 +
</syntaxhighlight>
 +
 +
=== Регистрация компонентов в дизайнере форм ===
 +
 +
Для того, чтобы подключенная нами компонента стала видна на одной из вкладок палитры компонентов в дизайнере форм, следует зайти в юнит dlg_gsResizer_Palette_unit.pas из папки designer и в секции initialization найти вызов процедуры [[RegisterNewClass]] для нужной вкладки и добавить в массив класс -- TMyLabel.
  
Добавим этот компонент в Гедымин.
+
=== Перекомпиляция Гедымина ===
  
=== Добавление интерфейса в библиотеку типов ===
+
Для того, чтобы изменения вступили в силу, следует перекомпилировать модуль gedemin.exe.

Текущая версия на 16:55, 24 февраля 2017

В платформу Гедымин встроено несколько сотен уже готовых визуальных и невизуальных компонентов. При необходимости можно добавить свои компоненты. Для этого придется взять с сайта исходный код платформы, внести в него изменения и перекомпилировать.

Предположим, что у нас есть компонент TMyLabel, наследованный от TLabel. Данный компонент позволяет выводить текст под любым углом и даже обводить его одинарной или двойной рамкой. Компонент расширяет родительский TLabel методом Flash, который на долю секунды отрисовывает текст в инвертированном цвете. Ниже приводится определение соответсвующего класса:

  type
    // тип рамки вокруг текста: нет, одинарная или двойная
    TBorderType = (btNone, btSingle, btDouble);
 
  TMyLabel = class(TLabel)
  private
    FBorderType: TBorderType;
    FAngle: Integer;
 
  published
    procedure Flash;
 
    property BorderType: TBorderType read FBorderType;
    property Angle: Integer read FAngle write FAngle;
  end;

Наша задача: добавить компонент TMyLabel в Гедымин так, чтобы можно было создавать экземпляры из макросов вызовом:

 Designer.CreateObject(Owner, "TMyLabel", name)

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

Содержание

[править] Добавление интерфейса в библиотеку типов (TLB)

Первым шагом следует открыть из Делфи библиотеку типов gedemin/report/gedemin.tlb и добавить в нее новый интерфейс IgsMyLabel:

wiki_delphi_comp_1.jpg

Интерфейс следует наполнить необходимыми методами и свойствами:

wiki_delphi_comp_2.jpg

Далее, следует создать CoClass с именем gs_gsMyLabel и добавить в список поддерживаемых интерфейсов IgsMyLabel:

wiki_delphi_comp_3.jpg

На этом следует закончить работу с библиотекой типов и сохранить сделанные изменения. В процессе сохранения могут появиться предупреждения, но на них не стоит обращать внимание.

[править] Создание класса оболочки

Класс-оболочка реализует созданный нами интерфейс. Оболочки стандартных компонент хранятся в модуле gedemin\property\obj_WrapperDelphiClasses.pas. Оболочка для нашего гипотетического класса могла бы выглядеть следующим образом:

  TwrpMyLabel = class(TwrpLabel, IgsMyLabel)
  private
    function  GetMyLabel: TMyLabel;
  protected
    function Get_Angle: Integer; safecall;
    procedure Set_Angle(Value: Integer); safecall;
    function Get_BorderStyle: Integer; safecall;
    procedure Set_BorderStyle(Value: Integer); safecall;
    procedure Flash; safecall;
  end;
 
  ...
 
  function TwrpMyLabel.GetMyLabel: TMyLabel;
  begin
    Result := GetObject as TMyLabel;
  end;
 
  function TwrpMyLabel.Get_Angle: Integer;
  begin
    Result := GetObject.Angle;
  end;
 
  procedure TwrpMyLabel.Set_Angle(Value: Integer);
  begin
    GetMyLabel.Angle := Value;
  end;
 
  function TwrpMyLabel.Get_BorderStyle: Integer;
  begin
    Result := Integer(GetObject.BorderStyle);
  end;
 
  procedure TwrpMyLabel.Set_BorderStyle(Value: Integer);
  begin
    GetMyLabel.BorderStyle := TBorderStyle(Value);
  end;
 
  procedure TwrpMyLabel.Flash;
  begin
    GetMyLabel.Flash;
  end;

[править] Регистрация класса

Осталось зарегистрировать класс, чтобы он стал виден из макросов. Соответствующий вызов функции RegisterGdcOLEClass лучше всего располагать в initialization секции юнита:

  RegisterGdcOLEClass(TMyLabel, TwrpMyLabel, ComServer.TypeLib, IID_IgsMyLabel);

[править] Регистрация компонентов в дизайнере форм

Для того, чтобы подключенная нами компонента стала видна на одной из вкладок палитры компонентов в дизайнере форм, следует зайти в юнит dlg_gsResizer_Palette_unit.pas из папки designer и в секции initialization найти вызов процедуры RegisterNewClass для нужной вкладки и добавить в массив класс -- TMyLabel.

[править] Перекомпиляция Гедымина

Для того, чтобы изменения вступили в силу, следует перекомпилировать модуль gedemin.exe.

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты