Перейти к содержанию
  • Регистрация
  • 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;

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

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


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

Рекомендуемые сообщения

  • 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.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


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

    • От 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 пользователей онлайн

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

×
×
  • Создать...