Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.03;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.019 c
2-1214549615
matriza
2008-06-27 10:53
2008.08.03
преобразовать doc и xls в pdf


15-1213818885
Сергей_77
2008-06-18 23:54
2008.08.03
Разработка серьёзного ПО


4-1194052713
Kemuri
2007-11-03 04:18
2008.08.03
Буфер чтения для ReadFile


2-1215085766
lead-in
2008-07-03 15:49
2008.08.03
CreateProcess


2-1215269099
lewka
2008-07-05 18:44
2008.08.03
Перенос значения переменной