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

Вниз

Динамический массив в компоненте...   Найти похожие ветки 

 
Knight ©   (2004-04-15 20:33) [0]

Поясните такой момент... есть компонент, в него входит динамический массив (например, FItems) из записей (TItem=record...), есть свойство:
- property ItemIndex:Integer read FItemIndex write SetItemIndex;
который отображает и устанавливает номер текущего элемента массива.

Вопрос: как сделать свойство, которое дало доступ к полям текущей записи из массива без открытия всего массива:
- вместо FItems[N].A, просто Item.A
понимаю, что тут без поинтеров не обойтись... но как?


 
VMcL ©   (2004-04-15 20:42) [1]

>>Knight ©  (15.04.04 20:33)

property CurrentItem: TItem read GetCurrentItem;

fuinction Txx.GetCurrentItem: TItem;
begin
  // тут проверки для FItemIndex
  // ...
  Result := FItems[FItemIndex];
end;


 
Mim1   (2004-04-15 20:51) [2]

Например TList для хранения ссылок на обьекты использует динамический массив.

 protected
   function Get(Index: Integer): Pointer;
   procedure Put(Index: Integer; Item: Pointer);
 ...
 public
   property Items[Index: Integer]: Pointer read Get write Put; default;
 ...
 
---------------------

function TList.Get(Index: Integer): Pointer;
begin
 if (Index < 0) or (Index >= FCount) then
   Error(@SListIndexError, Index);
 Result := FList^[Index];
end;

procedure TList.Put(Index: Integer; Item: Pointer);
var
 Temp: Pointer;
begin
 if (Index < 0) or (Index >= FCount) then
   Error(@SListIndexError, Index);
 if Item <> FList^[Index] then
 begin
   Temp := FList^[Index];
   FList^[Index] := Item;
   if Temp <> nil then
     Notify(Temp, lnDeleted);
   if Item <> nil then
     Notify(Item, lnAdded);
 end;
end;



 
Knight ©   (2004-04-15 21:43) [3]

Звиняйте, хлопцы... Немного не полностью написал... имелось в виду, свойство которое даёт доступ к любому полю текущей записи и на чтение, и на запись с внесением изменений в FItems[ItemIndex] через процедуру в write...

Наверно это не реально без создания серии свойств, каждое из которых отвечает за своё поле текущей записи.


 
Knight ©   (2004-04-15 23:56) [4]

Придётся переделать, заменив record на class... тогда должно пойти.


 
Rouse_ ©   (2004-04-16 00:18) [5]

> заменив record на class
тогда уж TCollection используй, а то понаворочаешь еще :)


 
Knight ©   (2004-04-16 01:42) [6]


> [5] Rouse_ ©   (16.04.04 00:18)
> > заменив record на class
> тогда уж TCollection используй, а то понаворочаешь еще :)

Чего-чего, а понаворочать это мы могём :)
А про TCollection... надо посмотреть


 
Rouse_ ©   (2004-04-16 09:27) [7]

Вот тут про них хорошо описано:
http://www.delphikingdom.com/helloworld/tcollection.htm


 
Knight ©   (2004-04-16 09:38) [8]


> Rouse_ ©   (16.04.04 09:27) [7]

Спасибо за ссылку... уже читаю %)


 
Knight ©   (2004-04-16 10:31) [9]

В принципе тоже самое, что и у меня, но только более развитое, да ещё и с редактором свойств в design-time :)

Надо подумать... то-ли пойти по более продолжительному пути доделки своего, но при этом разобраться в некоторых вопросах, то ли по более быстрому, где уже всё за меня реализовали и осталось только это использовать... вопрос, однако... знание или время :-?


 
Mim1   (2004-04-16 14:45) [10]

Я конечна колекшен уважаю :).
Но резуотат будет сравним с примведенным мной примером.

То есть

будет работать как с (myclass+record) так и с (collection+collectionitem)
 myobj[10].name := "alpha";
 myobj[10].id := 10;
Тем не менее у клекций симпатичный способ сохранения в dfm и много других вкуснойстей, которые могут и не пригадится, а може именно они вам и нужны.

PS сохранение в dfm можно реаизовать и у myclass если пронаследовать от tpersistent.


 
Knight ©   (2004-04-16 23:37) [11]

>> [10] Mim1   (16.04.04 14:45)
Мне главное было пропустить все изменения полей записи через свои процедуры без создания вороха свойств на каждое поле, для контроля и перирисовки соответствующего элемента в TPaintBox, который принадлежит компоненту на основе ТScrollBox. И коллекции мне очень даже понравились, тем более, что код у меня пошёл именно в этом направлении, даже функции аналогичные сделал, хотя design-time это излишне, но пусть будет... вдруг понадобится... а оно раз и есть :)



Страницы: 1 вся ветка

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
14-1081502658
}|{yk
2004-04-09 13:24
2004.05.02
Я так понял в форум Основной уже никто не смотрит


14-1081256600
Yanis
2004-04-06 17:03
2004.05.02
Сейчас буду винт ресайзить...


1-1082217633
Piter
2004-04-17 20:00
2004.05.02
TTabControl


14-1081332994
}|{yk
2004-04-07 14:16
2004.05.02
Библиотека JVCL


1-1081862767
Dentist
2004-04-13 17:26
2004.05.02
Разворачивание окна