• 0
Barbanel

TListBoxItem.TagObject = nil

Вопросы

Всем хай.

Пол дня бьюсь, уже с ума начинаю сходить, и как назло не с кем посоветоваться сегодня. Выручайте)
Суть:
Есть TListBox. В него динамически из кода создаются TListBoxItem.
Каждому итему в поле TagObject присваивается некий объект, хранящий дополнительные данные.
По клику на итем, вытаскивается этот объект и в зависимости от данных, выполняются разные действия.

Проблема:
Под Windows ее собсно нет)
Под Android при клике на TListBoxItem оказывается что TagObject = nil.

Голова уже дымится, у меня закончились мысли, что это может быть...

Код, на всякий:

        while not query.Eof do
        begin
            item := TListBoxItem.Create(lbTeilLeistungsArten);
            lbTeilLeistungsArten.AddObject(item);
            item.StyleLookup := 'listboxitemTL';
            item.Height      := 60;
            item.Text        := query.FieldByName('Bezeichnung').AsString;
            item.OnClick     := OnTeilleistungenClick;
            item.Tag         := query.FieldByName('ID').AsInteger;
            item.DisableDisappear := true;
            item.ApplyStyleLookup();

            lStObj := TStoreObject.CreateTL(query.FieldByName('ID').AsInteger);
            lStObj.TeilLeistung.Name := query.FieldByName('Bezeichnung').AsString;

            item.TagObject := lStObj;

            query.Next();
        end;

Всем заранее спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 ответов на этот вопрос

  • 2

TagObject имеет тип ссылки [weak]

Когда у меня было такое:

item.tagObject := TStringList.Create

if not Assigned(item.tagObject) then ShowMessage('Noy Assigned');

всегда показывало сообщение.

Если я правильно понял суть работы ARC, который работает только под мобильными платформами, то [weak] ссылка не увеличивает счетчик ссылок для обьекта.

для решения этой проблемы я был переделал на свой клас:

TMyObject = class(TFMXObject)

и потом при создании итема

MyObject := TMyObject.Create;

Item.AddObject(MyObject)

Item.tagObject := MyObject;

Чтобы на обьект хранилась нормальная ссылка еще где-то.

 

Вот тут уже такое обсуждалось:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

del.

Про weak как-то вообще не подумал...
Пробую.
Спасибо!

Изменено пользователем Barbanel
Конец рабочего дня, голова не варит

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 часа назад, Barbanel сказал:

del.

Про weak как-то вообще не подумал...
Пробую.
Спасибо!

и как решили? можно код?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 09.11.2018 в 19:43, wamaco сказал:

и как решили? можно код?

Присвоил этот объект полю TListBoxItem.Data

Это поле не содержит слабую ссылку. Альтернативный вариант указал RealSHELS

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

"Альтернативный вариант указал RealSHELS" - у меня этот вариант не завелся! поэтому и спросил!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, wamaco сказал:

"Альтернативный вариант указал RealSHELS" - у меня этот вариант не завелся! поэтому и спросил!

Странно, в теории должен сработать, но я не проверял. Просто убедился что TagObject имеет пометку Week.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От chaplin.u@gmail.com
      При добавлении новых итемов в листбокс у него появляются скролы но самого итема не видно. как сделать автоскролинг чтобы активный итем был виден ?
      CurListBoxItem->SetFocus() не делает этого.
    • От chaplin.u@gmail.com
      Столкнулся с разницей в нумерации индексов ( в Вин32 начинается с 0 а в Анроиде с 1 ). Решил при запуске программы находить минимальный индекс.
      Поставил на каждый TListBoxItem  Tag > 0 ( 1,2...) . Написал функцию а она рушит апликацию на старте. Не могу понять что ей не нравится.

       Imin определил как глобальную переменную  - int Imin = 0;
      если убираю эту функцию - программа стартует нормально.
       
       
    • От Ktulho
      Чтобы использовать Drag and Drop, устанавливаю у компонента TListBoxItem свойство HitTest:= True.
      Почему у этого компонента не срабатывает событие OnClick?
      P.S. Win32, XE7.
    • От Kikoma
      Следующая ситуация:
       
      Есть база данных с полями: id, product_name, price, cart (корзина) - Думаю пояснять излишне.
       
      по условию cart>0 формируется запрос и заполняется TListBox кастомизированным Item-ом который содержит SpinBox. при изменении SpinBox вызывается процедура, которая вносит изменение в БД (cart) и высчитывает сумму в этом Item.
       
      Все работает, все хорошо, но...
      Задумал я что при SpinBox = 0, у меня этот TListBoxItem исчезал, для этого на изменение SpinBox если он равен 0, я запускаю процедуру формирования (Заполнения) этого TListBox заново.
       
      Вываливается ошибка Access ..to address XXX, при чем при пошаговой трассировки исключение вызывает FMX.Edit строка 3811 CustomEditBox.Change; в procedure TValueRangeCustomEditBox.DoAfterChange; (DELPHI XE6)
       
      т.е. моя процедура полностью отрабатывается (Заполняется новый список Item-ов) и возникает эта ошибка.
       
      При чем на 32-bit Windows все работает нормально, только на андроиде возникает это исключение, при чем приложение продолжает нормально функционировать.
       
      Если я правильно понимаю, то эта процедура DoAfterChange пытается что то сделать с объектом, которого уже нет.
       
      Это баг или я неправильно алгоритм построил?
       
       
    • От kvantum
      Здравствуйте! 
       
      Необходимо реализовать сортировку пользовательских итемов TListBox в зависимости от значений их свойств.
      Во вложении тестовый пример сортировки по Item.Tag = Random(1000). 
       
      Пользовательская функция сортировки: 
      function TForm1.SortFunc(Item1, Item2: TFmxObject): Integer; begin   if (Item1 as TListBoxItem).Tag > (Item2 as TListBoxItem).Tag then Result:=1;   if (Item1 as TListBoxItem).Tag < (Item2 as TListBoxItem).Tag then Result:=-1;   if (Item1 as TListBoxItem).Tag = (Item2 as TListBoxItem).Tag then Result:=0; end; Вызов сортировки: 
      procedure TForm1.Button1Click(Sender: TObject); begin   ListBox1.BeginUpdate;   ListBox1.Sort(SortFunc);   ListBox1.EndUpdate; end; К сожалению, сортировка не работает - порядок следования итемов в списке не меняется.
       
      Прошу помочь ! 
       
      ListSort.zip
    • От Nix0N
      ListBox содержит 100 ListBoxItem (созданные в run-time) с кастомным стилем, который содержит TCheckBox и TLabel. Если у первого item'a отметить CheckBox, он выборочно дублируется у остальных item. Пример: отмечаем первый item, отмечаются 20, 30 и т.д. Пробовал перерисовку, перестановку контента и т.д. - не помогает. В чем может быть дело ?

      Чистый проект прилагается. RAD Studio XE6 
      ChekBox ListBox.zip
    • От long_island
      Здравствуйте.
       
      По статье Ярослава Бровина реализовывал кастомный ListBoxItem. Но тут непонятная ситуация возникла. Я пишу приложение под android/iOS. В версии для windows в том же примере элементы листбокса выделяются "синим" при клике, а в моем случае они остаются белыми. Я еще не очень разобрался со стилями приложения вообще. Как бы StyleBook включен только для ЛистБокса, там все нормально как мне нужно отображается. Вот проблема с выделением. Тестировал и как для win32(активировал в Project Manager'е) и для Android непосредственно на смартфоне.
       
      Подскажите пожалуйста как быть. Я полагаю, что дело именно в стилях, но инфы никакой я по этому поводу не нашел.
       
      Заранее спасибо.
      sample.zip
    • От Kikoma
      Здравствуйте, подскажите направление решения следующей проблемы:
       
      Есть стилизовнный ListBoxItem, содержащий два поля:
      TText: [styleName = 'TextPrice' и 'TextSum'] TSpinBox: [styleName = 'Count'] Каким образом:
      Можно повесить обработчик на SpinBox.OnChange, чтобы рассчитывать Sum? И как обратиться к значению SpinBox.Text? Код обработчика события изменения SpinBox:
      procedure TFormMain.SBCountChange(Sender: TObject); // Какой вызов и где его назначить? var Item: TListBoxItem; begin Item:= ??? //Определение того итема, в котором был изменен TListBox [Name=StyleName='SBCount'] Item.StylesData['TextSum'] := StrToInt( Item.StylesData['TextPrice'] ) * StrToInt( ??? SBCount.Text ); end Подскажите, пожалуйста, а то только туманные решения
    • От kvantum
      Здравствуйте ! 
       
      Во вложении - тестовое приложение, иллюстрирующее суть проблемы.
       
      Есть пользовательский элемент списка 
      TCustomListBoxItem = class(TListBoxItem) , содержащий:
      Изображение, Наименование даты Текстовое описание непостоянной длинны. В зависимости от длинны описания меняется высота TCustomListBoxItem.
       
      Метод TCustomListBoxItem.SyncChildSizes вычисляет высоту элемента списка в зависимости от содержимого и вызывается из обработчиков TCustomListBoxItem.OnResize и TCustomListBoxItem.OnApplyStyleLookup.
       
      Форма приложения содержит две вкладки, вторая из которых содержит сам список и две кнопки для его пополнения и очистки. Первая вкладка содержит только две кнопки, наследующие обработчики кнопок второй вкладки.
       
      Суть проблемы
      Если нажать кнопку "Добавить" на первой вкладке и активировать список на второй вкладке - его элементы (TCustomListBoxItem) будут "навалены" один на другой. Если нажать кнопку "Добавить" на второй вкладке, которая содержит сам список - элементы в нем отображаются корректно. Скриншоты во вложении.

       
      Прошу помочь разобраться.
      List Test.zip
    • От kvantum
      Здравствуйте ! 
       
      TListBox заполняется посредством добавления к нему TListBoxItem:
      LBI := TListBoxItem.Create(ListBox); ... ListBox.AddObject(LBI); Как из ListBox извлечь его ListBoxItem, находящийся на i-позиции ?
      К сожалению, свойства Objects TListBox не имеет, как это было в стандартном делфи.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу