Форум: "Начинающим";
Текущий архив: 2008.08.03;
Скачать: [xml.tar.bz2];
ВнизPointer + Integer Найти похожие ветки
← →
Максим В. (2008-07-04 10:35) [0]Совсем забыл Delphi. У меня есть ListView, в который надо добавить запись и данные (Data):
with ListView1.Items.Add do
begin
Caption := "..."
...
Data := число
end;
Я хочу в Data занести число (Integer) и потом его в нужный момент из нужного Item"a считать.
Как это сделать?
← →
Ega23 © (2008-07-04 10:38) [1]var
p : PInteger;
begin
New(p);
p^:=213;
.....Data := p;
end;
← →
Поросенок Винни-Пух © (2008-07-04 10:39) [2]ой ой ой .....
← →
Поросенок Винни-Пух © (2008-07-04 10:41) [3]зачем же так жоско?
Data := Pointer(213);
← →
Ega23 © (2008-07-04 10:42) [4]
> зачем же так жоско?
Чтобы знал, что на любую структуру можно указатель забить, не только на Integer
← →
DrPass © (2008-07-04 10:44) [5]
> Ega23 © (04.07.08 10:42) [4]
>
> > зачем же так жоско?
>
>
> Чтобы знал, что на любую структуру можно указатель забить,
> не только на Integer
Ага, а потом он так и будет делать для любой структуры, в том числе и для Integer, и при этом еще и память освобождать не будет :)
← →
McSimm © (2008-07-04 13:05) [6]
> зачем же так жоско?
> Data := Pointer(213);
Попробуйте так значение -1 хранить
← →
Поросенок Винни-Пух © (2008-07-04 13:09) [7]Пробовал. Храню с удовольствием.
← →
McSimm © (2008-07-04 13:13) [8]Подзабыл видать.
Спутал с Combo/ListBox
← →
Поросенок Винни-Пух © (2008-07-04 13:14) [9]procedure TForm1.Button1Click(Sender: TObject);
var p : Pointer;
begin
p := Pointer(-1);
ShowMessage(IntToStr(Integer(p)));
end;
← →
McSimm © (2008-07-04 13:20) [10]Это понятно.
Была проблема, помнится, при попытках хранить так Integer с приведением типа в Items.Object.
← →
Поросенок Винни-Пух © (2008-07-04 13:22) [11]ну или на худой конец
if not Assigned(p) then
-1
else
Integer(p)
← →
McSimm © (2008-07-04 13:26) [12]а ноль ?
:)
← →
Leonid Troyanovsky © (2008-07-04 13:27) [13]
> Поросенок Винни-Пух © (04.07.08 13:22) [11]
> ну или на худой конец
with ListBox1 do
begin
AddItem("xxx", TObject(-1));
Caption := Format("%p", [Items.Objects[Count-1]]);
end;
--
Regards, LVT.
← →
Поросенок Винни-Пух © (2008-07-04 13:28) [14]не надо в меня тыкать обджекстами.
эт оффтоп.
← →
McSimm © (2008-07-04 13:30) [15]
> Leonid Troyanovsky © (04.07.08 13:27) [13]
> with ListBox1 do
> begin
> AddItem("xxx", TObject(-1));
> Caption := Format("%p", [Items.Objects[Count-1]]);
> end;
И это не выводит ошибку Out of bounds ?
Раньше выводило
← →
McSimm © (2008-07-04 13:30) [16]я просто никак проверить не могу
← →
Leonid Troyanovsky © (2008-07-04 13:34) [17]
> Поросенок Винни-Пух © (04.07.08 13:28) [14]
> не надо в меня тыкать обджекстами.
> эт оффтоп.
Могу тыкнуть неофтопичным Pointer.
> McSimm © (04.07.08 13:30) [15]
> И это не выводит ошибку Out of bounds ?
И сейчас выодит.
--
Regards, LVT.
← →
Поросенок Винни-Пух © (2008-07-04 13:38) [18]Могу тыкнуть неофтопичным Pointer.
Ок. Готов.
← →
Поросенок Винни-Пух © (2008-07-04 13:46) [19]Поинтер он и в африке пойнер.
привести к инту его можно в любом случае.
← →
Leonid Troyanovsky © (2008-07-04 13:46) [20]
> Поросенок Винни-Пух © (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:48) [21]Но е мое. Опять двадцать пять.
У нас в первоисточнике свойтство типа Pointer.
И предположение, что его не всегда можно использовать как четырехбайтный контейнер для integer.
← →
McSimm © (2008-07-04 13:49) [22]
> Поинтер он и в африке пойнер.
> привести к инту его можно в любом случае.
Привести - можно. Хранить такой pointer не всегда удобно.
← →
han_malign © (2008-07-04 13:52) [23]
> Была проблема, помнится, при попытках хранить так 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;
← →
Anatoly Podgoretsky © (2008-07-04 13:55) [24]
> Была проблема, помнится, при попытках хранить так Integer
> с приведением типа в Items.Object.
Проблема есть с объектами с автоматическим сроком жизни, например со строками, хотя они совместимы по присваиванию.
← →
Leonid Troyanovsky © (2008-07-04 13:58) [25]
> 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.
← →
han_malign © (2008-07-04 13:59) [26]ну да, в 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 14:06) [27]
> Поросенок Винни-Пух © (04.07.08 13:48) [21]
> Но е мое. Опять двадцать пять.
> У нас в первоисточнике свойтство типа Pointer.
> И предположение, что его не всегда можно использовать как
> четырехбайтный контейнер для integer.
Какая разница, Pointer vs TObject, тебе ж сказали, что, во-ще,
речь идет не о каких Pointer, а LONG as LB_GETITEMDATA.
И было не предположение, а замечание о том, что к оному
полю приложили кривые ручки некие борландовские двоечники
в реализации Objects для листбокса и комбобокса.
--
Regards, LVT.
← →
Поросенок Винни-Пух © (2008-07-04 14:09) [28]разница такая, что когда я работаю с поинтером я работаю с поинтером а не с классами и их методами.
И четыре байта превратить в инт я всегда сумею.
← →
Игорь Шевченко © (2008-07-04 14:12) [29]А я не совсем понял, в чем проблема в ListBox и в ComboBox ?
← →
McSimm © (2008-07-04 14:14) [30]Может я ошибаюсь, но мне казалось, что работа с этими list ведется через сообщения WinAPI и значение -1 возвращается при выходе за границы массива.
Т.е. является специальным не для VCL, а для объекта Windows
← →
Palladin © (2008-07-04 14:15) [31]
> Игорь Шевченко © (04.07.08 14:12) [29]
в этом :)
CB_ERR = -1
LB_ERR = -1;
← →
McSimm © (2008-07-04 14:15) [32]
> в чем проблема в ListBox и в ComboBox ?
При попытке извлечь значение -1 из Objects поднимается исключение выхода за границы
← →
McSimm © (2008-07-04 14:17) [33]Вот, нашел на Королевстве
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1035
← →
Leonid Troyanovsky © (2008-07-04 14:31) [34]
> McSimm © (04.07.08 14:17) [33]
> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1035
Слать напрямую LB_GETITEMDATA тоже бесполезно,
бо если вернется -1, то это, дейс-но, ошибка (msdn).
Так, что, насчет двоешников, беру свои слова обратно -
они копались в других местах.
--
Regards, LVT.
← →
Игорь Шевченко © (2008-07-04 14:36) [35]McSimm © (04.07.08 14:17) [33]
"Если таким образом связать со строкой значение –1, то при попытке получить это значение возникнет исключение EStringListError с комментарием "List index out of bounds". "
Это имеется в виду ? Ну так это не проблема, я извиняюсь. Прежде чем что-то связывать извращенным способом, нефигово бы посмотреть реализацию.
Можно точно так же говорить LB_SETITEMDATA со значением -1 и потом долго удивляться, почему LB_GETITEMDATA возвращает LB_ERR, однако этот факт в мире программистов почему-то не вызывает наездов в сторону MS, а среди дельфистов пнуть Борланд лишний раз (я не тебя имею в виду) - так милое дело.
← →
McSimm © (2008-07-04 14:50) [36]Не проблема, согласен. Я лично считаю, что в контейнере типа TObject надо хранить наследника TObject, а в Pointer - указатель, даже на Integer.
(Правда сам я не всегда так поступал, излишняя принципиальность тоже вредит :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.08.03;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.006 c