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

Вниз

Проблема с полем в классе   Найти похожие ветки 

 
Asail   (2006-07-09 02:22) [0]

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

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, хотя для него описанна процедура записи.
Что не так?


 
SergP ©   (2006-07-09 09:50) [1]

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


 
SergP ©   (2006-07-09 09:52) [2]


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


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


 
Loginov Dmitry ©   (2006-07-09 10:17) [3]

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


 
Мефисто   (2006-07-09 11:01) [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;


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

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";


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


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

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


 
Ketmar ©   (2006-07-09 11:45) [7]

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



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

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

Наверх




Память: 0.48 MB
Время: 0.036 c
2-1152375839
anton773
2006-07-08 20:23
2006.07.30
Tflestream


2-1152179578
Crazy monkey
2006-07-06 13:52
2006.07.30
Как добавить данные в dblistbox?


3-1148377072
vigo_
2006-05-23 13:37
2006.07.30
Вопрос по компоненте TSimpleDataSet


2-1152621860
Вован Сем
2006-07-11 16:44
2006.07.30
Провертьте мое задание


2-1152427586
HelloWord
2006-07-09 10:46
2006.07.30
Вопросик по компоненту cxGrid