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

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

2 поля данных в ListBox [D7, WinXP]


dmitry83-nv ©   (2009-09-14 13:51:00) 

Доброго времени суток!

У меня такой вопрос:
Стандартный ListBox имеет 1 поле для хранения идентификаторов, а мне нужно 2.

for i:=1 to ADOTableWashServices.RecordCount do
Begin       ListBox_WashServices.Items.AddObject(ADOTableWashServices.FieldByName('Name').As String, TObject(ADOTableWashServices.FieldByName('Id_Service').AsInteger));
ADOTableWashServices.Next;
end;

Таким образом я заполняю ListBox и в поле данных записываю Id, а мне нужно хранить еще колличество. Хотелось бы вариант без всяких дополнительных динамических массив, хэш таблиц и т.д. Может кто сталкивался, подскажите красивый вариант!

Заранее благодарен.


dmitry83-nv   (2009-09-14 16:24:00) [1]

Спасибо за быструю помощь! Почему-то мне в голову не пришло использовать Record. Хороший вариант, можно сколько угодно полей привязать. В моем случае нужно 2 и в силу особенностей реальзации, а также того, что мне лень переделывать, мнре вполне подойдет вариант с комбинированием "CombineIDAndCount". Особое спасибо авторам этих двух вариантов.


Nutz   (2009-09-14 15:21:00) [2]

или же, как вариант:


 { TCustomItem }

 PCustomItem = ^TCustomItem;
 TCustomItem = packed record
   ID, Count: Integer;
 end;

 { TItem }

 TItem = class
 private
   FItem: TCustomItem;
 public
   constructor Create(AID, ACount: Integer);
   { properties }
   property Item: TCustomItem read FItem write FItem;
 end;

{ TItem }

constructor TItem.Create(AID, ACount: Integer);
begin
 with FItem do
 begin
   ID := AID;
   Count := ACount;
 end;
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
 ListBox1.Items.AddObject('A', CombineIDAndCount(1, 100));
 ListBox1.Items.AddObject('B', CombineIDAndCount(2, 200));
end;


Nutz   (2009-09-14 15:20:00) [3]

если задача позволяет, то можно так:

function CombineIDAndCount(ID, Count: Integer): TObject;
begin
 with TSmallPoint(Result) do
 begin
   X := ID;
   Y := COunt;
 end;
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
 ListBox1.Items.AddObject('A', CombineIDAndCount(1, 100));
 ListBox1.Items.AddObject('B', CombineIDAndCount(2, 200));
end;


Медвежонок Пятачок   (2009-09-14 15:11:00) [4]

Даже ежели будущее наступит завтра, то все равно TObject и указатель на рекорд будут занимать одинаковое количество байт


clickmaker   (2009-09-14 14:59:00) [5]

кривой вариант, но, может, для данного случая подойдет.
интежер - 4 байта. Если и ид. и кол-во всегда влезут в 2 байта, то...

но лично я не советую. будущее может наступить быстрее, чем ожидается


Медвежонок Пятачок   (2009-09-14 14:40:00) [6]

рекорд с нужным количеством полей.
и указатель на него, приведенный к TObject в качестве второго аргумента AddObject


DimaBr   (2009-09-14 14:35:00) [7]

Используйте  ListView


DimaBr   (2009-09-14 14:34:00) [8]

Внимание!Здесьобсуждаются вопросы, связанные с разработкойкомпонентов, редакторов свойств, редакторов компонентов и экспертов IDE.
Вопросы по поискуи использованиюготовых компонентов, редакторов или экспертов являются нарушениемтематики и могут быть удалены.


Наверх

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