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

Вниз

record в property   Найти похожие ветки 

 
sokoloff   (2002-07-02 16:13) [0]

День добрый, подскажите как правильно преписать код.
Есть:

type
TRow = record
Name: string;
Caption: string;
ID : integer;
Value: string;
end;


TMyTable = class
private
FRows: array[0..16] of TRow;
function GetValues(Index: integer): TRow;
procedure SetValues(Index: integer; const Value: TRow);
public
property Values[Index: integer]: TRow read GetValues write SetValues;
end;


function TMyTable.GetValues(Index: integer): TRow;
begin
result:=Frow[Index];
end;


procedure TMyTable.SetValues(Index: integer; const Value: TRow);
begin
FRow[Index]:=Value;
end;



Т.е. в классе есть свойство-массив Values, каждое значение это запись из нескольких полей.

Не работает такой код:

MyTable.Values[2].ID:=2;

Компилятор выдает:
[Error] UnitFLT.pas(174): Left side cannot be assigned to

Можно, конечно, сделать так:


var
NewRow: TRow;
begin
NewRow.ID:=2;
MyTable.Values[2]:=NewRow;


Но хотелось бы как в первом варианте. Можно как-нибудь переписать код класса чтоб можно было присваивать значения напрямую? Если можно, то как?


 
Ivan2   (2002-07-02 16:57) [1]

Так как ты хочешь не может работать. Когда ты пишешь MyTable.Values[2]:=NewRow, компилятор фактически
генерит след. код: MyTable.SetValues(2, NewRow) т.е. вызывает метод для присвоения значения твоему
свойству. Если хочешь, открой во время выполнения этой строчки окно ассемблерного кода. Естественно, что запись MyTable.Values[2].ID:=2 в этом случае некорректна в левой части присваивания (заметь, в правой - без проблем).

Попробуй переписать свой класс так:


type
TRowArray: array[0..16] of TRow;

TMyTable = class
private
FRows: TRowArray;
function GetValues(Index: integer): TRow;
procedure SetValues(Index: integer; const Value: TRow);
public
property Values: TRowArray read FRows;
// property Values[Index: integer]: TRow read GetValues write SetValues;
end;

Тогда ты смошеь обрашяться к массиву свободно и без извращений:
MyTable.Values[2] := NewRow
MyTable.Values[2].ID := 2
MyTable.Values[3].Name := MyTable.Values[10].Name


и т.д.


 
Dimka Maslov ©   (2002-07-02 17:15) [2]

type
PRow = ^TRow;
TRow = record
Name: string;
Caption: string;
ID : integer;
Value: string;
end;


TMyTable = class
private
FRows: array[0..16] of TRow;
function GetValues(Index: integer): PRow;
public
property Values[Index: integer]: PRow read GetValues; end;


function TMyTable.GetValues(Index: integer): PRow;
begin
result:=@Frow[Index];
end;





 
Толик ©   (2002-07-02 17:40) [3]

Надо объявить св-во с типом не структуры, а УКАЗАТЕЛЕЯ на структуру.
вот Ваш несколько видоизменённый код:

type
TRow = record
Name: string;
Caption: string;
ID : integer;
Value: string;
end;
PRow = ^TRow;

TMyTable = class
private
FRows: array[0..16] of TRow
function GetValues(Index: integer): PRow;
procedure SetValues(Index: integer; const Value: PRow);
public
property Values[Index: integer]: PRow read GetValues write SetValues;
end;


function TMyTable.GetValues(Index: integer): PRow;
begin
result := Frow[Index];
end;


procedure TMyTable.SetValues(Index: integer; const Value: PRow);
begin
FRow[Index]:=Value ^;
//а вот здесь следует помнить о том, что прежде чем передать в эту ф-ю значение Value, под него надо выделить память, а освобожлать её ТОЛЬКО ПОСЛЕ удаления эл-та из массива!!!
end;

Ну и соответственно обращаться к этому св-ву надо так:

MyTable.Values[2]^.ID:=2;


 
Толик ©   (2002-07-02 17:45) [4]

Прошу прощения за опечатку, ф-я GetValues должна выглядеть так:

function TMyTable.GetValues(Index: integer): PRow;
begin
result := @Frow[Index];
end;


 
Sokoloff   (2002-07-02 18:45) [5]

Первый вариант не работает :(
А сделал я все гораздо проще, не public property которое ссылается на private array, а просто public array, т.е.


TMyTable = class
private
public
Values : array[0..16] of TRow;
end;

Плохо то,что нет возможности проверять значения перед записью, правда пока это и не надо, но как-то некрасиво. Но в вариантах с указателями, насколько я вижу это то-же невозможно. Чтоб проверять записи надо делать не record, а class.



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

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

Наверх




Память: 0.48 MB
Время: 0.011 c
4-47867
Sergo
2002-05-06 13:13
2002.07.15
Приоритет


1-47328
Вадим
2002-06-29 00:19
2002.07.15
Проверить, есть ли property


7-47815
aleksander
2002-04-18 17:25
2002.07.15
Блокировка клавиатуры из сервиса


1-47579
alxx
2002-06-28 10:16
2002.07.15
Составляющие шрифта


1-47528
Arthur1
2002-07-04 14:06
2002.07.15
Как получить путь зущеной программы.