Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Pointer + Integer


Страницы:   1 2

Максим В. ©   (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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо