Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

ListBox.AddItem


валя ©   (11.03.19 19:05

Здравствуйте. Я добавляю записи в ListBox и какую либо служебную информацию к ней через TObject так:

ListBox.AddItem('Item_1', TObject(1));

Подскажите как не удаляя и добавляя запись заново, изменить по адресу где лежит этот TObject значение "1" на какое либо другое.


Внук ©   (11.03.19 21:55[1]

Хотя вопрос сформулирован коряво, видимо имеется в виду что-то вроде этого:


var
 I: integer;

...
 I := ListBox.AddItem('Item_1', TObject(1));
 ListBox.Objects[I] := TObject(2);


валя ©   (12.03.19 22:02[2]

А таким образом: ListBox.AddItem('Item_1', TObject(1));
можно ли запихивать более одного значения, не прибегая к созданию своего класса? Ведь тогда прийдется создавать и уничтожать данный объект самостоятельно.


sniknik ©   (13.03.19 00:11[3]

procedure TForm1.Button4Click(Sender: TObject);
type
 TIntRec =  packed record
   Half: Word;
   Quart1, Quart2: byte;
 end;

 TSet = set of 0..31;
var
 IntRec: TIntRec;
 S: TSet;
begin
 IntRec.Half  := 1;
 IntRec.Quart1:= 2;
 IntRec.Quart2:= 3;
 ListBox.AddItem('Item_1', TObject(IntRec));
 IntRec.Half  := 4;
 IntRec.Quart1:= 5;
 IntRec.Quart2:= 6;
 ListBox.AddItem('Item_2', TObject(IntRec));
 IntRec.Half  := 7;
 IntRec.Quart1:= 8;
 IntRec.Quart2:= 9;
 ListBox.AddItem('Item_3', TObject(IntRec));

 S:= [1, 15, 21];
 ListBox.AddItem('Item_4', TObject(S));
end;

procedure TForm1.Button5Click(Sender: TObject);
type
 TIntRec =  packed record
   Half: Word;
   Quart1, Quart2: byte;
 end;
var
 IntRec: TIntRec;
begin
 if ListBox.ItemIndex = -1 then Exit;

 IntRec:= TIntRec(ListBox.Items.Objects[ListBox.ItemIndex]);
 Edit1.Text:= IntToStr(IntRec.Half)+':'+IntToStr(IntRec.Quart1)+':'+IntToStr(IntRec.Quart2);
 Edit2.Text:= IntToStr(TIntRec(ListBox.Items.Objects[ListBox.ItemIndex]).Half);
end;


Германн ©   (13.03.19 02:28[4]


> валя ©   (12.03.19 22:02) [2]
>
> А таким образом: ListBox.AddItem('Item_1', TObject(1));
> можно ли запихивать более одного значения, не прибегая к
> созданию своего класса? Ведь тогда прийдется создавать и
> уничтожать данный объект самостоятельно.

Можно.
В принципе в свойстве TStrings.Objects[] хранится всего лишь целое число. 32-х битное или 64-х битное в зависимости от разрядности ОС, под которую пишется программа.
Так что всё зависит от того какие "значения" вы хотите там хранить.

P.S. И-краткое в слове придётся - лишняя.


ВладОшин ©   (14.03.19 11:25[5]

var
 P: Pointer;
 V: Variant;
 procedure ShowValue(P: Pointer);
 var
  s: string;
 begin
   s := string(Variant( P^ ));
   ShowMessage(s);
 end;
begin
 P := addr(V);
 ListBox1.AddItem('Item_1', TObject(P) );
 V := 1;
 ShowValue(ListBox1.Items.Objects[0]);
 V := now;
 ShowValue(ListBox1.Items.Objects[0]);
 V := 'hello';
 ShowValue(ListBox1.Items.Objects[0]);


sniknik ©   (14.03.19 18:49[6]

ВладОшин ©   (14.03.19 11:25) [5]
вспомнилось... давно было,
дискету принесли говорят вот база клиента, посмотри в чем проблема...
база? на дискете? она пустая почти пол мегабайта (access), а чуть поработать на дискету не влезет (1.47 мегабайта).
не, не, все влезло, мы еще для гарантии несколько копий записали, сам контролировал (менеджер).
блин, даже не смотря скажу, если несколько копий влезло, то она "покоцана" возможно до 0-ля байт...
...
...
в общем базы там не было, как понимаете, были линк файлы ведущие на диск C: оставшийся у клиента, с номерами (хх), первая копия, вторая и т.д. штук 7 "для  гарантии" на копировали.

даже не знаю к чему я это вспомнил... так просто, наверное.


Германн ©   (15.03.19 02:21[7]


> ВладОшин ©   (14.03.19 11:25) [5]

Ответ не по вопросу.


ВладОшин ©   (15.03.19 17:43[8]


> sniknik ©   (14.03.19 18:49) [6]

исключительно показать, что там указатель )


> Германн ©   (15.03.19 02:21) [7]

А имхо, исключительно по вопросу. Причем демонстрация в чистом виде, что ты сказал.


Германн ©   (16.03.19 02:04[9]


> ВладОшин ©   (15.03.19 17:43) [8]
>
> > Германн ©   (15.03.19 02:21) [7]
>
> А имхо, исключительно по вопросу. Причем демонстрация в
> чистом виде, что ты сказал.
>

"Более одного значения не прибегая к созданию своего класса" я понял как "две и более сущности одновременно". Например координаты точки на земной поверхности. Широта и долгота. Или индексы ячейки в многомерном массиве. Или...


ВладОшин ©   (16.03.19 09:34[10]

буквально читаем:

>> Подскажите как не удаляя и добавляя запись заново, изменить по адресу где лежит этот TObject значение "1" на какое либо другое.

по адресу
P := addr(V);

не удаляя и добавляя запись заново
ListBox1.AddItem('Item_1', TObject(P) );

изменить
V := 1;
V := now;


Германн ©   (17.03.19 02:44[11]


> ВладОшин ©   (16.03.19 09:34) [10]
>
> буквально читаем:

А. ТС оказывается нарушил правила и задал два вопроса в одной теме.


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо