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

Работа с ListView


dmitry

Вопрос

Добрый день.

Использую Delphi DX 10 Update 1.

Есть маленькая задача по использованию компонента ListView.

Необходимо, если в Item содержится текст = 'Signal', то цвет у шрифта установить в красный, иначе в черный.

Написал следующий код вставки данных в ListView:

procedure TForm3.Button1Click(Sender: TObject);
Var
  Item: TListViewItem;
  TextObject: TListItemText;
begin
Item := ListView1.Items.Add;
Item.Text := '...';
TextObject := TListItemText.Create(Item);
TextObject.Text := 'Signal';
TextObject.Height := 30;
TextObject.PlaceOffset.Point := TPointF.Create(1, 0);
TextObject.Name := 'STATUS';
TextObject.Font.Size := 20;

Item := ListView1.Items.Add;
Item.Text := '...';
TextObject := TListItemText.Create(Item);
TextObject.Text := 'Normal';
TextObject.Height := 30;
TextObject.PlaceOffset.Point := TPointF.Create(1, 0);
TextObject.Name := 'STATUS';
TextObject.Font.Size := 20;
end;

 

В событии UpdateObjects компонента написал:

procedure TForm3.ListView1UpdateObjects(const Sender: TObject;
  const AItem: TListViewItem);
Var
  TextObject: TListItemText;
begin
TextObject := AItem.Objects.FindDrawable('STATUS') As TListItemText;
If TextObject <> Nil Then
Begin
  If TextObject.Text = 'Signal' Then
    TextObject.TextColor := TAlphaColorRec.Red
  Else
    TextObject.TextColor := TAlphaColorRec.Black;
End;
end;

 

В итоге Item, где есть Signal не устанавливается цвет текста в красный и более того TextObject = Nil.

Помогите разобраться с проблемой.

Тестовый проект прилагаю

LVBag.rar

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

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

  • 0

Конечно, можно и сразу цвет текста присваивать. Но задача мной описана очень кратко. В реальной задаче, в одном Item будет находится более одного TListItemText и отрисовываться они будут по разному.

 

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

именно в UpdateObjects нужно создавать нужные Items

при создании нового Item  (Items.add) сразу вызывается OnUpdateObjects

в это время ничего еще не создано, поэтому - NIL

поменяйте логику и все встанет на место

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0
  • Модераторы
procedure TForm3.Button1Click(Sender: TObject);
begin
  with ListView1.Items.Add do
  begin
    Text := '...';
    Data['STATUS'] := 'Signal';
  end;

  with ListView1.Items.Add do
  begin
    Text := '...';
    Data['STATUS'] := 'Normal';
  end;
  ListView1.Resize;
end;

procedure TForm3.ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem);
var
  TextObject: TListItemText;
begin
  TextObject := AItem.Objects.FindDrawable('STATUS') As TListItemText;
  if TextObject = nil then
  begin
    TextObject := TListItemText.Create(AItem);
    TextObject.Name := 'STATUS';
  end;
  if TextObject.Text = 'Signal' Then
    TextObject.TextColor := TAlphaColorRec.Red
  else
    TextObject.TextColor := TAlphaColorRec.Black;
end;

остальное сами настроете

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

Тогда я просто не понимаю, для чего нужно событие UpdateObjects.

Сейчас сделал эксперимент, как предложил Уважаемый Krapotkin.

Стиль для Item = ImageListItemBottomDetailRightButton.

Отдельно создал константы:

Const
  sdStatusSignal = 'sdStatusSignal';
  sdStatusNormal = 'sdStatusNormal';

Заполняю Items по кнопке:

procedure TForm1.Button1Click(Sender: TObject);
Var
  Item: TListViewItem;
begin
//Первый item
Item := ListView1.Items.Add;
Item.Bitmap.Assign(Image1.Bitmap);
Item.Objects.TextObject.Text := 'Task 1';
Item.Objects.DetailObject.Text := '3';
Item.Data[sdStatusSignal] := 'SIGNAL';
//второй item
Item := ListView1.Items.Add;
Item.Bitmap.Assign(Image1.Bitmap);
Item.Objects.TextObject.Text := 'Task 2';
Item.Objects.DetailObject.Text := '0';
Item.Data[sdStatusNormal] := 'NORMAL';
end;

И сам обработчик UpdateObjects, в котором рисую новый объект:

procedure TForm1.ListView1UpdateObjects(const Sender: TObject;
  const AItem: TListViewItem);
Var
  StatusSignal: TListItemText;
  StatusNormal: TListItemText;
begin
StatusSignal := AItem.Objects.FindDrawable(sdStatusSignal) As TListItemText;
If StatusSignal = Nil Then
Begin
  StatusSignal := TListItemText.Create(AItem);
  StatusSignal.Name := sdStatusSignal;
  StatusSignal.Width := 50;
  StatusSignal.Height := 20;
  StatusSignal.PlaceOffset.Point := TPointF.Create(70, 0);
  StatusSignal.TextColor := TAlphaColorRec.Red;
End;
StatusNormal := AItem.Objects.FindDrawable(sdStatusNormal) As TListItemText;
If StatusNormal = Nil Then
Begin
  StatusNormal := TListItemText.Create(AItem);
  StatusNormal.Name := sdStatusNormal;
  StatusNormal.Width := 50;
  StatusNormal.Height := 20;
  StatusNormal.PlaceOffset.Point := TPointF.Create(70, 0);
  StatusNormal.TextColor := TAlphaColorRec.Black;
End;
end;

Только совсем не понимаю как этот обработчик работает. StatusSingal и StatusNormal всегда будут для Item = Nil, что приведет к созданию новых TListItemText. Очень интересный момент получается при выводе, показывает все правильно (в приложении к ответу).

При создании первого Item я должен создать только sdStatusSingal, но в отладчике видно что также создается и sdStatusNormal хотя и не отображается.

Может мне кто-нибудь этот момент объяснить?

P.S. С ListView только пробую работать, есть пока что некое непонимае.

 

 

Безымянный.png

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

компоненты же для каждого Item создаются отдельно.

OnUpdateObjects - это и есть место для создания всяких своих дополнительных ListViewItems Возможно еще когда-то вызываются, можно по текстам поискать

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

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

Zuby и Krapotkin Спасибо Вам за помощь.

Zuby, сделал как Вы и описывали

procedure TForm1.Button1Click(Sender: TObject);
Var
  Item: TListViewItem;
begin
//Первый item
Item := ListView1.Items.Add;
Item.Bitmap.Assign(Image1.Bitmap);
Item.Objects.TextObject.Text := 'Task 1';
Item.Objects.DetailObject.Text := '3';
//Item.Data[sdStatusSignal] := 'SIGNAL';
Item.Data['STATUS'] := 'SIGNAL';
//второй item
Item := ListView1.Items.Add;
Item.Bitmap.Assign(Image1.Bitmap);
Item.Objects.TextObject.Text := 'Task 2';
Item.Objects.DetailObject.Text := '0';
//Item.Data[sdStatusNormal] := 'NORMAL';
Item.Data['STATUS'] := 'NORMAL';
ListView1.Resize;
end;

procedure TForm1.ListView1UpdateObjects(const Sender: TObject;
  const AItem: TListViewItem);
Var
  //StatusSignal: TListItemText;
  //StatusNormal: TListItemText;
  TextObject: TListItemText;
begin
TextObject := AItem.Objects.FindDrawable('STATUS') As TListItemText;
If TextObject = Nil Then
Begin
  TextObject := TListItemText.Create(AItem);
  TextObject.Name := 'STATUS';
End;
If TextObject.Text = 'SIGNAL' Then
  TextObject.TextColor := TAlphaColorRec.Red
Else
  TextObject.TextColor := TAlphaColorRec.Black;

Только в последнем обработчике когда идет сравнение TextObject.Text = 'SIGNAL', свойство Text равно пустому значению всегда.  

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

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

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

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

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

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

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

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

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

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