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

Вниз

2 поля данных в ListBox   Найти похожие ветки 

 
dmitry83-nv ©   (2009-09-14 13:51) [0]

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

У меня такой вопрос:
Стандартный 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, а мне нужно хранить еще колличество. Хотелось бы вариант без всяких дополнительных динамических массив, хэш таблиц и т.д. Может кто сталкивался, подскажите красивый вариант!

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


 
DimaBr ©   (2009-09-14 14:34) [1]

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


 
DimaBr ©   (2009-09-14 14:35) [2]

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


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

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


 
clickmaker ©   (2009-09-14 14:59) [4]

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

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


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

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


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

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

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;


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

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


 { 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;


 
dmitry83-nv ©   (2009-09-14 16:24) [8]

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



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

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

Наверх




Память: 0.48 MB
Время: 0.009 c
15-1252159778
Ruzzz
2009-09-05 18:09
2009.11.01
Turbo Delphi не хочет компилировать .rc


15-1251776745
VillVET
2009-09-01 07:45
2009.11.01
Экран приветствия


15-1251828018
AlexDan
2009-09-01 22:00
2009.11.01
почему только один буфер обмена..?


15-1251495179
Германн
2009-08-29 01:32
2009.11.01
Опять про зрение


1-1222269356
@!!ex
2008-09-24 19:15
2009.11.01
Какие есть способы определения, нажата клавиша или нет?