Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

Курс видеоуроков КРЭКЕРСТВО + ПРОГРАММИРОВАНИЕ 2017
(актуальность: май 2017)
Свежие инструменты, новые видеоуроки!

  • 400+ видеоуроков
  • 800 инструментов
  • 100+ свежих книг и статей

УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Свойства в Delphi

- Ты видел, козлина, чтобы я наш apple гадостью всякой поливал?
- Урод ты, дед. У нас четвертый пень уже год стоит вместо MAC`a.
- Да, внучек, я этот пентиум на мешок с маком и выменял.

Свойства в Delphi могут быть простыми, перечислимыми, типа множество, объектными и массивами.

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


 unit OurComponent;
 
 interface
 
 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
 
 type
   TOurComponent = class(TComponent)
   private
     { Private declarations }
     FMyInteger: Integer;
     FMyChar: Char;
     FMyString: string;
     procedure SetMyInteger(const Value: Integer);
     procedure SetMyChar(const Value: Char);
     procedure SetMyString(const Value: string);
   protected
     { Protected declarations }
   public
     { Public declarations }
   published
     { Published declarations }
     property MyInteger: Integer read FMyInteger write SetMyInteger;
     property MyChar: Char read FMyChar write SetMyChar;
     property MyString: string read FMyString write SetMyString;
 end;
 
 procedure register;
 
 implementation
 
 procedure register;
 begin
   RegisterComponents('Samples', [TOurComponent]);
 end;
 
 { TOurComponent }
 
 procedure TOurComponent.SetMyChar(const Value: Char);
 begin
   FMyChar := Value;
 end;
 
 procedure TOurComponent.SetMyInteger(const Value: Integer);
 begin
   FMyInteger := Value;
 end;
 
 procedure TOurComponent.SetMyString(const Value: string);
 begin
   FMyString := Value;
 end;
 
 end.
 

Перечислимые свойства - это стандартные перечислимые, логический и определенные пользователем перечислимые типы данных. В инспекторе объектов для них редакторы свойств отображаются в виде списка выбора (combobox).


 unit OurComponent;
 
 interface
 
 uses
   Windows, Messages, SysUtils, Classes, Graphics,
   Controls, Forms, Dialogs;
 
 type
   TMyEnumerate = (meFirst, meSecond, meThird);
 
   TOurComponent = class(TComponent)
   private
     { Private declarations }
     FMyBoolean: Boolean;
     FMyCursor: TCursor;
     FMyEnumerate: TMyEnumerate;
     procedure SetMyCursor(const Value: TCursor);
     procedure SetMyBoolean(const Value: Boolean);
     procedure SetMyEnumerate(const Value: TMyEnumerate);
   protected
     { Protected declarations }
   public
     { Public declarations }
   published
     { Published declarations }
     property MyCursor: TCursor read FMyCursor write SetMyCursor;
     property MyBoolean: Boolean read FMyBoolean write SetMyBoolean;
     property MyEnumerate: TMyEnumerate read FMyEnumerate write
     SetMyEnumerate;
 end;
 
 procedure register;
 
 implementation
 
 procedure register;
 begin
   RegisterComponents('Samples', [TOurComponent]);
 end;
 
 { TOurComponent }
 
 procedure TOurComponent.SetMyCursor(const Value: TCursor);
 begin
   FMyCursor := Value;
 end;
 
 procedure TOurComponent.SetMyEnumerate(const Value: TMyEnumerate);
 begin
   FMyEnumerate := Value;
 end;
 
 procedure TOurComponent.SetMyBoolean(const Value: Boolean);
 begin
   FMyBoolean := Value;
 end;
 
 end.
 

Свойства типа множество - это стандандартные, а также определенные пользователем, множества. В инспекторе объектов для них редакторы свойств имеют знак [+] перед названием свойства.

Размер публикуемых (published) свойств ограничен 32 элементами. Если вам необходимо свойство с более чем 32 элементами - объявите свое свойство публичным (public).


 unit OurComponent;
 
 interface
 
 uses
   Windows, Messages, SysUtils, Classes, Graphics,
   Controls, Forms, Dialogs;
 
 type
   TMySet = (msOne, msTwo, msThee, msFour, msFive);
   TMySets = set of TMySet;
 
   TOurComponent = class(TComponent)
   private
     { Private declarations }
     FMySet: TMySets;
     procedure SetMySet(const Value: TMySets);
   protected
     { Protected declarations }
   public
     { Public declarations }
   published
     { Published declarations }
     property MySet: TMySets read FMySet write SetMySet;
 end;
 
 procedure register;
 
 implementation
 
 procedure register;
 begin
   RegisterComponents('Samples', [TOurComponent]);
 end;
 
 { TOurComponent }
 
 procedure TOurComponent.SetMySet(const Value: TMySets);
 begin
   FMySet := Value;
 end;
 
 end.
 

Объектные свойства - это стандартные (TFont, TCanvas и т.п.) или определенные пользователем объекты, как правило наследники TPersistent. В инспекторе объектов для них редакторы свойств имеют знак [+] перед названием свойства и кнопку с тремя точками [...](пользовательский редактор свойства).


 unit OurComponent;
 
 interface
 
 uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls,
   Forms, Dialogs;
 
 type
 
   TOurComponent = class(TComponent)
   private
     { Private declarations }
     FMyFont: TFont;
     procedure SetMyFont(const Value: TFont);
   protected
     { Protected declarations }
   public
     { Public declarations }
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
   published
     { Published declarations }
     property MyFont: TFont read FMyFont write SetMyFont;
 end;
 
 procedure register;
 
 implementation
 
 procedure register;
 begin
   RegisterComponents('Samples', [TOurComponent]);
 end;
 
 { TOurComponent }
 
 constructor TOurComponent.Create(AOwner: TComponent);
 begin
   inherited Create(AOwner);
   {В отличие от предыдущих свойств, объекты обязательно
   необходимо создавать в конструкторе компонента, как
   правило после вызова унаследованного конструктора}
   FMyFont.Create;
 end;
 
 destructor TOurComponent.Destroy;
 begin
   FMyFont.Free;
   {В отличие от предыдущих свойств, объекты обязательно
   необходимо разрушать в деструкторе компонента, как
   правило перед вызовом унаследованного деструктора}
   inherited Destroy;
 end;
 
 procedure TOurComponent.SetMyFont(const Value: TFont);
 begin
   {Объектному свойству значение присваивается с
   помощью вызова метода Assign}
   FMyFont.Assign(Value);
 end;
 
 end.
 

На заметку:

Перемещение между объявлением метода и реализацией происходит по нажатию клавиш Ctrl + Shift + стрелки вверх/вниз.

Свойства типа масив - обычные массива 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;
 

Спецификатор index мы разберем в следующем выпуске, когда будем говорить о методах доступа к значению свойства. На заметку: Выделять прямоугольный фрагмент текста в редакторе исходного кода можно с помощью комбинации клавиш Alt + Shift + стрелки вверх/вниз.




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS