Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1215350613
Сашик
2008-07-06 17:23
2008.08.03
Удаление множества записей (SQL, Access)


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


2-1214924771
blazerad
2008-07-01 19:06
2008.08.03
Полупрозрачные формы


2-1215332395
RealSwift
2008-07-06 12:19
2008.08.03
Thread creation error - Недостаточно памяти


2-1214849705
blazerad
2008-06-30 22:15
2008.08.03
Ввод пароля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский