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

Вниз

Не удается присвоить значение полю структуры в объекте.   Найти похожие ветки 

 
Kolan ©   (2008-03-28 18:05) [0]

Здравствуйте,
 Есть, допустим структура:
 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.

Почему?


 
MBo ©   (2008-03-28 18:18) [1]

>Почему?
Потому что через свойство обращение идет к записи целиком


 
Kolan ©   (2008-03-28 18:27) [2]

> Потому что через свойство обращение идет к записи целиком

Сути не понял. Ну идет.

Я понимаю эту строчку так:

От
R.Rec
Я получу структуру.

У полученной  структуры возьму Number
R.Rec.Number

И присвою туды 1
R.Rec.Number := 1;

А как думает компилятор? Непойму&#133


 
{RASkov} ©   (2008-03-28 18:34) [3]

> [2] Kolan ©   (28.03.08 18:27)
> А как думает компилятор? Непойму…

См[1].
Т.е. для свойства типа ТХххх и нужно присвоение такогоже типа, а не отдельные его компоненты как у тебя...


 
{RASkov} ©   (2008-03-28 18:37) [4]

var
R: TRecObject; Rc: TRec;
begin
....
 Rc.Number:=1;
 R.Rec:= Rc;
...
end;


 
Kolan ©   (2008-03-28 18:37) [5]

> Т.е. для свойства типа ТХххх и нужно присвоение такогоже
> типа, а не отдельные его компоненты как у тебя&#133

Не пойму почему. Если вместо рекода объект, то он же не требует подобного&#133


 
Kolan ©   (2008-03-28 18:38) [6]

> [4] {RASkov} ©   (28.03.08 18:37)

Теперь понял [1]. В твоем примере, если бы в рекорде были бы еще поля, то они бы перетёрлись&#133 Тоже плохо.


 
Плохиш ©   (2008-03-28 18:59) [7]


> Kolan ©   (28.03.08 18:37) [5]
> > Т.е. для свойства типа ТХххх и нужно присвоение такогоже
>
> > типа, а не отдельные его компоненты как у тебя…
>
> Не пойму почему. Если вместо рекода объект, то он же не
> требует подобного

Для объектов передаются ссылки на них, записи передаются путём копирования самих данных.


 
{RASkov} ©   (2008-03-28 19:03) [8]

> [6] Kolan ©   (28.03.08 18:38)
> В твоем примере, если бы в рекорде были бы еще поля, то они бы перетёрлись…

Пример мой - рекорд твой :)

> Не пойму почему. Если вместо рекода объект, то он же не требует подобного…

У объектов есть свои свойства.... свои сеттеры/геттеры)


 
Kolan ©   (2008-03-28 19:06) [9]

Вообщем код Раскова правильнее записать так:
var
R: TRecObject; Rc: TRec;
begin
&#133
Rc := R.Rec;
Rc.Number:=1;
R.Rec:= Rc;
&#133
end;


>Для объектов передаются ссылки на них, записи передаются путём копирования самих данных.
Да вроде я это понимаю, а сабж что-то не укладывается в голове&#133


 
Kolan ©   (2008-03-28 19:07) [10]

> У объектов есть свои свойства&#133 свои сеттеры/геттеры)

Интересно а если я в рекорде сделаю сеттеры, тогда получится? Проверю вечером&#133


 
Palladin ©   (2008-03-28 19:09) [11]

привыкай... это особенность компиляции... а точнее механизма работы со свойствами класса...

вот если вместо записи у тебя свойство было ссылкой на эту запись... мог бы менять поля сколько захочешь... :)


 
Palladin ©   (2008-03-28 19:11) [12]


> У объектов есть свои свойства.... свои сеттеры/геттеры)

это ни причем, полученная ссылка-ссвойство автоматом разименовывается компилятором, а так как все идентификаторы объектов у нас ссылки, то и того этого...


 
Palladin ©   (2008-03-28 19:16) [13]

вообще говоря почему так получается, неважно что написано в секция Read/Write свойства, для компилятора обращение к свойству на чтение - это вызов функции результатом которой является запись, результат заносится куда то там, либо в регистры если влазит, либо в стек, соответсвенно вызов
Object.PropertyRec.SomeField:=5;
означает следующее: копирование данных куда нибудь (стек, регистры) и попытка присвоения им данных, только уже по месту копирования. естественно никакого смысла данная операция не имеет, потому компилятор и ругается.

компилятор будет точно так же ругатся и на

Function GetRec:TMyRec;
Begin
Result.Field:=5;
End;

GetRec.Field:=4;


 
Anatoly Podgoretsky ©   (2008-03-28 21:56) [14]


>  FRec: TRec;

> Почему?

Помучу что свойство типа TRec, а не word.
Хочешь присваивать, то сделай контролируемое свойство типа word или как посоветовали через промежуточную переменную.


 
Kolan ©   (2008-03-28 22:00) [15]


> Palladin

Благодарствую, понял.

Свех остальныз тоже благодарю. :)



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

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

Наверх




Память: 0.5 MB
Время: 0.014 c
2-1206773311
nw
2008-03-29 09:48
2008.04.20
Можно установить и использовать компонент без *.dcu ?


2-1205885712
Лена
2008-03-19 03:15
2008.04.20
межсимвольный интервал в компоненте RichEdit


15-1204658139
dekcc
2008-03-04 22:15
2008.04.20
ПОМОГИТЕ с заданием пиз. СРОЧНО :(


3-1195294675
Neket
2007-11-17 13:17
2008.04.20
Расчет среднего значения.


4-1187173808
suspeded
2007-08-15 14:30
2008.04.20
Как узнать заблокирована учетная запись или нет