Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.019 c
1-47557
alxx
2002-06-27 12:11
2002.07.15
Масштаб метафайла


1-47565
Катерина
2002-06-28 10:52
2002.07.15
Длинные строки в ListBox


1-47558
ikivio
2002-06-28 00:30
2002.07.15
Окна нестандартной формы (не круглой,не овальной),


6-47642
Dmitry100
2002-05-03 14:41
2002.07.15
UDP в Windos 2000


3-47069
MsGuns
2002-06-19 23:02
2002.07.15
Queryresult Usage





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский