Форум: "Начинающим";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
ВнизНе присваиваются значения! Найти похожие ветки
← →
Виталик 2006 (2006-11-18 14:45) [0]Здравствуйте, мастера. Помогите решить задачку:
Вот у меня есть запись
TCircle = record
x, y, r: integer;
end;
Дальше мне нужно обрабатывать много окружностей - делаю класс на основе TList
TCircles = class(TList)
private
function GetCircle(index: integer): TCircle;
procedure SetCircle(index: integer; const Value: TCircle);
public
property Items[index: integer]: TCircle read GetCircle write SetCircle; default;
...
Всё отлично работает кроме одной необходимой вещи.
Я не могу использовать например такое:
Circles[0].x:=10;
..а очень хочется=)
Как я понимаю, можно только целиком присваивать
Circles[0] := OtherCircle;
что очень неудобно, если мне нужно только х поменять.
Подскажите, как исправить...
← →
MBo © (2006-11-18 14:55) [1]можно добавить дополнительные индексированные свойства для X, Y и R
← →
Виталик 2006 (2006-11-18 15:00) [2]> MBo © (18.11.06 14:55) [1]
> можно добавить дополнительные индексированные свойства для X, Y и R
напишите по подробнее, как это?
← →
MBo © (2006-11-18 15:02) [3]>как это?
Точно также, как Items, только без Default.
А вообще тебе нужен класс или можно массивом обойтись?
← →
Виталик 2006 (2006-11-18 17:07) [4]Да, класс нужен.
Т. е. так
property Items[index, ParamIndex: integer]: integer read GetParam write SetParam; default;
Но ведь это не очень читабельно.
И чисто теоретически, если бы у записи были поля разных типов...
Неужели это единственный способ?
← →
Palladin © (2006-11-18 17:12) [5]
PCircle = ^TCircle
TCircle = record
x, y, r: integer;
end;
TCircles = class(TList)
private
function GetCircle(index: integer): PCircle;
public
property Items[index: integer]: PCircle read GetCircle; default;
...
← →
Виталик 2006 (2006-11-18 17:22) [6]> Palladin © (18.11.06 17:12) [5]
супер! спасибо.
Правда придётся теперь в параметрах всех функций
TCircle на PCircle менять.. %)
и маленький вопросик:
почему работает даже
Circles[0].x:=10;
ведь должно быть
Circles[0]^.x:=10;
?
← →
Palladin © (2006-11-18 17:30) [7]компилятор по умолчанию автоматически разименовывает типы... если бы было PCircle=Pointer; ничего подобного не происходило, но явно указано PCircle=^TCricle; потому вопросов по полям записи у компилятора не возникает...
← →
Palladin © (2006-11-18 17:32) [8]конечно же это относится к Delphi, с какой версии не знаю, в d6 точно, ни в одной из версий TP/BP такое не прокатит, там нужен ^
да и class и property там тоже не прокатят :))
← →
guav © (2006-11-18 18:11) [9]Кстати, два подряд разыменование автоматичеки не делаются (только одно из них).
← →
Palladin © (2006-11-18 18:12) [10]а?
← →
guav © (2006-11-18 18:22) [11]> [10] Palladin © (18.11.06 18:12)
> а?
ага.var
R0: TRect;
R1: PRect;
R2: ^PRect;
begin
R1 := @R0;
R2 := @R1;
R2^^.Left := R2^^.Right; // компилится
R2^.Left := R2^.Right; // компилится
R2.Left := R2.Right; // не компилится
end;
← →
Anatoly Podgoretsky © (2006-11-18 18:24) [12]> Palladin (18.11.2006 17:12:05) [5]
> property Items[index: integer]: PCircle read GetCircle; default;
property X[index: integer]: integer read GetCircleX
← →
Palladin © (2006-11-18 18:38) [13]
> [11] guav ©
а... :) ну есть такое
> [12] Anatoly Podgoretsky ©
ага...
property A[index: integer]: integer read GetCircleA;
property B[index: integer]: integer read GetCircleB;
property C[index: integer]: integer read GetCircleC;
property D[index: integer]: integer read GetCircleD;
property E[index: integer]: integer read GetCircleE;
property F[index: integer]: integer read GetCircleF;
property G[index: integer]: integer read GetCircleG;
property H[index: integer]: integer read GetCircleH;
property I[index: integer]: integer read GetCircleI;
property J[index: integer]: integer read GetCircleJ
property K[index: integer]: integer read GetCircleK;
property L[index: integer]: integer read GetCircleL;
property M[index: integer]: integer read GetCircleM;
property N[index: integer]: integer read GetCircleN;
property O[index: integer]: integer read GetCircleO;
property P[index: integer]: integer read GetCircleP;
property Q[index: integer]: integer read GetCircleQ;
property R[index: integer]: integer read GetCircleR;
property S[index: integer]: integer read GetCircleS;
property T[index: integer]: integer read GetCircleT;
property U[index: integer]: integer read GetCircleU;
property V[index: integer]: integer read GetCircleV;
property W[index: integer]: integer read GetCircleW;
property X[index: integer]: integer read GetCircleX;
property Y[index: integer]: integer read GetCircleY;
property Z[index: integer]: integer read GetCircleZ;
...
и еще много много букаф... особенно прикольно при изменении структуры записи...
← →
Palladin © (2006-11-18 18:39) [14]учитывая что твой вариант property еще и подразумевает write SetCircle<Letter>
← →
fog (2006-11-18 18:47) [15]
public
property Items[index: integer]: TCircle read GetCircle write SetCircle; default;
Я не могу использовать например такое:
Circles[0].x:=10;
..а очень хочется
А где объявлено property Circles? А пока - Items[0].x:=10;
← →
Palladin © (2006-11-18 18:50) [16]
> [15] fog
а недогоняющим чтоVar
Circle:TCircle;
стоит немного подрастить свой телепатор )
← →
Palladin © (2006-11-18 18:50) [17]буковку забыл
Var
Circles:TCircles;
← →
fog (2006-11-18 18:59) [18]Доращиваю - Circles.Items[0].x:=10
← →
Anatoly Podgoretsky © (2006-11-18 19:05) [19]> Palladin (18.11.2006 18:38:13) [13]
А причем тут количество, хочешь менять Х делай свойство Х
Всяко получше, чем property Items[index, ParamIndex: integer]: integer
← →
guav © (2006-11-18 19:45) [20]> [13] Palladin © (18.11.06 18:38)
> property A[index: integer]: integer read GetCircleA;
> property B[index: integer]: integer read GetCircleB;
> property C[index: integer]: integer read GetCircleC;
На самом деле и так приходится делать если хочется опубликовать поля записи (не Indexed в этом случае, разумеется).
Исходя из этих двух проблем, желательно избегать свойства-записи и использовать свойства-классы заместо их.
← →
Palladin © (2006-11-18 20:55) [21]
> [18] fog
рекомендую изучить директиву default
> [19] Anatoly Podgoretsky ©
о ParamIndex речи небыло и нет, было желание менять значение аттрибута записи...
> [20] guav ©
а свойства записи нет и есть свойство класса, которое возвращает ссылку на запись, а не саму запись, что и позволяет менять значения ее аттрибутов...
← →
Anatoly Podgoretsky © (2006-11-18 20:58) [22]> Palladin (18.11.2006 20:55:21) [21]
> о ParamIndex речи небыло и нет, было желание менять значение аттрибута записи...
Как же не было, я не руками писал, а скопировал.
А в вопросе речь про свойства, свойства X в определение класса нет
← →
Palladin © (2006-11-18 21:39) [23]
> Всяко получше, чем property Items[index, ParamIndex: integer]:
> integer
про этот paramindex у меня речи не было... об этом упомнал автор, его полностью устроило мое решение... без использования всяких paramindex
← →
Виталик 2006 (2006-11-18 21:48) [24]> guav © (18.11.06 19:45) [20]
> Исходя из этих двух проблем, желательно избегать свойства-записи и использовать свойства-классы заместо их.
Т.е. если вместо записи я сделаю
TCircle = class
x,y,r: integer;
end;
то всё заработает в варианте
TCircles = class(TList)
private
function GetCircle(index: integer): TCircle;
procedure SetCircle(index: integer; const Value: TCircle);
public
property Items[index: integer]: TCircle read GetCircle write SetCircle; default;
...
?
← →
Anatoly Podgoretsky © (2006-11-18 22:43) [25]> Palladin (18.11.2006 21:39:23) [23]
Ну так мы о разных вещах говорим :-)
← →
Anatoly Podgoretsky © (2006-11-18 22:44) [26]> Виталик 2006 (18.11.2006 21:48:24) [24]
Не заработает, поскольку нет соответствующих свойств X, Y, Z
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.10;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.041 c