Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с полем в классе [D7, XP]


Asail ©   (2006-07-09 02:22:00) 

Есть некий класс, в котором опредено поле-массив и соответствующее свойство для него (включая функции чтения/записи). Класс описан так (сокращенно):

type
 TCurRecord = Record
   ISO : String[3];
   Val : Real;
 end;

type TCurRecords = Array Of TCurRecord;

type
 TCurList = class
 private
   FCurRecords : TCurRecords;
 public
   function GetRecord(Indx : Integer) : TCurRecord;
   procedure SetRecord(Indx : Integer; CurRec : TCurRecord);
   property CurRecord[Indx : Integer] : TCurRecord read GetRecord write SetRecord;
 . . .
 end;


далее в программе определяю экземпляр класса:
var
 CurList : TCurList;
begin
 CurList := TCurList.Create;
end;
Потом пытаюсь занести значение в свойство таким образом:
CurList.CurRecord[0].ISO := 'BBB';

Получаю ошибку при компиляции: 'Left side cannot be assigned to'.
Т.е. свойство CurRecord как-будто ReadOnly, хотя для него описанна процедура записи.
Что не так?


Ketmar   (2006-07-09 11:45:00) [1]

правильно говорит. ибо при таком описании подразумевается, что свойство возвращает копию записи. а в копию пиши, не пиши -- итог один. компилятор умён, он не делает копии, он просто не позволяет присваивать.


Asail   (2006-07-09 11:40:00) [2]


> Мефисто   (09.07.06 11:28) [5]

Спасибо за ответ (всем) !
Так и сделал.


Мефисто   (2006-07-09 11:28:00) [3]

procedure SetISORecord(Indx : Integer; ISO : String);
  function GetISORecord(Indx : Integer): String;
  property ISORec[Indx : Integer] : String read GetISORecord write SetISORecord;
end;

procedure TCurList.SetISORecord(Indx: Integer; ISO: String);
begin
 FCurRecords[Indx].ISO := ISO;
end;

function TCurList.GetISORecord(Indx: Integer): String;
begin
Result := FCurRecords[Indx].ISO;
end;

Вот таким мокаром дселаны проперти для отдельного поля записи - TCurRecord

CurList.ISORec[0] := 'BBB';


Мефисто   (2006-07-09 11:01:00) [4]


> Asail   (09.07.06 02:22) 


Потомучто как минимум у тебя в SetRecord - 2 параметра. Как программа должна понять присвоение такого типа - CurList .CurRecord[0].ISO := 'BBB';

Свойсвта типа массива - это немного другая история.

var
CurList : TCurList;
R: TCurRecord;
begin
CurList := TCurList.Create;
R - (заполняем запись)
CurList.CurRecord[0] := R;

Тыже запись целиком присваиваешь :) Вот и присваивай. Если надо отдельным методом отредактировать запись, то:

procedure SetISORecord(Indx : Integer; ISO : String);
procedure TCurList.SetISORecord(Indx: Integer; ISO: String);
begin
 FCurRecords[Indx].ISO := ISO;
end;


Loginov Dmitry   (2006-07-09 10:17:00) [5]

По моему, так вообще нельзя делать. Объяви указатель
PCurRecord = ^TCurRecord и пробуй через него.


SergP   (2006-07-09 09:52:00) [6]


> Получаю ошибку при компиляции: 'Left side cannot be assigned
> to'.


Ой, блин.. плохо прочитал сразу. Извиняюсь...


SergP   (2006-07-09 09:50:00) [7]

А SetLength не нужно делать?


Наверх

Титульная страница Поиск, карта сайта Написать письмо