Перейти к содержанию
Fire Monkey от А до Я
  • 0

Почему для моего стиля TListBoxItem сбрасывается состояние встроенного TCheckBox при прокручивании списка?


Nix0N

Вопрос

ListBox содержит 100 ListBoxItem (созданные в run-time) с кастомным стилем, который содержит TCheckBox и TLabel. Если у первого item'a отметить CheckBox, он выборочно дублируется у остальных item. Пример: отмечаем первый item, отмечаются 20, 30 и т.д. Пробовал перерисовку, перестановку контента и т.д. - не помогает. В чем может быть дело ?

Чистый проект прилагается. RAD Studio XE6 

ChekBox ListBox.zip

Ссылка на комментарий

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

  • 0

Отвечаю сам на свой же вопрос, может кому пригодится. Путем долгих и изнурительных экспериментов было установлено: после того, как создан и размещен checkbox, его необходимо "прочекать", т.е. в моём случае это

//ставим чек
Item.StylesData['mycheckbox'] := True;
//снимаем чек
Item.StylesData['mycheckbox'] := False;

С чем связано данное поведение не имею понятия, но многим пригодится...

Ссылка на комментарий
  • 0
  • Администраторы

Я поясню. В вашем проекте, вы создали встроенный TCheckBox в стиле, дали ему свое название "mycheckbox". Но когда вы прокручиваете элементы в списке, то стиль выгружается для не видимых элементов и загружается для новых видимых заново. В этом случае TCheckBox теряет свое состояние (стоит галка или нет). Когда вы задаете галку для итема через:

Item.StylesData['mycheckbox'] := True;

то при загрузке стиля итем автоматически восстанавливает значение галки. А для состояния, когда галка снята, итем не сохраняет эту информацию. Поэтому ваше найденное решение заключается в том, что всем итемам нужно через StylesData задать состояние TCheckBox. И это в принципе правильно кроме одного НО: Обратите внимание, что не нужно устанавливать галку и тут же ее сбрасывать. Достаточно сделать это один раз и установить требуемое значение.

 

Подробнее о ситуации выгрузке стиля можно прочитать тут: Почему для моих объектов стиля сбрасываются данные при прокручивании TListBox? - это аналогичная ситуация.

 

P.S. На счет попутного вопроса о том, почему при загрузке нового стиля галка стоит отмеченной отвечу. В TListBox выгружаемые стили скрывающихся итемов при прокручивании не распускаются, а повторно используются для новых итемов.

Изменено пользователем Brovin Yaroslav
Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
  • Похожий контент

    • Автор antarey
      Добрый день. Как програмно прокрутить TListBox на последний итем?
          TListBoxItem *logItem = new TListBoxItem(Application);     logItem->Parent = cbLog;     logItem->Name = "item" + IntToStr(itemIndex);     logItem->Text = Now().FormatString("dd:mm:yy") + " : " + text; ;     logItem->ImageIndex = ImageIndex;     logItem->TextSettings->WordWrap = true;     cbLog->ItemIndex = cbLog->Items->Count - 1;     cbLog->ScrollToItem(logItem); последние две строки, по идее должны прокрутить на последний елемент списка, но последний елемент выделяется а прокрутка в начале списка
    • Автор ddr 2
      Пытаюсь реализовать CheckBox  с дополнительными визуальными представлениями, которые можно задавать в редакторе стилей.
      Реализация: компонент созданный наследованием от TCheckBox и элемент стиля через наследование TCheckStyleObject.
      Пока написал класс поражденный от TCheckStyleObject (код ниже). Тестирую поместив на форму компонент TCheckBox   и указываю ему в StyleLookup, стиль создванный с испозольванием класса поражденного от TCheckStyleObject, компонент успешно применяет Стиль, что я визуально наблюдаю. Т.е. в дизайнере все состовляющие стиля видны(зарегистрированы) и доступны. Но при запуске приложения ошибка: First chance exception at $77079962. Exception class EClassNotFound with message 'Class TCheckDUStyleObject not found'. Process TestCheckBox.exe (20216). Ошибка при  загрузке StyleBooka.
      В чем может быть проблема?
      Подозреваю, что проблема окажеться из разряда базовых "детских", поэтому описываю более подробно свои дейсвия. Возможно проблема в одном из этий действий.
      По тестирование. На форму кидаю TCheckBox . На нем "Edit Custom Style...". В редакторе стилей появившемся стиле удаляю background(TCheckStyleObject) 
         
      и заменяю его своим background(TCheckDUStyleObject) перетаскиванием из палитры и меняю часть свойств в т.ч. SourceLink и другие *Link, что бы в дальнейшем увидеть нужные визуальное предстваление. Закрываю редактор стилей. Меняю StyleLookup чекбокса на "CheckBoxNew". И его визуальное представление меняется, т.е. стиль УСПЕШНО применен. 
      Про TCheckDUStyleObject.
      Файл UCheckDUStyleObject содержащий класс, добавлен в пакет. Пакет собирается, компилируется инсталируется. Пути(Library Path) к нему пропысаны. Класс в палитре отображается.
      unit UCheckDUStyleObject; interface uses FMX.Styles.Objects,System.Classes,FMX.Ani,FMX.Types; type TCheckDUStyleObject=class(TCheckStyleObject) protected type TLinkEx = (Pressed,ActivePressed,WaitingResponse,ActiveWaitingResponse,Disabled,ActiveDisabled); {$SCOPEDENUMS ON} TStateEx = (Active,Pressed, WaitingResponse, Disabled); {$SCOPEDENUMS OFF} TTransitionRec = record Animation: TAnimation; Event: TNotifyEvent; end; private protected FBitmapLinksEx: array [TLinkEx] of TBitmapLinks; FTransitionsEx: array [TStateEx] of TTransitionRec; FStateEx: set of TStateEx; procedure DefineProperties(Filer: TFiler); override; procedure SetupAnimations; override; function GetCurrentLink: TBitmapLinks; override; function GetLinkEx(Index: TLinkEx): TBitmapLinks; procedure SetLinkEx(Index: TLinkEx; const Value: TBitmapLinks); procedure ActiveTriggeredEx(Sender: TObject); procedure PressedTriggered(Sender: TObject); procedure WaitingResponseTriggered(Sender: TObject); procedure DisabledTriggered(Sender: TObject); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure StartTriggerAnimation(const AInstance: TFmxObject; const ATrigger: string); override; published property PressedLink: TBitmapLinks index TLinkEx.Pressed read GetLinkEx write SetLinkEx; property ActivePressedLink: TBitmapLinks index TLinkEx.ActivePressed read GetLinkEx write SetLinkEx; property WaitingResponseLink: TBitmapLinks index TLinkEx.WaitingResponse read GetLinkEx write SetLinkEx; property ActiveWaitingResponseLink: TBitmapLinks index TLinkEx.ActiveWaitingResponse read GetLinkEx write SetLinkEx; property DisabledLink: TBitmapLinks index TLinkEx.Disabled read GetLinkEx write SetLinkEx; property ActiveDisabledLink: TBitmapLinks index TLinkEx.ActiveDisabled read GetLinkEx write SetLinkEx; end; procedure Register; implementation procedure Register; begin RegisterComponents('Мои компоненты', [TCheckDUStyleObject]); end; // и т.д. Далее реализация TCheckDUStyleObject  
       
    • Автор Malstream
      Недавно решил написать небольшое приложение под андроид, которое будет в удобном виде показывать расписание моего ВУЗа (они нам передают 20 летний привет в виде экселя), ну и задно изучить FMX.
      Написал за пару дней парсер, все более менее работает. Встал вопрос - какими компонентами все это удобно и красиво отобразить? Перечитал кучу инфы по стандартным компонентам и, кажется, они мне не подойдут
      Для того чтобы было понятно, чего именно я хочу - набросал схему. Границы для наглядности. 
      Каким компонентом это можно реализовать? Если все-таки коробочные тоже годятся, то ткните лицом куда читать :)
      Заранее спасибо.

    • Автор genakust
      Здравствуйте,
      я создал свой ListBoxItem (FMX) который выглядит следующим образом:

      затем я добавил Items динамически в ListBox и получилось следующее:

      Когда я запускаю программу на Windows 10 и выбираю мышкой Item он селектируется, а если запускаю на Андроид- таблете, то я не могу выбрать (селектировать) Item.
      Подскажите пожалуйста, какие могут быть причины длы такого поведения.
      Заранее спасибо.
       
    • Автор Barbanel
      Всем хай.
      Пол дня бьюсь, уже с ума начинаю сходить, и как назло не с кем посоветоваться сегодня. Выручайте)
      Суть:
      Есть 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; Всем заранее спасибо!
    • Автор Вячеслав
      Добрый день, форумчане! Столкнулся со следующей задачей: 
      Имеется TListBox с 32 итемами, задаются в DesignTime. В некоторых ситуациях требуется убрать половину, оставить только первые 16 итемов. Я делаю лишние невидимыми, но при этом область прокрутки листбокса остается прежней и излишне большой. В связи с этим вопрос: можно ли как-то ограничить область прокрутки? 
      XE7, Windows.
    • Автор x11
      Можно ли во время работы программы вызвать Items editor, который я вызываю во время дизайна приложения?
      Или свой лисапет создавать?
    • Автор x11
      Процедура добавления Item
       
      procedure TfmEditObject.AddPhoto(Image: TBitmap); Var item: TListBoxItem; imageV: TImageViewer; begin item := TListBoxItem.Create(lbPhotos); item.parent := lbPhotos; item.text := ''; item.Width := lbPhotos.Width; item.PopupMenu := PopupMenu1; imageV := TImageViewer.Create(lbPhotos); imageV.HitTest := False; imageV.Parent := item; imageV.Align := TAlignLayout.Client; imageV.Bitmap.Assign(image); item.SetFocus; end; У popupmenu есть 2 пункта, привязанных к Action.
       
      Gestures срабатывает на "long tap"
      procedure TfmEditObject.lbPhotosGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); var c: IControl; ListBox: TListBox; lbxPoint: TPointF; ListBoxItem: TListBoxItem; begin if EventInfo.GestureID = igiLongTap then if (sender is TListBox) and assigned(TListBox(sender).Selected) then begin c := ObjectAtPoint(EventInfo.Location); if Assigned(c) then if Assigned(c.GetObject) then if c.GetObject is TListBox then begin ListBox := TListBox(c.GetObject); lbxPoint := ListBox.AbsoluteToLocal(EventInfo.Location); ListBoxItem := ListBox.ItemByPoint(lbxPoint.X, lbxPoint.Y); if Assigned(ListBoxItem) then PopupMenu1.Popup(lbxPoint.X, lbxPoint.Y); Handled := True; end; end; end;  
      Ставил точку останова, видно, что до строки "PopupMenu1.Popup(lbxPoint.X, lbxPoint.Y);" доходит.
      Если программа работает на Windows, то меню отображается по правой кнопке мышки, а на андроид устройстве меню не отображается по Long Tap.
       
      Как видно из кода, то меню прикручивается к ListBoxItem, а непосредственно к TListBox меню прикрутил в дизайне.
    • Автор x11
      Хочу реализовать прокрутку фото с помощью TListBox.
      Пока что в дизайне добавил пару Item и кинул на них TImageViewer, ну и картинку туда вставил.
      В свойстве TListStyle указал Horizontal. На Windows не листается мышкой влево/вправо, но есть хотя бы полоса прокрутки внизу.
      На андроид-устройстве и не листается, и полосы прокрутки нет вообще.
      Это связано с этим вопросом http://fire-monkey.ru/topic/4301-выводотображение-нескольких-картинок-на-форме
    • Автор x11
      В свойстве TListBox.ListStyle установил значение Horizontal. Список поменял вид.
      Теперь ставлю Vertical, но ничего не происходит.
      Как вернуть стиль списка обратно к вертикальному?
  • Последние посетители   0 пользователей онлайн

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

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