![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись в качестве свойства класса [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;
Хвала богам, с крышей у нас обоих все оказалось все в порядке. И у меня, и у компилятора.