![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с полем в классе [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 не нужно делать?