Форум: "Прочее";
Текущий архив: 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.044 c