Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.031 c
4-1075995847
TankMan
2004-02-05 18:44
2004.05.02
Полупрозрачная TPanel


3-1081251223
Multy
2004-04-06 15:33
2004.05.02
Киньте ссылки как работать в Delphi с MySQL


14-1081608838
SergeySh
2004-04-10 18:53
2004.05.02
Диск к книге DirectX (графика в проектах), автор - Михаил Краснов


7-1078495714
Islander
2004-03-05 17:08
2004.05.02
Как определить, установлен ли на компьютере Windows Media Player?


1-1082109570
Ruslan
2004-04-16 13:59
2004.05.02
Подскажите как использовать компонет RxTrayIcon!!!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский