Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.05.11;
Скачать: CL | DM;

Вниз

Запись в качестве свойства класса   Найти похожие ветки 

 
Balkonnn   (2008-04-14 07:44) [0]

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

Например:

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

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


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

Спасибо.


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

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

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;

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


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

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

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


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

> 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:24) [4]

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

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


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

> Balkonnn   (14.04.08 08:24) [4]

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

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

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

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


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

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


 
Palladin ©   (2008-04-14 09:49) [7]

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


 
Anatoly Podgoretsky ©   (2008-04-14 10:01) [8]

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


 
Kolan ©   (2008-04-14 10:07) [9]

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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2008.05.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
2-1208248370
DFT
2008-04-15 12:32
2008.05.11
const


2-1208161609
lod
2008-04-14 12:26
2008.05.11
Разбить определёный периуд времени на недели.


15-1206587384
slider007
2008-03-27 06:09
2008.05.11
С днем рождения ! 27 марта 2008 четверг


15-1206990222
Дмитрий С
2008-03-31 23:03
2008.05.11
Посоветуйте книги.


15-1206403811
Hero
2008-03-25 03:10
2008.05.11
Пытаюсь сделать sudoku