![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не присваиваются значения! [D7, XP]
Виталик 2006 © (2006-11-18 14:45:00)Здравствуйте, мастера. Помогите решить задачку:
Вот у меня есть запись
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;
что очень неудобно, если мне нужно только х поменять.
Подскажите, как исправить...
Anatoly Podgoretsky (2006-11-18 22:44:00) [1]> Виталик 2006 (18.11.2006 21:48:24) [24]
Не заработает, поскольку нет соответствующих свойств X, Y, Z
Anatoly Podgoretsky (2006-11-18 22:43:00) [2]> Palladin (18.11.2006 21:39:23) [23]
Ну так мы о разных вещах говорим :-)
Виталик 2006 (2006-11-18 21:48:00) [3]> 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;
...
?
Palladin (2006-11-18 21:39:00) [4]
> Всяко получше, чем property Items[index, ParamIndex: integer]:
> integer
про этот paramindex у меня речи не было... об этом упомнал автор, его полностью устроило мое решение... без использования всяких paramindex
Anatoly Podgoretsky (2006-11-18 20:58:00) [5]> Palladin (18.11.2006 20:55:21) [21]
> о ParamIndex речи небыло и нет, было желание менять значение аттрибута записи...
Как же не было, я не руками писал, а скопировал.
А в вопросе речь про свойства, свойства X в определение класса нет
Palladin (2006-11-18 20:55:00) [6]
> [18] fog
рекомендую изучить директиву default
> [19] Anatoly Podgoretsky ©
о ParamIndex речи небыло и нет, было желание менять значение аттрибута записи...
> [20] guav ©
а свойства записи нет и есть свойство класса, которое возвращает ссылку на запись, а не саму запись, что и позволяет менять значения ее аттрибутов...
guav (2006-11-18 19:45:00) [7]> [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 в этом случае, разумеется).
Исходя из этих двух проблем, желательно избегать свойства-записи и использовать свойства-классы заместо их.
Anatoly Podgoretsky (2006-11-18 19:05:00) [8]> Palladin (18.11.2006 18:38:13) [13]
А причем тут количество, хочешь менять Х делай свойство Х
Всяко получше, чем property Items[index, ParamIndex: integer]: integer
fog (2006-11-18 18:59:00) [9]Доращиваю - Circles.Items[0].x:=10
Palladin (2006-11-18 18:50:00) [10]буковку забыл
Var
Circles:TCircles;
Palladin (2006-11-18 18:50:00) [11]
> [15] fog
а недогоняющим что
Var
Circle:TCircle;
стоит немного подрастить свой телепатор )
fog (2006-11-18 18:47:00) [12]
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:39:00) [13]учитывая что твой вариант property еще и подразумевает write SetCircle<Letter>
Palladin (2006-11-18 18:38:00) [14]
> [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;
...
и еще много много букаф... особенно прикольно при изменении структуры записи...
Anatoly Podgoretsky (2006-11-18 18:24:00) [15]> Palladin (18.11.2006 17:12:05) [5]
> property Items[index: integer]: PCircle read GetCircle; default;
property X[index: integer]: integer read GetCircleX
guav (2006-11-18 18:22:00) [16]> [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;
Palladin (2006-11-18 18:12:00) [17]а?
guav (2006-11-18 18:11:00) [18]Кстати, два подряд разыменование автоматичеки не делаются (только одно из них).
Palladin (2006-11-18 17:32:00) [19]конечно же это относится к Delphi, с какой версии не знаю, в d6 точно, ни в одной из версий TP/BP такое не прокатит, там нужен ^
да и class и property там тоже не прокатят :))
Palladin (2006-11-18 17:30:00) [20]компилятор по умолчанию автоматически разименовывает типы... если бы было PCircle=Pointer; ничего подобного не происходило, но явно указано PCircle=^TCricle; потому вопросов по полям записи у компилятора не возникает...