Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.013 c
1-1222068508
Decoding
2008-09-22 11:28
2009.11.01
CPL


4-1221223497
ganj
2008-09-12 16:44
2009.11.01
Скопировать выделенный текст а вктивном окне


2-1252447989
TyoshA
2009-09-09 02:13
2009.11.01
Послать нажатие книпки неактивному окну


15-1251692909
vrem
2009-08-31 08:28
2009.11.01
26 призрачных дисков


6-1209327530
HHNick
2008-04-28 00:18
2009.11.01
много поточность и IdHTTPServer (Indy)




   Наверх