Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запись в качестве свойства класса [D7, XP]


Balkonnn ©   (2008-04-14 07:44:00) 

Добрый день.
Позволяет ли Делфи создавать запись в качестве свойства класса таким образом, чтобы было возможно присвоение значений непосредственно полям записи.

Например:

TRec = record
 X,Y: double;
end;
TTest - class
 Rec: TRec;  
end;

...
 Test := TTest.Create;
 Test.Rec.X := 3.14;
...


Последний кусок кода не рабочий. Требуется присваивать
непосредственно Test.Rec := SomeRec. Существует ли способ описания
свойства Rec, либо "синтаксический оборот" паскаля такой, чтобы можно было обойтись без промежуточной переменной SomeRec?

Спасибо.


Anatoly Podgoretsky   (2008-04-14 10:56:00) [1]

> Kolan  (14.04.2008 10:07:09)  [9]

А это будет уже не свойство, про которые речь.


Kolan   (2008-04-14 10:07:00) [2]

Можно еще нарушить инкапсуляцию и сделать запись паблик.


Anatoly Podgoretsky   (2008-04-14 10:01:00) [3]

Для записи 3.14 надо иметь свойство подобного типа, TRec имеет другой тип.
Как сказали или создаешь Эн свойств, или копируешь поле в локальную запись, потом обратно.


Palladin   (2008-04-14 09:49:00) [4]

Если функциональная реакция на изменение типа поля не требуется то достаточно работать с указатеоем на запись


Balkonnn   (2008-04-14 08:38:00) [5]

Спасибо! Вопрос снят.


Семеныч   (2008-04-14 08:32:00) [6]

> Balkonnn   (14.04.08 08:24) [4]

> в случае если запись имеет большое число полей

Увы, придется заводить столько же свойств.

> Корректно ли вместо записи использовать класс, содержащий
> аналогичные свойсва?

Вполне. Экземпляр этого класса надо создать в конструкторе класса-контейнера и уничтожить в его деструкторе.


Balkonnn   (2008-04-14 08:24:00) [7]

Спасибо.
Скажите, а в случае если запись имеет большое число полей?
Не совсем удобно вводить на каждое поле отдельное свойство.

Корректно ли вместо записи использовать класс, содержащий аналогичные свойсва? Ведь в случае с классом непосредственное определение его свойств из "надкласса" возможно.


Семеныч   (2008-04-14 08:12:00) [8]

> Balkonnn   (14.04.08 08:06) [2]

Вот это другое дело.

type
 TRec = record
   X,Y: double;
 end;

 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   FRec: TRec;
   function GetRecX: double;
   function GetRecY: double;
   procedure SetRecX(const Value: double);
   procedure SetRecY(const Value: double);
 public
   property Rec: TRec read FRec write FRec;
   property RecX: double read GetRecX write SetRecX;
   property RecY: double read GetRecY write SetRecY;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 R: TRec;
begin
 R.X := Pi;
 R.Y := Exp(1);
 Rec := R;
 ShowMessage(Format('FRec.X = %f'#13#10'FRec.Y = %f', [FRec.X, FRec.Y]));
 RecX := Exp(1);
 RecY := PI;
 ShowMessage(Format('FRec.X = %f'#13#10'FRec.Y = %f', [FRec.X, FRec.Y]));
end;

function TForm1.GetRecX: double;
begin
 Result := FRec.X;
end;

function TForm1.GetRecY: double;
begin
 Result := FRec.Y;
end;

procedure TForm1.SetRecX(const Value: double);
begin
 FRec.X := Value;
end;

procedure TForm1.SetRecY(const Value: double);
begin
 FRec.Y := Value;
end;


Balkonnn   (2008-04-14 08:06:00) [9]

Прошу прощения, в описании вроде бы сказал - в коде конечно же ошибка.

TTest - class
private
 FRec: TRec;
 procedure SetRec(ARec:TRec);
public
 property Rec: TRec read FRec write SetRec;  
end;


Семеныч   (2008-04-14 07:58:00) [10]

Я так удивился, что даже засомневался и решил проверить.

type
 TRec = record
   X,Y: double;
 end;

 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 public
   Rec: TRec;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 R: TRec;
begin
 R.X := Pi;
 R.Y := Exp(1);
 Rec := R; // Это через другую запись
 ShowMessage(Format('Rec.X = %f'#13#10'Rec.Y = %f', [Rec.X, Rec.Y]));
 Rec.X := Exp(1); // А это напрямую
 Rec.Y := Pi; // И это напрямую
 ShowMessage(Format('Rec.X = %f'#13#10'Rec.Y = %f', [Rec.X, Rec.Y]));
end;

Хвала богам, с крышей у нас обоих все оказалось все в порядке. И у меня, и у компилятора.


Наверх

Титульная страница Поиск, карта сайта Написать письмо