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

Использование двух стилей в приложении...


HyperZen

Вопрос

Добрый день!

Создал свой стиль компонента TListView, как учил на вебинаре Евгений Крюков (Edit Custom Style).

Стиль простой - цвет фона - черный, цвет букв Item'а - светло серый, разделительная черта - светло серая.

В приложении хочу использовать что-то наподобие режимов дня и ночи. Данный стиль является "ночным".

Дефолтный стиль TListView использую как "дневной".

Вопрос в следующем: при переключении данных стилей в рантайме, наблюдается неправильная работа: цвет фона меняется корректно на всю высоту компонента, а вот цвет букв в видимой области не меняется, но стоит прокрутить TListView ниже видимой области - там цвет шрифта изменился, и так до конца списка можно создать такую вот непонятную "зебру".

Меняю стили при помощи свойства StyleLookup компонента TListView. В чем может быть проблема?

 

1.jpg

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

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

  • 0

Приведите кто-нибудь, пожалуйста, пример, простой пример - переключения двух стилей в приложении... Желательно используя TListView в данном проекте... Уже бесит данная ситуация...

// не помогает ни:
  lvMain.NeedStyleLookup;
  lvMain.ApplyStyleLookup;

// не помогает ни:
  lvMain.Resize;

// ни:
  lvMain.Repaint;
	

Помогает только полная загрузка данных заново в этот компонент...

Изменено пользователем HyperZen
Ссылка на комментарий
  • 0
8 часов назад, krapotkin сказал:

если мы видим, что не обновляются те элементы, которые были вне экрана, почему бы просто не пересоздать их при смене стиля?

Как раз те элементы, которые были вне экрана - обновляются и стиль к ним применяется нормально. Не меняется цвет шрифта в видимой области TListView.

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

Действительно, я смотрел Platform: default, а в Windows 7 есть два стиля: lvWalletsStyle1 и lvWalletsStyle2, но почему-то отображается всегда светлый вариант (lvWalletsStyle1).

Это из-за того что у меня Windows 8.1, а не 7?

Точно, скопировал стили из Windows 7 в Windows 8 и все заработало.

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

бррр
я теряю нить
я сам создал два стиля, назвал их  lvWalletsStyle1 и  lvWalletsStyle2
и больше ничего в StyleBook не вставлял

конечно, если в вашем StyleBook этих стилей нет, то listView не будет меняться.
но никакой зависимости от Windows 7,8 или 9, тут нет

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

Вот что я увидел когда открыл StyleBook:

1.png

2.png

Поэтому я не видел изменения стиля в запущенной программе ни в своей Windows 8, ни в Андроид. Может теперь стало понятней )

 

 

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

Я так и не понял, если не перестраивать список заново, то изменить стиль не получится?

Если комментирую //UpdateWalletsList; то текст не перекрашивается и ресайз не помогает. 

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

мы об этом и говорили, что только перестройка списка решает нашу проблему

Приделал костыль к процедуре b1Click

procedure TForm1.b1Click(Sender: TObject);
var
  i: Integer;
  //item:TListViewItem;
  TItem,TAItem,TDItem,TVItem: TListItemText;
  clr: TAlphaColor;
begin
  if lvWallets.StyleLookup='lvWalletsStyle1' then
    lvWallets.StyleLookup:='lvWalletsStyle2'
  else
    lvWallets.StyleLookup:='lvWalletsStyle1';
  //UpdateWalletsList;

  if LvWallets.ItemCount>0 then
  for i:=0 to LvWallets.ItemCount-1 do
  begin
    TItem:=LvWallets.Items[i].Objects.FindObjectT<TListItemText>('Text');
    TAItem:=LvWallets.Items[i].Objects.FindObjectT<TListItemText>('Amount');
    TDItem:=LvWallets.Items[i].Objects.FindObjectT<TListItemText>('Detail');
    TVItem:=LvWallets.Items[i].Objects.FindObjectT<TListItemText>('AmountValue');

    if lvWallets.StyleLookup='lvWalletsStyle1' then
      clr:=$FF000000
    else
      clr:=$FFFFFFFF;

    if Assigned(TItem) then
    begin
      TItem.SelectedTextColor:=clr;
      TItem.TextColor:=clr;
    end;
    if Assigned(TAItem) then
    begin
      TAItem.SelectedTextColor:=clr;
      TAItem.TextColor:=clr;
    end;
    if Assigned(TDItem) then
    begin
      TDItem.SelectedTextColor:=clr;
      TDItem.TextColor:=clr;
    end;
    if Assigned(TVItem) then
    begin
      TVItem.SelectedTextColor:=TAlphaColorRec.Brown;
      TVItem.TextColor:=TAlphaColorRec.Brown;
    end;

  end;
end;

Теперь раскрашивает без очистки и перестроения списка. Думаю принцип понятен (Hold и HoldValue можно приделать аналогично).

 

Ссылка на комментарий
  • 0
В 18.07.2016 в 15:21, krapotkin сказал:

stylebook не пустой, содержит два стиля "день" и "ночь"

у меня выглядит вот так

 

QIP Shot - Screen 109.png

QIP Shot - Screen 110.png

 

Подскажите, пожалуйста, каким образом происходит переключение между стилями в runtime-режиме?

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

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

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