Добавление Delphi компонента в Гедымин
SYSDBA (обсуждение | вклад) |
SYSDBA (обсуждение | вклад) |
||
| (не показаны 5 промежуточных версий 2 участников) | |||
| Строка 3: | Строка 3: | ||
Предположим, что у нас есть компонент TMyLabel, наследованный от TLabel. Данный компонент позволяет выводить текст под любым углом и даже обводить его одинарной или двойной рамкой. Компонент расширяет родительский TLabel методом Flash, который на долю секунды отрисовывает текст в инвертированном цвете. Ниже приводится определение соответсвующего класса: | Предположим, что у нас есть компонент TMyLabel, наследованный от TLabel. Данный компонент позволяет выводить текст под любым углом и даже обводить его одинарной или двойной рамкой. Компонент расширяет родительский TLabel методом Flash, который на долю секунды отрисовывает текст в инвертированном цвете. Ниже приводится определение соответсвующего класса: | ||
| + | <syntaxhighlight lang="delphi"> | ||
type | type | ||
// тип рамки вокруг текста: нет, одинарная или двойная | // тип рамки вокруг текста: нет, одинарная или двойная | ||
| Строка 18: | Строка 19: | ||
property Angle: Integer read FAngle write FAngle; | property Angle: Integer read FAngle write FAngle; | ||
end; | end; | ||
| + | </syntaxhighlight> | ||
Наша задача: добавить компонент TMyLabel в Гедымин так, чтобы можно было создавать экземпляры из макросов вызовом: | Наша задача: добавить компонент TMyLabel в Гедымин так, чтобы можно было создавать экземпляры из макросов вызовом: | ||
| Строка 25: | Строка 27: | ||
а также, чтобы пиктограммка компонента появилась на палитре компонентов в дизайнере экранных форм. | а также, чтобы пиктограммка компонента появилась на палитре компонентов в дизайнере экранных форм. | ||
| − | === Добавление интерфейса в библиотеку типов === | + | === Добавление интерфейса в библиотеку типов (TLB) === |
Первым шагом следует открыть из Делфи библиотеку типов gedemin/report/gedemin.tlb и добавить в нее новый интерфейс IgsMyLabel: | Первым шагом следует открыть из Делфи библиотеку типов gedemin/report/gedemin.tlb и добавить в нее новый интерфейс IgsMyLabel: | ||
| Строка 43: | Строка 45: | ||
=== Создание класса оболочки === | === Создание класса оболочки === | ||
| − | Класс-оболочка реализует созданный нами интерфейс. | + | Класс-оболочка реализует созданный нами интерфейс. Оболочки стандартных компонент хранятся в модуле gedemin\property\obj_WrapperDelphiClasses.pas. Оболочка для нашего гипотетического класса могла бы выглядеть следующим образом: |
| + | <syntaxhighlight lang="delphi"> | ||
TwrpMyLabel = class(TwrpLabel, IgsMyLabel) | TwrpMyLabel = class(TwrpLabel, IgsMyLabel) | ||
private | private | ||
| Строка 87: | Строка 90: | ||
GetMyLabel.Flash; | GetMyLabel.Flash; | ||
end; | end; | ||
| + | </syntaxhighlight> | ||
=== Регистрация класса === | === Регистрация класса === | ||
| Строка 92: | Строка 96: | ||
Осталось зарегистрировать класс, чтобы он стал виден из макросов. Соответствующий вызов функции [[RegisterGdcOLEClass]] лучше всего располагать в initialization секции юнита: | Осталось зарегистрировать класс, чтобы он стал виден из макросов. Соответствующий вызов функции [[RegisterGdcOLEClass]] лучше всего располагать в initialization секции юнита: | ||
| + | <syntaxhighlight lang="delphi"> | ||
RegisterGdcOLEClass(TMyLabel, TwrpMyLabel, ComServer.TypeLib, IID_IgsMyLabel); | RegisterGdcOLEClass(TMyLabel, TwrpMyLabel, ComServer.TypeLib, IID_IgsMyLabel); | ||
| + | </syntaxhighlight> | ||
=== Регистрация компонентов в дизайнере форм === | === Регистрация компонентов в дизайнере форм === | ||
Текущая версия на 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:
Интерфейс следует наполнить необходимыми методами и свойствами:
Далее, следует создать CoClass с именем gs_gsMyLabel и добавить в список поддерживаемых интерфейсов IgsMyLabel:
На этом следует закончить работу с библиотекой типов и сохранить сделанные изменения. В процессе сохранения могут появиться предупреждения, но на них не стоит обращать внимание.
[править] Создание класса оболочки
Класс-оболочка реализует созданный нами интерфейс. Оболочки стандартных компонент хранятся в модуле 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.