Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.11.2012, 09:32
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию delphi left side cannot be assigned to при обработке record

Я тут наткнулся на проблему и нашел как ее решить. Есть следующий код:
Код:
type
TRec = record
a:string;
b:integer;
end;
TClass = class
private
FRec:TRec;
public
property Rec:TRec read FRec write FRec; {конструкция read GetRec write SetRec тоже не решает проблему}
end;

***

Procedure proc;
C:TCalss;
begin
C := TClass.Create;
{На две следующие строчки компилятор ругается вот таким текстом left side cannot be assigned to}
C.Rec.a := 'string'; 
C.Rec.b := 5;
end;

Решается 2-мя путями.
1:
Код:
Procedure proc;
C:TCalss;
R:TRec;
begin
C := TClass.Create;
R.a := 'string';
R.b := 5;
C.Rec := R; 
end;
2:
Код:
Procedure proc;
C:TCalss;
begin
C := TClass.Create;
with C.Rec do
begin
a := 'string'; 
b := 5;
end;
{Видимо, конструкция with сама по себе работает так же, как 1-й вариант, то есть работает с record целиком (принимает и отправляет)}
end;

Может, это вообще обходится другими способами, более правильными, но мне они неведомы.
Ответить с цитированием
  #2  
Старый 29.11.2012, 09:45
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Вот эта запись
Код:
property Rec:TRec read FRec write FRec;
означает, что FRect нужно читать и записывать ЦЕЛИКОМ. Отдельные поля модифицировать не получится. Поэтому вариант 1) будет работать, а вариант 2) скорее всего нет. Хотя 2) и скомпилируется, но посмотрите, что после этого кода окажется в FRect.
Ответить с цитированием
  #3  
Старый 29.11.2012, 09:52
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Вася, я ж проверил. Все пашет. Даже к with комментарий написал с предположением, почему оно пашет. )

Я даже больше скажу. Угадай, что выведет такой код:

Код:
TRec = record
a:string;
b:integer;
end;

***

procedure Proc;
var
R:TRec;
begin
R.a := 'qwe';
R.b := 1;
with R do
begin
a := 'asd';
b := 2;
showmessage(R.a + IntToStr(R.b));
end;
end;
А вот и не угадал! Выдаст 'qwe1'.

А вот этот код
Код:
TRec = record
a:string;
b:integer;
end;

***

procedure Proc;
var
R:TRec;
begin
R.a := 'qwe';
R.b := 1;
with R do
begin
a := 'asd';
b := 2;
showmessage(a + IntToStr(b));
end;
end;
и вот этот код
Код:
TRec = record
a:string;
b:integer;
end;

***

procedure Proc;
var
R:TRec;
begin
R.a := 'qwe';
R.b := 1;
with R do
begin
a := 'asd';
b := 2;
end;
showmessage(R.a + IntToStr(R.b));
end;
выдадут то, что мы и ожидали, то есть 'asd2' )

Последний раз редактировалось morebeauty, 29.11.2012 в 10:02.
Ответить с цитированием
  #4  
Старый 29.11.2012, 10:08
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Вот тут тож советуют или with или переделать record в класс, что на мой вгляд более правильно.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #5  
Старый 29.11.2012, 10:48
Аватар для morebeauty
morebeauty morebeauty вне форума
Начинающий
 
Регистрация: 21.06.2012
Сообщения: 106
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Думаю, прежде чем оценивать более/менее правильно, следует разобраться как устроен блок with. А то может оба способа просто напросто идентичны? )
Ответить с цитированием
  #6  
Старый 29.11.2012, 11:56
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Объект от записи отличаются принципиально, т.к. Delphi объектно-ориентированный язык - то правильнее оперировать объектами.
Далее в холиваре не участвую.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter