Текущий архив: 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