![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не удается присвоить значение полю структуры в объекте.
Kolan © (2008-03-28 18:05:00)Здравствуйте,
Есть, допустим структура:
TRec = record
Number: Word;
end;
И есть объект, содержащий эту структуру:
TRecObject = class
private
FRec: TRec;
public
property Rec: TRec read FRec write FRec;
end;
Так вот на строку:
var
R: TRecObject;
begin
R.Rec.Number := 1;
end;
Компилятор говорит Left side cannot be assigned.
Почему?
Kolan (2008-03-28 22:00:00) [1]
> Palladin
Благодарствую, понял.
Свех остальныз тоже благодарю. :)
Anatoly Podgoretsky (2008-03-28 21:56:00) [2]
> FRec: TRec;
> Почему?
Помучу что свойство типа TRec, а не word.
Хочешь присваивать, то сделай контролируемое свойство типа word или как посоветовали через промежуточную переменную.
Palladin (2008-03-28 19:16:00) [3]вообще говоря почему так получается, неважно что написано в секция Read/Write свойства, для компилятора обращение к свойству на чтение - это вызов функции результатом которой является запись, результат заносится куда то там, либо в регистры если влазит, либо в стек, соответсвенно вызов
Object.PropertyRec.SomeField:=5;
означает следующее: копирование данных куда нибудь (стек, регистры) и попытка присвоения им данных, только уже по месту копирования. естественно никакого смысла данная операция не имеет, потому компилятор и ругается.
компилятор будет точно так же ругатся и на
Function GetRec:TMyRec;
Begin
Result.Field:=5;
End;
GetRec.Field:=4;
Palladin (2008-03-28 19:11:00) [4]
> У объектов есть свои свойства.... свои сеттеры/геттеры)
это ни причем, полученная ссылка-ссвойство автоматом разименовывается компилятором, а так как все идентификаторы объектов у нас ссылки, то и того этого...
Palladin (2008-03-28 19:09:00) [5]привыкай... это особенность компиляции... а точнее механизма работы со свойствами класса...
вот если вместо записи у тебя свойство было ссылкой на эту запись... мог бы менять поля сколько захочешь... :)
Kolan (2008-03-28 19:07:00) [6]> У объектов есть свои свойства свои сеттеры/геттеры)
Интересно а если я в рекорде сделаю сеттеры, тогда получится? Проверю вечером
Kolan (2008-03-28 19:06:00) [7]Вообщем код Раскова правильнее записать так:
var
R: TRecObject; Rc: TRec;
begin
Rc := R.Rec;
Rc.Number:=1;
R.Rec:= Rc;
end;
>Для объектов передаются ссылки на них, записи передаются путём копирования самих данных.
Да вроде я это понимаю, а сабж что-то не укладывается в голове
{RASkov} (2008-03-28 19:03:00) [8]> [6] Kolan © (28.03.08 18:38)
> В твоем примере, если бы в рекорде были бы еще поля, то они бы перетёрлись…
Пример мой - рекорд твой :)
> Не пойму почему. Если вместо рекода объект, то он же не требует подобного…
У объектов есть свои свойства.... свои сеттеры/геттеры)
Плохиш (2008-03-28 18:59:00) [9]
> Kolan © (28.03.08 18:37) [5]
> > Т.е. для свойства типа ТХххх и нужно присвоение такогоже
>
> > типа, а не отдельные его компоненты как у тебя…
>
> Не пойму почему. Если вместо рекода объект, то он же не
> требует подобного
Для объектов передаются ссылки на них, записи передаются путём копирования самих данных.
Kolan (2008-03-28 18:38:00) [10]> [4] {RASkov} © (28.03.08 18:37)
Теперь понял [1]. В твоем примере, если бы в рекорде были бы еще поля, то они бы перетёрлись Тоже плохо.
{RASkov} (2008-03-28 18:37:00) [11]
var
R: TRecObject; Rc: TRec;
begin
....
Rc.Number:=1;
R.Rec:= Rc;
...
end;
Kolan (2008-03-28 18:37:00) [12]> Т.е. для свойства типа ТХххх и нужно присвоение такогоже
> типа, а не отдельные его компоненты как у тебя
Не пойму почему. Если вместо рекода объект, то он же не требует подобного
{RASkov} (2008-03-28 18:34:00) [13]> [2] Kolan © (28.03.08 18:27)
> А как думает компилятор? Непойму…
См[1].
Т.е. для свойства типа ТХххх и нужно присвоение такогоже типа, а не отдельные его компоненты как у тебя...
Kolan (2008-03-28 18:27:00) [14]> Потому что через свойство обращение идет к записи целиком
Сути не понял. Ну идет.
Я понимаю эту строчку так:
От
R.Rec
Я получу структуру.
У полученной структуры возьму Number
R.Rec.Number
И присвою туды 1
R.Rec.Number := 1;
А как думает компилятор? Непойму
MBo (2008-03-28 18:18:00) [15]>Почему?
Потому что через свойство обращение идет к записи целиком