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

Цвет выделенного Item-а


Rusland

Вопрос

Раскрашиваю ListView в черный цвет, цвет текста серый. Делаю это с помощью изменений от Zuby в FMX.ListView.pas в процедуре DrawItemsFill

          // отрисовываем кастомный цвет...........................................
          // procedure TListViewBase.DrawItemsFill(const StartItem.................
          if TListViewItem(ListItem).Data['aUseCustomColor'].AsBoolean then
            FBrush.Color := TListViewItem(ListItem).Data['aCustomColor'].AsInteger;
          // ......................................................................

При выделении Item его цвет становится светло-серым. Как изменить цвет выделяемого itema на черный?

Могу изменить цвет текстовых элементов в выделенном item так:

procedure TFrmMain.LsvItemClick(const Sender: TObject;  const AItem: TListViewItem);
var
  i: integer;
begin
  TListItemText(AItem.Objects.FindDrawable('TxtNum')).SelectedTextColor:=$FF1E1E1E; // серый
  TListItemText(AItem.Objects.FindDrawable('TxtAdr')).SelectedTextColor:=$FF1E1E1E; // серый
end;

А как изменить backround выделенного элемента так и не разберусь :(

Если это делается стилем, то покажите пожалуйста пример. 

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

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

  • 0
2 часа назад, Rusland сказал:

Раскрашиваю ListView в черный цвет, цвет текста серый. Делаю это с помощью изменений от Zuby в FMX.ListView.pas в процедуре DrawItemsFill


          // отрисовываем кастомный цвет...........................................
          // procedure TListViewBase.DrawItemsFill(const StartItem.................
          if TListViewItem(ListItem).Data['aUseCustomColor'].AsBoolean then
            FBrush.Color := TListViewItem(ListItem).Data['aCustomColor'].AsInteger;
          // ......................................................................

При выделении Item его цвет становится светло-серым. Как изменить цвет выделяемого itema на черный?

Могу изменить цвет текстовых элементов в выделенном item так:


procedure TFrmMain.LsvItemClick(const Sender: TObject;  const AItem: TListViewItem);
var
  i: integer;
begin
  TListItemText(AItem.Objects.FindDrawable('TxtNum')).SelectedTextColor:=$FF1E1E1E; // серый
  TListItemText(AItem.Objects.FindDrawable('TxtAdr')).SelectedTextColor:=$FF1E1E1E; // серый
end;

А как изменить backround выделенного элемента так и не разберусь :(

Если это делается стилем, то покажите пожалуйста пример. 

стили для ListView использую в своем приложении кстати они взяты со стилей  для вин 10  и работают на всех платформах единственое с чем не разобрался  пока как сменить цвет разделительной черты

listview.txt.zip

Ссылка на комментарий
  • 0
15 часов назад, master webs сказал:

стили для ListView использую в своем приложении кстати они взяты со стилей  для вин 10  и работают на всех платформах единственое с чем не разобрался  пока как сменить цвет разделительной черты

listview.txt.zip

Применил стиль и цвет выделенного перестал меняться на стандартный ) Уже хорошо. Осталось понять как поменять на свой (вообще мне нужно чтобы выделенный элемент мог принимать два цвета в зависимости от ситуации). 

Цвет разделительной черты меняется с помощью замены frame - color в стиле.

 

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
1 минуту назад, Rusland сказал:

Применил стиль и цвет выделенного перестал меняться на стандартный ) Уже хорошо. Осталось понять как поменять на свой. 

Цвет разделительной черты меняется с помощью замены frame - color в стиле.

 

выделеный итем selection 

Ссылка на комментарий
  • 0
15 часов назад, master webs сказал:

стили для ListView использую в своем приложении кстати они взяты со стилей  для вин 10  и работают на всех платформах единственое с чем не разобрался  пока как сменить цвет разделительной черты

listview.txt.zip

подскажи как этот текстовый файл использовать в проекте? у меня пока так и не получается раскрашивать Итемы в цвета как мне надо.

Ссылка на комментарий
  • 0
Только что, AndroidHalfNoob сказал:

подскажи как этот текстовый файл использовать в проекте? у меня пока так и не получается раскрашивать Итемы в цвета как мне надо.

можно изменить расширение с txt на .style и загрузить в StyleBook должно сработать

если не сработает то StyleBook сохранить в фал стилей  открыть текстовым редактором и добавить  весь текст в конец файла

Ссылка на комментарий
  • 0
9 минут назад, master webs сказал:

можно изменить расширение с txt на .style и загрузить в StyleBook должно сработать

если не сработает то StyleBook сохранить в фал стилей  открыть текстовым редактором и добавить  весь текст в конец файла

не получилось. добавился с ошибками. и потом при нажатии на каждом элементе пишет "разрушительный сбой"

Сделал по второму варианту. как теперь это применить к ListView?

Просто я не работал с компонентом StyleBook

Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
  • 0

AndroidHalfNoob, отредактируйте сохраненный файл так: добавьте вперед object TStyleContainer в конец end

Затем загрузите его в StyleBook и примените

У ListView измените StyleLookup на  listviewstyle

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
14 минуты назад, AndroidHalfNoob сказал:

не получилось. добавился с ошибками. и потом при нажатии на каждом элементе пишет "разрушительный сбой"

Сделал по второму варианту. как теперь это применить к ListView?

Просто я не работал с компонентом StyleBook

рабочий файл загрузите в StyleBook

listview.style.zip

Ссылка на комментарий
  • 0
15 часов назад, ZuBy сказал:

Используйте код из хелпера, только все методы нужно перенести в сам FMX.ListView.pas для Берлина 

По большей части плохо понимаю что делаю, но поменял в DrawItemsFill так:

          if TListViewItem(ListItem).Data['aUseCustomColor'].AsBoolean then
          begin
            FBrush.Color := TListViewItem(ListItem).Data['aCustomColor'].AsInteger;
            FSelectionStyleColor:=TListViewItem(ListItem).Data['aCustomSelectedColor'].AsInteger;
          end;

в программе меняю цвет с помощью:

procedure TFrmMain.SetItemColor(const aLV: TListView; const aItemIndex: integer; const aCustomColor,aCustomSelectedColor: TAlphaColor;
  const aUseCustomColor: Boolean = true);
begin
  if (aLV.ItemCount>0) and (aItemIndex>=0) then
  with aLV.Items[aItemIndex] do
  begin
    Data['aUseCustomColor'] := aUseCustomColor;
    Data['aCustomColor'] := aCustomColor;
    Data['aCustomSelectedColor'] := aCustomSelectedColor;
  end;
end;

Метод работает.

Осталось придумать как бы обходится без редактирования исходников студии...

Ссылка на комментарий
  • 0
1 час назад, master webs сказал:

рабочий файл загрузите в StyleBook

listview.style.zip

Загрузил в компонент. в свойствах компонента тоже указал 
как раскрасить итем? подскажите.

Ссылка на комментарий
  • 0
2 часа назад, Rusland сказал:

Метод работает.

Получилось раскрасить выделенные объекты в определенный цвет. А вот как сделать два варианта цвета не пойму 

Можно как-то двум Item-ам задавать отдельные стили?

Изменено пользователем Rusland
Ссылка на комментарий
  • 0
  • Модераторы
43 минуты назад, Rusland сказал:

Получилось раскрасить выделенные объекты в определенный цвет. А вот как сделать два варианта цвета не пойму 

Можно как-то двум Item-ам задавать отдельные стили?

что вы имеет ввиду? два варианта цвета, что за цвета?

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0

Допустим через один (i mod 2 =0) при выделении item были либо красный либо зеленый (подчеркиваю: при выделении).

А у меня получается что выделенные item-ы могут быть только либо красный, либо зеленые.

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

Попробую объяснить на примере: ListViewInRX10.1.zip

procedure TForm1.Button1Click(Sender: TObject);
var
  Item: TListViewItem;
  i:integer;
begin
  Lsv.Items.Clear;
  Lsv.BeginUpdate;
  for i:=0 to 4 do
  begin
    try
      Item           :=Lsv.Items.Add;
      Item.Tag       := i;
      Item.Text      := 'ул.Ленина, д.'+IntToStr(i+1);
      Item.Detail    := 'название';
      Item.Accessory:=TAccessoryType.Detail;
      begin
        if i mod 2 = 0 then
        begin
         Item.ImageIndex:=0;
         SetItemColor(Lsv,i,$FFFFFF00,0);
        end
        else
        begin
         Item.ImageIndex:=1;
         SetItemColor(Lsv,i,$FFFFFF00,1);
        end;
      end;
    finally

    end;
  end;
  Lsv.EndUpdate;
end;

procedure TForm1.SetItemColor(const aLV: TListView; const aItemIndex: integer; const aCustomColor: TAlphaColor; aTip:integer;
  const aUseCustomColor: Boolean = true);
begin
  if (aLV.ItemCount>0) and (aItemIndex>=0) then
  with aLV.Items[aItemIndex] do
  begin
    Data['aUseCustomColor'] := aUseCustomColor;
    Data['aCustomColor'] := aCustomColor;
    if aTip=0 then
      Data['aCustomSelectedColor'] := $FFFF0000  // красный цвет фона выделенного объекта
    else
      Data['aCustomSelectedColor'] := $FF00FF00; // зеленый
  end;
end;

Если я кликаю на каком-нибудь Item, я ожидаю что цвет выделенного будет через один то красный, то зеленый. А в результате получаю всегда красный.

Выделение.png

 

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

я решал аналогичную задачу, написанием наследника TListItemRect=class( TListItemDrawable), который только и умеет, что рисовать прямуогольник методом FillRect

в listView.OnUpdateObject я создаю объект этого типа по размерам Item

при клике и селекте нужно цвет менять и делать invalidate

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

Подскажите плиз.

Где то есть расписанно хоть как-то, какой стиль и его составляющие к чему относятся.

К примеру, стиль listviewstyle: background, itembackground понятно.

А вот какими свойствами поменять:
цвет текста для неактивного итема (именно в стиле, а не свойствах листвью)
цвет текста выделенного итема
цвет itembackground для выбранного итема
...

Спасибо...

 

Изменено пользователем gmsalex
Ссылка на комментарий

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

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

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

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

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

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

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

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

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