Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.10;
Скачать: CL | DM;

Вниз

Не присваиваются значения!   Найти похожие ветки 

 
Виталик 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.028 c
6-1153140838
xman
2006-07-17 16:53
2006.12.10
Смена IP адреса


15-1164165372
Slider007
2006-11-22 06:16
2006.12.10
С днем рождения ! 22 ноября


2-1164536274
Ded222
2006-11-26 13:17
2006.12.10
Программа занимает 20 мб памяти в Диспетчере задач.


3-1160030440
Term
2006-10-05 10:40
2006.12.10
Как работать с АДО напрямую не через компоненты


15-1164013844
Суслик
2006-11-20 12:10
2006.12.10
Хочу поднять свой уровень знания общеизвестных протоколов