Создание компонент в DELPHI

Перед созданием своего компонента нужно выбрать для него предка. Кто же может быть предком для вашего компонента?

Как правило, используются в виде предков TComponent, TControl, TWinControl, TGraphicControl, TCustomXXXXXX, а также все компоненты палитры компонентов.
Возьмем для примера компонент TOpenDialog, который находится на странице Dialogs палитры компонентов. Он хорошо справляется со своей задачей, но у него есть одно маленькое неудобство. Каждый раз, когда его используешь необходимо каждый раз изменять значение свойства Options. И причем это, как правило, одни и те же действия.
OpenDialog1.Options := OpenDialog1.Options + [ofFileMustExist, ofPathMustExist];

чтобы файл, который мы пытаемся открыть с помощью этого диалогового окна, действительно существовал на диске.
Задание для себя мы уже выбрали, осталось за малым - создать компонент. Заготовку для компонента создаем, выбирая из меню команду Component/New Component... и в диалоговом окне выбираем
Ancestor type: TOpenDialog
Class Name: TOurOpenDialog
Palette Page: Our Test
Нажали Ok и у нас появился шаблон нашего будущего компонента.

Переопределяем конструктор у этого компонента, т.е. в секции public вставляем строку:


constructor Create(AOwner: TComponent); override; 

нажатие на этой строке Ctrl + Shift + C создает шаблон для этого метода, внутри которого мы вставляем такие строки:


inherited Create(AOwner); {Вызываем унаследованный конструктор} 

Options := Options + [ofFileMustExist, ofPathMustExist]; {Выполняем необходимые нам действия}
Обратите внимание: Комбинации клавиш Ctrl + Shift + стрелки вверх/вниз позволяют перемещаться между объявлением метода и его реализацией.

Установка созданного компонента Component/Install Component...
Install Into New Package
Package file name: C:Program FilesBorlandDelphi4LibOurTest.dpk
Package description: Our tested package

Вам не нравится, что у нашего компонента иконка такая же как у стандартного? Тогда создадим для него свою собственную.
Для этого нам необходимо вызвать Tools/Image Editor. Создаем новый *.dcr файл.
Вставляем в него рисунок Resource/New/Bitmap. Устанавливаем размер картинки 24x24 точек. А дальше - ваше творчество...
Обратите внимание: цвет точек, совпадающий с цветом точки в левом нижнем углу рисунка, будет считаться ПРОЗРАЧНЫМ!
После того как вы создали свой рисунок, переименуйте его из Bitmap1 в TOurOpenDialog и сохраните файл с именем OurOpenDialog.dcr.
Удалите компонент из пакета и установите его снова (только в этом случае добавится и ссылка на *.dcr файл).
Compile, Install и удачи!


unit OurOpenDialog;  
  
interface  
  
uses  
  Windows, Messages, SysUtils, Classes, Graphics,   
    Controls, Forms, Dialogs;  
  
type  
  TOurOpenDialog = class(TOpenDialog)  
  private  
    { Private declarations }  
  protected  
    { Protected declarations }  
  public  
    { Public declarations }  
    constructor Create(AOwner: TComponent); override;  
  published  
    { Published declarations }  
  end;  
  
procedure register;  
  
implementation  
  
procedure register;  
begin  
  RegisterComponents('Samples', [TOurOpenDialog]);  
end;  
  
{ TOurOpenDialog }  
  
constructor TOurOpenDialog.Create(AOwner: TComponent);  
begin  
  inherited Create(AOwner); {Вызываем 
унаследованный конструктор}  
  Options := Options + [ofFileMustExist, ofPathMustExist];   
  {Выполняем необходимые нам действия}  
end;  
end.  

Объявление компонента состоит из секций, таких как private, protected, public и published. Что они означают?
Это директивы видимости.
Все что объявлено в секции private, доступно только внутри модуля в котором объявлен класс (приватные объявления). Здесь как правило объявляются переменные, в которых хранятся значения свойств, а также методы (процедуры или функции) доступа к ним.
Все что объявлено в секции protected, доступно как и в секции private, а также наследникам данного класса (интерфейс разработчика).
Здесь можно объявить методы доступа к значениям свойств (если вы хотите позволить изменять эти методы потомкам вашего компенента),
а также свойства, методы и события (методы реакции на события) в компонентах типа TCustomXXX.
Все что объявлено в секции public, доступно любому пользователю компонента (интерфейс этапа выполнения).
Здесь объявляются, как правило методы. В секции published можно объявлять только свойства и события (они объявляются в виде свойств).
Они доступны во время проектирования приложения (интерфейс этапа проектирования).

Свойства
Свойства типа масив - обычные массива Object Pascal, но в отличии от последних могут индексироваться не только числовыми значениями но и строковыми. К сожалению этот тип свойства требует пользовательского редактора свойств (в инспекторе объектов редактор свойства имеет кнопку с тремя точками [...]), по-этому в указанном ниже примере свойство ArrayProp объявлено в секции public.


type  
  TOurComponent = class(TComponent)  
  private  
    { Private declarations }  
    FArrayProp: array[0..9] of integer;  
    function GetArrayProp(aIndex: integer): integer;  
    procedure SetArrayProp(aIndex: integer; const  
Value: integer);  
  protected  
    { Protected declarations }  
  public  
    { Public declarations }  
    property ArrayProp[aIndex: integer]: integer read  
GetArrayProp   
    write SetArrayProp;  
  published  
    { Published declarations }  
  end;  

Спецификаторы свойств
Спецификатор default указывает сохранять значение свойства в файле формы или нет. Если значение свойства совпадает со значением default - значение в файле формы не сохраняется, если значения не равны - сохраняется. Это можно проверить, положив компонент на форму и выбрать правой кнопкой мыши пункт меню "View as Text". Default не устанавливает первоначальное значение свойства к указанному. Это необходимо сделать в конструкторе компонента.


unit OurComponent;  
  
interface  
  
uses Windows, SysUtils, Classes, Graphics, Forms, Controls;  
  
type  
  TOurComponent = class(TComponent)  
  private  
    { Private declarations }  
    FMyInteger: Integer;  
  protected  
    { Protected declarations }  
  public  
    { Public declarations }  
    constructor Create(AOwner: TComponent); override;  
  published  
    { Published declarations }  
    property MyInteger: Integer read FMyInteger  
write FMyInteger default 10;  
  end;  
  
implementation  
  
constructor TOurComponent.Create(AOwner: TComponent);  
begin  
  inherited Create(AOwner);  
  FInteger := 10;  
end;  
  
end.  

Спецификатор nodefault отменяет заданное по умолчанию значение свойства. Этот спецификатор, как правило, используется для отмены заданого по умолчанию значения унаследованного свойства.
Например: property AutoSize nodefault;

Спецификатор stored указывает когда сохранять в файле формы значение свойства. После stored может стоять true (всегда сохранять), false (никогда не сохранять) или название функции, которая возвращает логический результат.


    property OneProp: integer read FOneProp  
write  
SetOneProp   
stored False;  
    property TwoProp: integer read FTwoProp  
write  
SetTwoProp   
stored True;  
    property ThreeProp: integer read FThreeProp  
write SetThreeProp   
stored Fuct;  

И последнее:
Чтобы добавить картинку в компонент для демонстрации в панели компонентов надо: - создать ее размером 24*24 с именем файла.dcr (в ресурсе имя картинки равно имени компонента, заглавными буками)
- картинку положить рядом с компонентом.
Теги:
компонент
Добавлено: 26 Июля 2018 21:00:49 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...