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

Вниз

Property как массив по default   Найти похожие ветки 

 
Knight ©   (2006-03-01 13:53) [0]

Есть


TТипЭлемента=???
 Field1:...
 Field2:....
 ...
end;

TУсловный Класс=...
...
 property УсловныйМассив[Index:Integer]:TТипЭлемента read Get write Put; default;
...
var Условный Класс:TУсловный Класс;
...


Данные хранятся и выдаются из TList.
Вопрос: Чтобы получить доступ по схеме
Условный Класс[index].Field1:=Значение
чем должен быть TТипЭлемента?

При попытке использовать record выдало, что такое присвоение не возможно. Классом что ли его оформлять?


 
MBo ©   (2006-03-01 14:03) [1]

Get и Put оперируют с записью целиком, а не с ее отдельными полями.


 
Сергей М. ©   (2006-03-01 14:04) [2]


> чем должен быть TТипЭлемента?


либо [packed]record,  либо class(..)


 
TUser ©   (2006-03-01 14:05) [3]

Работает. D7.

program todel;
{$apptype console}

type
TBase =
 record
   A, B: integer;
 end;

TCont = class
 private
  FItems: array of TBase;
  function rItem (Index: integer): TBase;
 public
  constructor Create;
  destructor Destroy; override;
  property Items[Index: integer]: TBase read rItem; default;
 end;

function TCont.rItem (Index: integer): TBase;
begin
 result:=FItems[Index];
end;

constructor TCont.Create;
begin
 SetLength (FItems, 2);
 FItems[0].A:=1;
 FItems[1].B:=2;
 FItems[0].A:=3;
 FItems[1].B:=4;
end;

destructor TCont.Destroy;
begin
 SetLength (FItems, 0);
end;

var C: TCont;
begin
 C:=TCont.Create;
 writeln (C[1].B);
end.


 
Сергей М. ©   (2006-03-01 14:05) [4]

либо interface(..)


 
TUser ©   (2006-03-01 14:07) [5]

А зачем обязательно packed?


 
Сергей М. ©   (2006-03-01 14:11) [6]


> TUser ©   (01.03.06 14:07) [5]


Как раз не обязательно.
О том и говорят квадратные скобки, обрамляющие слово packed


 
MBo ©   (2006-03-01 14:12) [7]

>TUser ©   (01.03.06 14:05) [3]
Чтение можно так делать, а запись одного поля - нет.


 
TUser ©   (2006-03-01 14:20) [8]

> MBo ©   (01.03.06 14:12) [7]

[1] легко обходится - для этого есть указатели.

program todel;
{$apptype console}

type
TBase =
 record
   A, B: byte;
 end;
PBase = ^TBase;

TCont = class
 private
  FItems: array of TBase;
  function rItem (Index: integer): PBase;
 public
  constructor Create;
  destructor Destroy; override;
  property Items[Index: integer]: PBase read rItem; default;
 end;

function TCont.rItem (Index: integer): PBase;
begin
 result:=@FItems[Index];
end;

constructor TCont.Create;
begin
 SetLength (FItems, 2);
 FItems[0].A:=1;
 FItems[1].B:=2;
 FItems[0].A:=3;
 FItems[1].B:=4;
end;

destructor TCont.Destroy;
begin
 SetLength (FItems, 0);
end;

var C: TCont;
begin
 C:=TCont.Create;
 C[1].B:=5;
 writeln (C[1].B);
end.


 
MBo ©   (2006-03-01 14:24) [9]

>TUser ©   (01.03.06 14:20) [8]
>[1] легко обходится - для этого есть указатели.

Вот именно, что обходится, т.е. меняется метод доступа и нарушается (относительно честная) инкапсуляция ;)


 
Knight ©   (2006-03-01 14:31) [10]

А к ак без нарушения?


 
jack128 ©   (2006-03-01 14:32) [11]

Knight ©   (01.03.06 14:31) [10]
либо через класс, либо через промежуточную переменную..


 
Сергей М. ©   (2006-03-01 14:33) [12]


> как без нарушения


Идеальный случай - использование интерфейсов


 
Knight ©   (2006-03-01 14:33) [13]


> [1] MBo ©   (01.03.06 14:03)
> Get и Put оперируют с записью целиком, а не с ее отдельными
> полями.

Это я понял... вот только не понял как сделать правильно.


 
MBo ©   (2006-03-01 14:35) [14]

>Knight
если у тебя часто идет доступ к одному из полей, можно сделать для него отдельное индексированное свойство


 
TUser ©   (2006-03-01 14:36) [15]

Чем плохо [8] я все-таки не понимаю. Ну, молучаем мы некоторый "нечестный" доступ к полю класса, и что? Мы сами так захотели, - сами и пользуемся.


 
Knight ©   (2006-03-01 14:37) [16]


> [14] MBo ©   (01.03.06 14:35)

К одному нет... к произвольному.


 
Knight ©   (2006-03-01 14:40) [17]

При смене record на class, ошибка пропадает. Т.е. будет работать произвольный доступ?
в Get поqдёт Result:=ЗначениеИзTList[Index]...
а в Put что делать?


 
Kerk ©   (2006-03-01 14:42) [18]

TUser ©   (01.03.06 14:36) [15]

> Чем плохо [8] я все-таки не понимаю. Ну, молучаем мы некоторый
> "нечестный" доступ к полю класса, и что? Мы сами так захотели,
>  - сами и пользуемся.

Я тоже не вижу чем оно хуже использования класса.


 
jack128 ©   (2006-03-01 14:42) [19]

а откуда ж я знаю, что тебе нужно в Put делать.. Я обычно такие свойства вообще Read only делаю..


 
Knight ©   (2006-03-01 14:43) [20]


> [19] jack128 ©   (01.03.06 14:42)

А как тогда значения изменяешь?


 
MBo ©   (2006-03-01 14:43) [21]

>а в Put что делать?
при работе с полем класса выполняется только Get


 
Knight ©   (2006-03-01 14:44) [22]


> [21] MBo ©   (01.03.06 14:43)

Get и с record прекрастно работает...


 
Knight ©   (2006-03-01 14:45) [23]

Чё-то мне коллекции по этому поводу задействовать не хочется. По логике, дожно быть всё просто...


 
MBo ©   (2006-03-01 14:48) [24]

>Knight ©   (01.03.06 14:44) [22]
>Get и с record прекрастно работает...

Не о том речь.
При выполнении кода
Container.ObjectProp[i].Field1 := Smth;
Вызывается только метод Get - получили объект, поменяли его поле (или свойство). Put не вызывается - этот метод используется только при замене объекта.


 
Kerk ©   (2006-03-01 14:48) [25]

Knight ©   (01.03.06 14:43) [20]

> А как тогда значения изменяешь?

Причем тут значения? Put заменяет ссылку на класс.


 
Knight ©   (2006-03-01 14:50) [26]

Точно!... А я смотрю, что-то мне в моём посте не нравится %)))

Спасибо! :)



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

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

Наверх




Память: 0.53 MB
Время: 0.055 c
15-1141204071
Kerk
2006-03-01 12:07
2006.03.26
Ask Yahoo


15-1141191597
Ega23
2006-03-01 08:39
2006.03.26
Не високосный, но всё-таки: С Днём рождения! 29 февраля


2-1141920953
Nirvana
2006-03-09 19:15
2006.03.26
Вопрос о переносе слов в


2-1142056505
The X
2006-03-11 08:55
2006.03.26
Ввод даты в поле Date.


3-1139147979
OldNick
2006-02-05 16:59
2006.03.26
Удаленные записи в paradox