Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.04.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.124 c
2-1206555175
junkie
2008-03-26 21:12
2008.04.20
Excel процесс остается в памяти


15-1204892867
@!!ex
2008-03-07 15:27
2008.04.20
Где можно купить летучую мышь?


4-1187425785
Artog
2007-08-18 12:29
2008.04.20
Поделитесь опытом использования EnumProps


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


15-1205002553
2лекс
2008-03-08 21:55
2008.04.20
MD5Append





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский