![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Pointer + Integer
Максим В. © (2008-07-04 10:35:00)Совсем забыл Delphi. У меня есть ListView, в который надо добавить запись и данные (Data):
with ListView1.Items.Add do
begin
Caption := '...'
...
Data := число
end;
Я хочу в Data занести число (Integer) и потом его в нужный момент из нужного Item'a считать.
Как это сделать?
McSimm (2008-07-04 14:50:00) [1]Не проблема, согласен. Я лично считаю, что в контейнере типа TObject надо хранить наследника TObject, а в Pointer - указатель, даже на Integer.
(Правда сам я не всегда так поступал, излишняя принципиальность тоже вредит :)
Игорь Шевченко (2008-07-04 14:36:00) [2]McSimm © (04.07.08 14:17) [33]
"Если таким образом связать со строкой значение –1, то при попытке получить это значение возникнет исключение EStringListError с комментарием "List index out of bounds". "
Это имеется в виду ? Ну так это не проблема, я извиняюсь. Прежде чем что-то связывать извращенным способом, нефигово бы посмотреть реализацию.
Можно точно так же говорить LB_SETITEMDATA со значением -1 и потом долго удивляться, почему LB_GETITEMDATA возвращает LB_ERR, однако этот факт в мире программистов почему-то не вызывает наездов в сторону MS, а среди дельфистов пнуть Борланд лишний раз (я не тебя имею в виду) - так милое дело.
Leonid Troyanovsky (2008-07-04 14:31:00) [3]
> McSimm © (04.07.08 14:17) [33]
> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1035
Слать напрямую LB_GETITEMDATA тоже бесполезно,
бо если вернется -1, то это, дейс-но, ошибка (msdn).
Так, что, насчет двоешников, беру свои слова обратно -
они копались в других местах.
--
Regards, LVT.
McSimm (2008-07-04 14:17:00) [4]Вот, нашел на Королевстве
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1035
McSimm (2008-07-04 14:15:00) [5]
> в чем проблема в ListBox и в ComboBox ?
При попытке извлечь значение -1 из Objects поднимается исключение выхода за границы
Palladin (2008-07-04 14:15:00) [6]
> Игорь Шевченко © (04.07.08 14:12) [29]
в этом :)
CB_ERR = -1
LB_ERR = -1;
McSimm (2008-07-04 14:14:00) [7]Может я ошибаюсь, но мне казалось, что работа с этими list ведется через сообщения WinAPI и значение -1 возвращается при выходе за границы массива.
Т.е. является специальным не для VCL, а для объекта Windows
Игорь Шевченко (2008-07-04 14:12:00) [8]А я не совсем понял, в чем проблема в ListBox и в ComboBox ?
Поросенок Винни-Пух (2008-07-04 14:09:00) [9]разница такая, что когда я работаю с поинтером я работаю с поинтером а не с классами и их методами.
И четыре байта превратить в инт я всегда сумею.
Leonid Troyanovsky (2008-07-04 14:06:00) [10]
> Поросенок Винни-Пух © (04.07.08 13:48) [21]
> Но е мое. Опять двадцать пять.
> У нас в первоисточнике свойтство типа Pointer.
> И предположение, что его не всегда можно использовать как
> четырехбайтный контейнер для integer.
Какая разница, Pointer vs TObject, тебе ж сказали, что, во-ще,
речь идет не о каких Pointer, а LONG as LB_GETITEMDATA.
И было не предположение, а замечание о том, что к оному
полю приложили кривые ручки некие борландовские двоечники
в реализации Objects для листбокса и комбобокса.
--
Regards, LVT.
han_malign (2008-07-04 13:59:00) [11]ну да, в ListBox тоже...
function TListBoxStrings.GetObject(Index: Integer): TObject;
begin
if ListBox.Style in [lbVirtual, lbVirtualOwnerDraw] then
Result := ListBox.DoGetDataObject(Index)
else
begin
Result := TObject(ListBox.GetItemData(Index));
if Longint(Result) = LB_ERR then Error(SListIndexError, Index);
end;
end;
Leonid Troyanovsky (2008-07-04 13:58:00) [12]
> han_malign © (04.07.08 13:52) [23]
> только в ComboBox
function TListBoxStrings.GetObject(Index: Integer): TObject;
begin
if ListBox.Style in [lbVirtual, lbVirtualOwnerDraw] then
Result := ListBox.DoGetDataObject(Index)
else
begin
Result := TObject(ListBox.GetItemData(Index));
if Longint(Result) = LB_ERR then Error(SListIndexError, Index);
end;
end;
--
Regards, LVT.
Anatoly Podgoretsky (2008-07-04 13:55:00) [13]
> Была проблема, помнится, при попытках хранить так Integer
> с приведением типа в Items.Object.
Проблема есть с объектами с автоматическим сроком жизни, например со строками, хотя они совместимы по присваиванию.
han_malign (2008-07-04 13:52:00) [14]
> Была проблема, помнится, при попытках хранить так Integer с приведением типа в Items.Object.
только в ComboBox
{ Combo Box return Values }
{$EXTERNALSYM CB_OKAY}
CB_OKAY = 0;
{$EXTERNALSYM CB_ERR}
CB_ERR = -1;
{$EXTERNALSYM CB_ERRSPACE}
CB_ERRSPACE = -2;
function TCustomComboBoxStrings.GetObject(Index: Integer): TObject;
begin
Result := TObject(SendMessage(ComboBox.Handle, CB_GETITEMDATA, Index, 0));
if Longint(Result) = CB_ERR then
Error(SListIndexError, Index);
end;
McSimm (2008-07-04 13:49:00) [15]
> Поинтер он и в африке пойнер.
> привести к инту его можно в любом случае.
Привести - можно. Хранить такой pointer не всегда удобно.
Поросенок Винни-Пух (2008-07-04 13:48:00) [16]Но е мое. Опять двадцать пять.
У нас в первоисточнике свойтство типа Pointer.
И предположение, что его не всегда можно использовать как четырехбайтный контейнер для integer.
Поросенок Винни-Пух (2008-07-04 13:46:00) [17]Поинтер он и в африке пойнер.
привести к инту его можно в любом случае.
Leonid Troyanovsky (2008-07-04 13:46:00) [18]
> Поросенок Винни-Пух © (04.07.08 13:38) [18]
> Ок. Готов.
with ListBox1 do
begin
AddItem('xxx', Pointer(-1));
Caption := Format('%p', [Items.Objects[Count-1]]);
end;
И дело тут вовсе не в Objects (aka LB_SETITEMDATA)
--
Regards, LVT.
Поросенок Винни-Пух (2008-07-04 13:38:00) [19]Могу тыкнуть неофтопичным Pointer.
Ок. Готов.
Leonid Troyanovsky (2008-07-04 13:34:00) [20]
> Поросенок Винни-Пух © (04.07.08 13:28) [14]
> не надо в меня тыкать обджекстами.
> эт оффтоп.
Могу тыкнуть неофтопичным Pointer.
> McSimm © (04.07.08 13:30) [15]
> И это не выводит ошибку Out of bounds ?
И сейчас выодит.
--
Regards, LVT.