![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамический массив структур (record) как свойство класса. [D7, XP]
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)