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

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

Динамический массив структур (record) как свойство класса. [D7, XP]


Страницы:   1 2 3

SingleStranger ©   (2009-02-11 13:19:00) 

Как реализовать?
Меня интересует способ с простым доступом к любому полю структуры.
Что-то типа того:
TRec = record
 field1: integer;
 field2: string;
end;

TSomeClass = class
 private
   FSRec: array of TRec;
   function GetSRec(Index: Integer): TRec;
   procedure SetSRec(Index: Integer; const Value: TRec);
 public
   function SRecAddNew: Integer;
   function SRecAdd(Value: TRec): Integer;
   property SRec[Index: Integer]: TRec read GetSRec write SetSRec;
end;

И доступ, чтобы был простым, примерно так:
var
 i: integer;
 r: TRec;
begin
 r.field1 := 1;
 r.field2 := 'aaa';
 i := SomeClass.SRecAdd(r);
 SomeClass.SRec[i].field2 := 'bbb';
end;

или как-то так:
var
 i: integer;
begin
 i := SomeClass.SRecAddNew();
 SomeClass.SRec[i].field2 := 'bbb';
end;


Jeer   (2009-02-13 16:12:00) [1]


> В конце-концов вообще забил. Не судьба...  :)


Я, вот, тоже на дохтурскую забил - не судьба.
Дочка подхватила эстафету, если я защитился почти в 30 лет, то она уже на стадии защиты  в 24 :)


Джо   (2009-02-13 12:33:00) [2]


> Jeer ©   (11.02.09 20:17) [38]

Спасибо.


MsGuns   (2009-02-13 12:18:00) [3]

>Ega23 ©   (13.02.09 12:11) [49]
>В конце-концов вообще забил. Не судьба...  :)

Короче, без диплома остался, типа без ВО.
Как в том анекдоте про отца и сына - ассенизаторов, где отец говорит "так всю жизнь наверху и проработаешь"
:)


Ega23   (2009-02-13 12:11:00) [4]


> И диплом тоже только три месяца?


С дипломом другая история. Как только собирался госы сдавать и защищаться - каждый раз какая-то хрень случалась. То заболел, да так, что чуть не помер, то на Чукотку командировка, то в Дагестан...
В конце-концов вообще забил. Не судьба...  :)


Anatoly Podgoretsky   (2009-02-13 11:57:00) [5]

> Ega23  (13.02.2009 10:38:47)  [47]

И диплом тоже только три месяца?


Ega23   (2009-02-13 10:38:00) [6]


> Вот так бы сразу и сказал, что, мол, привык носить часы
> на правой руке. Только зачем всех заставлять ?


Я часы вообще не нашу, у меня с часами и дипломом - просто рок какой-то. Злой.
Любые часы (электронные, механические, дорогие, дешёвые, на браслете, на ремне и т.п.) дольше трёх месяцев не задерживались.


Anatoly Podgoretsky   (2009-02-12 09:46:00) [7]

> Ну не люблю я рекорды.

Не люблю я кошек, просто ты не умеешь их готовить.


MsGuns   (2009-02-12 09:13:00) [8]

>Ega23 ©   (11.02.09 18:54) [37]
>Ну не люблю я рекорды.

Вот так бы сразу и сказал, что, мол, привык носить часы на правой руке. Только зачем всех заставлять ?


Jeer   (2009-02-11 21:15:00) [9]


> Дык я и не прошу ее решить, я прошу указать путь


Иной раз, а чаще всего - всегда, чтобы "указать" путь для решения более-менее реальной прикладной задачи, нужно ее также реально решить на основе тех.задания
А это уже переводит разговор в плоскость договорных отношений со вполне реальными финансовыми издержками для вопрошающего.


SingleStranger   (2009-02-11 21:06:00) [10]


> clickmaker ©   (11.02.09 20:41) [41]

Это детали. И реальная задача не про трусы и даже не про человека, но идея...


> Jeer ©   (11.02.09 20:45) [42]

Дык я и не прошу ее решить, я прошу указать путь из тьмы невежества к свету познания и просветления, а также благословления прошу на этом нелегком пути =) Да пусть осветит меня мудрость ваша...


Jeer   (2009-02-11 20:45:00) [11]


> Давайте я попробую приближенно описАть задачу.


Ой.. не хочу я до трусов опускаться :)

Автор ! Свою задачу, в том числе с ООП или иным подходом, надо решать самому.


clickmaker   (2009-02-11 20:41:00) [12]

> Но при этом, ВСЕГДА есть трусы

неудачный пример. Они, как раз-таки, есть не всегда. А вот рост и вес, к примеру, есть всегда. Они - и есть свойства. (хотя, тоже можно все проутрировать и свести к массиву типа "Свойство-Значение", но мы не будем впадать в крайности).
Поэтому одежда - массив. Пустой массив - вырожденный частый случай (голый человек)


Jeer   (2009-02-11 20:39:00) [13]

P.S.
Кста - под НГ вышел, оказывается, новый релиз v 4.
Батлер опять слил все в единый каталог - пральна.

Посмотрел.. по ср. с v.3* - хорошо переработано.

Однако исчезла математике ( вроде как )

Ну и ладно - не ему спорить с современными алгоритмами - у него всегда была простая, не особо эффективная, но работающая реализация:
- векторы, матрицы, компл. числа, рац.числа, статистика, 3D преобразования и пр.

Хотя жаль - довесок неслабый был.

Впрочем, по ссылке, доступны старые версии 3.* - там это должно быть.


SingleStranger   (2009-02-11 20:32:00) [14]

Давайте я попробую приближенно описАть задачу. Может быть предложите другое решение.

Например есть класс-поток, который постоянно (ПОСТОЯННО) рисует человека. Есть структура описывающая одежду человека;
TRec = record
 DressCode: integer; // штаны, например. рубашка, шляпа, и т.п.
 Color1: TColor;
 Color2: TColor;
 Color3: TColor;
 Style: integer;
end;


Ну, можно еще десяток полей придумать, не важно.
Так вот, у класса рисующего человека есть (должен быть, по задумке) динам. массив этих TRec'ов и на основании него он прорисовывает, перебирая весь массив, одежду. Но массив может быть и пуст, а может быть наполнен 10-20 предметами.
Но при этом, ВСЕГДА есть трусы =) описанные ТОЙ ЖЕ структурой и реализованные как свойств класса, через указатель (примерно так, как предлагал MsGuns (Стволы от Майкрософт, что ли? ;) ) и Sapersky [33]), т.е. они есть всегда. И в общем-то преход к другой структуре возможен, но... Надо будет просто переписать некоторые другие вещи, непосредственно к сабжу не относящиеся.
Вот отсюда и сабж. Как реализовать набор одежды, описанной структурой TRec.

P.S. Не стоит придираться к деталям, это приближенное описание.


Jeer   (2009-02-11 20:17:00) [15]


> Джо ©   (11.02.09 18:50) [36]
We're Sorry but this Project hasn't yet uploaded their personal webpage yet.
:)


Да не проблема:
http://sourceforge.net/projects/fundementals/

Давно слежу за развитием проекта David J Butler, еще со времен динозавров.
Не ошибусь, если скажу, что с первыми релизами я ознакомился еще в прошлом веке.
Пользуюсь, не всегда, но пользуюсь.

Отличная подборка классов и утилит по структурам данных, математике, потокам, системным/интернет/xml и прочее.

Просто рекомендую всем, кто не знаком с данной библиотекой - хотя бы для "изучительных" целей.

Того оно стоит.


Ega23   (2009-02-11 18:54:00) [16]


> Да понятно это все - но если плохо понимаешь, что делаешь
> - известна рекомендация "Займись тем, что у тебя получается"


Возможно у меня это просто на автомате уже получается. Ну не люблю я рекорды. Я ещё могу понять record в случае записи в файл типизированный или там при передаче по сети какой-нибудь. Но в данном конкретном случае (как у автора) я класс бы не задумываясь написал. Тем более, что если понадобится - всегда можно геттеры и сеттеры прикрутить. Лёгким движением руки.


Джо   (2009-02-11 18:50:00) [17]


> http://fundementals.sourceforge.net

We're Sorry but this Project hasn't yet uploaded their personal webpage yet.
:)


Jeer   (2009-02-11 18:46:00) [18]

Да я вообще могу вас отправить в Delphi Fundamentals
Там, пожалуй, все дельфинячьи "радости" сосредоточены. :)
В том числе и такого типа.

http://fundementals.sourceforge.net


Jeer   (2009-02-11 18:41:00) [19]


> Ну нормальные варианты. Только я бы всё-таки потомка от
> TList написал. Дабы dispose каждый раз руками не дёргать.
>


Да понятно это все - но если плохо понимаешь, что делаешь - известна рекомендация "Займись тем, что у тебя получается"


Sapersky   (2009-02-11 18:41:00) [20]

"Фишка" реализуется простым with

Видимо так:

PRec = ^TRec;
TSomeClass = class
private
  function GetSRec(Index: Integer): PRec;
public
  property SRec[Index: Integer]: PRec read GetSRec;
end;

function TSomeClass.GetSRec(Index: Integer): PRec;
begin
Result := @FSRec[Index];
end;

...
begin
With SomeClass.SRec[i]^ do begin
 field1 := 1;
 field2 := 'bbb';
end;

Хотя из дополнительных возможностей, которые дают Get/Set функции, здесь можно реализовать только контроль индексов.

Jeer ©   (11.02.09 18:15) [31]

Слава рЕкордам! Сотрём все классы! :)
http://sapersky.narod.ru/files/Arrays.rar
(Arr_AddItem, Arr_DelItem)


Страницы:   1 2 3

Наверх

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