• валя © (11.03.19 19:05) [0]
    Здравствуйте. Я добавляю записи в 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]
    >
    > буквально читаем:

    А. ТС оказывается нарушил правила и задал два вопроса в одной теме.
Есть новые Нет новых   [97002   +10][b:0.002][p:0.004]