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

Rusland

Вопрос

В проекте 2 Image, 2 Button, 1 ListView.

Вид ListView:

Vid.png

Пытаюсь менять картинку в Item. Делаю это следующим образом:

      for k := 0 to LsvAl.ItemCount-1 do
      begin
        if (k mod 2)=0 then
        begin
          TListItemImage(LsvAl.Items[k].Objects.FindDrawable('Imp1')).Bitmap.Assign(Image2.Bitmap); // <- иногда зависает на Android
          TListItemText(LsvAl.Items[k].Objects.FindDrawable('TxtNum')).TextColor:=$FFFF2346;
        end
        else
        begin
          TListItemImage(LsvAl.Items[k].Objects.FindDrawable('Imp1')).Bitmap.Assign(Image1.Bitmap);
          TListItemText(LsvAl.Items[k].Objects.FindDrawable('TxtNum')).TextColor:=$FF009DFE;
        end
      end;

Во-первых, часто, но не всегда, на Андройде ловлю Segmentation fault (при обращении к памяти).

Во-вторых, раскрашивается всё, вплоть до самого Image1 из которого я беру картинку (отчего я вообще в шоке :blink:).

Как делать правильно?

 

До:

Do.png

После:

Posle.png

 

PS. Прикладываю готовый проект

LsvAl.zip

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

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

  • 0

Не знаю почему, но похоже проблема в присваивании через Bitmap.Assign

Если присваивать так TListItemImage(LsvAl.Items[k].Objects.FindDrawable('Imp1')).Bitmap:=Image1.Bitmap; то проблема решается.

 

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

во первых так делать нельзя, нужно создать временный TListItemImage, затем проверить его на существование и только потом присваивать

во вторых где и как делаете создание TListItemImage.Bitmap?

52 минуты назад, Rusland сказал:

Не знаю почему, но похоже проблема в присваивании через Bitmap.Assign

Если присваивать так TListItemImage(LsvAl.Items[k].Objects.FindDrawable('Imp1')).Bitmap:=Image1.Bitmap; то проблема решается.

вы понимаете разницу между assign и прямым присвоением?

assign - копирует только данные, но не создает объект

прямое присвоение - клонирует полностью объект

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

во первых так делать нельзя, нужно создать временный TListItemImage, затем проверить его на существование и только потом присваивать

Да, переделал вот так:

var
  IItem:TListItemImage;
  TItem:TListItemText;
  k:integer;
begin
      LsvAl.BeginUpdate;
      for k := 0 to LsvAl.ItemCount-1 do
      begin
        IItem:=LsvAl.Items[k].Objects.FindDrawable('Imp1') as TListItemImage;
        TItem:=LsvAl.Items[k].Objects.FindDrawable('TxtNum') as TListItemText;
        if (k mod 2)<>0 then
        begin
          if (IItem<>nil) then IItem.Bitmap:=Image2.Bitmap;
          if (TItem<>nil) then TItem.TextColor:=$FFFF2346;
        end
        else
        begin
          if (IItem<>nil) then IItem.Bitmap:=Image1.Bitmap;
          if (TItem<>nil) then TItem.TextColor:=$FF009DFE;
        end
      end;
      LsvAl.EndUpdate;
end;

 

5 минут назад, ZuBy сказал:

во вторых где и как делаете создание TListItemImage.Bitmap?

Создаю его в DesignTime - в редакторе ListView (появился в Berline)

6 минут назад, ZuBy сказал:

assign - копирует только данные, но не создает объект

прямое присвоение - клонирует полностью объект

Ну так я и хотел чтобы он скопировал только данные. Объект то уже создан, я просто меняю ему bitmap.

И assign не объясняет почему вдруг сменился битмап у Image.

 

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

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

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

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

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

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

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

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

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

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