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

Вниз

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

Наверх





Память: 0.5 MB
Время: 0.055 c
2-1142294469
Wood
2006-03-14 03:01
2006.03.26
Файл или каталог.


1-1140544055
Alextp
2006-02-21 20:47
2006.03.26
Заменитель System.AssignFile для юникодных имен


2-1142336458
Fenix
2006-03-14 14:40
2006.03.26
TreeView.


15-1141367537
Ega23
2006-03-03 09:32
2006.03.26
С Днём рождения! 3 марта


2-1141721172
dera
2006-03-07 11:46
2006.03.26
Никак не могу разобраться в чем ошибка





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский