Главная страница
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.032 c
15-1251873457
Ak47
2009-09-02 10:37
2009.11.01
Перевод компьютерных терминов


6-1209385182
Tornado
2008-04-28 16:19
2009.11.01
Проверка удаленного компьютера


15-1252044372
Дмитрий С
2009-09-04 10:06
2009.11.01
Где ошибка в настройке mod_rewrite?


15-1251978221
Ak47
2009-09-03 15:43
2009.11.01
проверить содержится ли значение в массиве


2-1252614276
Евгений Р.
2009-09-11 00:24
2009.11.01
Событие при сворачивании формы