В иерархии VCL в большинстве случаев существует уровень объектов-"предшественников" (TCustomXXXX), в которых многие свойства скрыты. Для унаследованных от таких "предшественников" объектов можно "открывать" на выбор те или иные свойства. А как можно скрыть свойства, которые объявлены в published-области от Object Inspector'а, но при этом оставить возможность доступа во время работы программы? Решение состоит в объявлении свойства "по новой" в public-области. В примере скрытым будет у объекта TMyControl свойство Height.

 

Code:

TMyControl = class(TWinControl)

protected

procedure SetHeight(Value: Integer);

function GetHeight: Integer;

public

property Height: Integer read GetHeight write SetHeight;

end;

 

procedure TMyControl.SetHeight(Value: Integer);

begin

inherited Height := Value;

end;

 

function TMyControl.GetHeight;

begin

Result := inherited Height;

end;

Вы можете менять свойство "owner" и после создания компонента с помощью методов InsertComponent() и RemoveComponent().

 

Взято из

DELPHI VCL FAQПеревод с английского

Подборку, перевод и адаптацию материала подготовил Aziz(JINX)

специально для Королевства Дельфи

 

 

Code:

{

You sometimes wish to store multiple information in a given class like

in the example: alltogether when it belongs together.

Thus accessing this information from out of the class can be achieved

using property declaration. Its a good way to "clean your code" and

make it as "logic" as possible.

You also may have to store or load information from your class using

file or stream technology. This can be done at once for the recorded

information from within the given class.

}

 

type

TPersonRecord = Record

FirstName: String;

LastName: String;

BirthDate: TDate;

End;

 

TForm4 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

fActualUser: TPersonRecord;

...

procedure SaveActualUser(S: TFileStream); // it's an example

procedure LoadActualUser(S: TFileStream);

...

public

property FirstName: stringread fActualUser.FirstName

write fActualUser.FirstName;

property LastName : stringread fActualUser.LastName

write fActualUser.LastName;

property BirthDate: TDate read fActualUser.BirthDate

write fActualUser.BirthDate;

end;

 

procedure TForm4.SaveActualUser(S: TFileStream);

begin

// All that stuff at once in your Stream

S.Write(fActualUser, SizeOf(fActualUser))

end;

 

procedure TForm4.LoadActualUser(S: TFileStream);

begin

// All that stuff at once back in your class

S.Read(fActualUser, SizeOf(fActualUser));

end;

 

 

http://delphiworld.narod

DelphiWorld 6.0

Хорошо, создайте на основе опубликованного ниже кода модуль PropDemo.pas и добавьте новый компонент в палитру компонентов. Расположите его на форме и сохраните ее. Затем посмотрите файл DFM каким-либо шестнадцатиричным редактором и проверьте наличие определенных свойств по их именованным тэгам. Вы можете также попробовать закрыть форму и модуль, а затем открыть его с помощью пункта меню File | Open file..., изменив тип файла в выпадающем списке на *.DFM.

 

Mike Scott

Mobius Ltd.

Code:

unit PropDemo;

 

{ Демонстрация DefineProperties.Mike Scott, CIS 100140,2420. }

 

interface

 

uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,

Forms, Dialogs;

 

type

TDemoProps = class(TComponent)

private

{ Private declarations }

FStringThing: string;

FThing: record

i, j, k: integer;

x, y: real;

ch: char;

end;

procedure ReadStringThing(Reader: TReader);

procedure WriteStringThing(Writer: TWriter);

procedure ReadThing(Stream: TStream);

procedure WriteThing(Stream: TStream);

protected

{ Protected declarations }

procedure DefineProperties(Filer: TFiler); override;

public

{ Public declarations }

constructor Create(AOwner: TComponent); override;

published

{ Published declarations }

end;

 

procedureRegister;

 

implementation

 

constructor TDemoProps.Create(AOwner: TComponent);

 

begin

inherited Create(AOwner);

{ создайте любые данные, чтобы было что передать в поток}

FStringThing := 'Всем привет!';

with FThing do

begin

i := 1;

j := 2;

k := 3;

x := PI;

y := 180 / PI;

ch := '?';

end;

end;

 

procedure TDemoProps.ReadStringThing(Reader: TReader);

begin

FStringThing := Reader.ReadString;

end;

 

procedure TDemoProps.WriteStringThing(Writer: TWriter);

begin

Writer.WriteString(FStringThing);

end;

 

procedure TDemoProps.ReadThing(Stream: TStream);

begin

Stream.ReadBuffer(FThing, sizeof(FThing));

end;

 

procedure TDemoProps.WriteThing(Stream: TStream);

begin

Stream.WriteBuffer(FThing, sizeof(FThing));

end;

 

procedure TDemoProps.DefineProperties(Filer: TFiler);

 

begin

inherited DefineProperties(Filer);

Filer.DefineProperty('StringThing', ReadStringThing, WriteStringThing,

FStringThing <> '');

Filer.DefineBinaryProperty('Thing', ReadThing, WriteThing, true);

end;

 

procedureRegister;

begin

RegisterComponents('Samples', [TDemoProps]);

end;

 

end.

 

 

 

 

Взято из Советов по Delphi отВалентина Озерова

Сборник Kuliba