Главная страница
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.036 c
1-47564
Боева Наталья
2002-06-28 03:34
2002.07.15
Экспорт данных из отчета


3-47124
Ramil
2002-06-21 21:09
2002.07.15
У кого получался сетевой IB под win95/98


1-47428
Explorer
2002-07-03 09:16
2002.07.15
Как зарегистрировать EhLib?


7-47814
konusov
2002-04-02 00:44
2002.07.15
Программно выключить компьютер


6-47644
Airs
2002-05-06 15:04
2002.07.15
Вопрос с передачей массивов