![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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.
Вопросы по поискуи использованиюготовых компонентов, редакторов или экспертов являются нарушениемтематики и могут быть удалены.