Форум: "Начинающим";
Текущий архив: 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
Я получу структуру.
У полученной структуры возьму NumberR.Rec.Number
И присвою туды 1R.Rec.Number := 1;
А как думает компилятор? Непойму…
← →
{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]> Т.е. для свойства типа ТХххх и нужно присвоение такогоже
> типа, а не отдельные его компоненты как у тебя…
Не пойму почему. Если вместо рекода объект, то он же не требует подобного…
← →
Kolan © (2008-03-28 18:38) [6]> [4] {RASkov} © (28.03.08 18:37)
Теперь понял [1]. В твоем примере, если бы в рекорде были бы еще поля, то они бы перетёрлись… Тоже плохо.
← →
Плохиш © (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
…
Rc := R.Rec;
Rc.Number:=1;
R.Rec:= Rc;
…
end;
>Для объектов передаются ссылки на них, записи передаются путём копирования самих данных.
Да вроде я это понимаю, а сабж что-то не укладывается в голове…
← →
Kolan © (2008-03-28 19:07) [10]> У объектов есть свои свойства… свои сеттеры/геттеры)
Интересно а если я в рекорде сделаю сеттеры, тогда получится? Проверю вечером…
← →
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