Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.038 c
15-1164182146
Уважаемый Ламер
2006-11-22 10:55
2006.12.10
Не работают breakpoints


2-1164131457
Фесс
2006-11-21 20:50
2006.12.10
Работа со списком


2-1164261109
Pavor
2006-11-23 08:51
2006.12.10
Как добавить запись в таблицу через ADO?


15-1163851830
Виталий___
2006-11-18 15:10
2006.12.10
Анализ свободных ответов


8-1145904682
Pojarnik
2006-04-24 22:51
2006.12.10
Отлов WM_CAP... сообщений





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский