Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не присваиваются значения! [D7, XP]


Страницы:   1 2

Виталик 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; потому вопросов по полям записи у компилятора не возникает...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо