Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Свойства в 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 + стрелки вверх/вниз.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay