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

OnUpdateObjects выполняется дважды


x11

Вопрос

Сделал такой эксперимент в событии OnUpdateObjects

    if AItem.Purpose in [TListItemPurpose.Header] then
      Memo1.Lines.Add(AItem.Text);

 

И в memo загрузилось в два раза больше строк, чем элементов списка.

Это нормально, так и должно быть?

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

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

  • 0

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

OnUpdateObjects и OnUpdatingObjects выполняется постоянно - при изменении размеров,  скрытии и повторном показе, переключении приложений и т.д. В справке так и написано "Occurs immediately after the list view component is updated."

Так что надо придерживаться двух правил :

1. При добавлении/изменении TListViewItem отключайте обработку вышеуказанных процедур. 

Setting.Flags.ListViewUpdating:=True; // Глобальная переменная или ListView.OnUpdatingObjects:=nil;
AItem:=ListView.Items.Add;
AItem.Data['Type']:='MySuperPuperItem';
AItem.Data['Name']:=AName;
AItem.Data['Value']:=AValue;
Setting.Flags.ListViewUpdating:=False; // Глобальная переменная или ListView.OnUpdatingObjects:=ListViewUpdatingObjects;
AItem.Adapter.ResetView(AItem); // принудительно вызываем ListViewUpdatingObjects 

...

procedure TFormMain.ListViewUpdatingObjects(const Sender: TObject;
  const AItem: TListViewItem; var AHandled: Boolean);
begin
  if Setting.Flags.ListViewUpdating then // Если используете глобальную переменную
    Exit;
...

2. Внутри OnUpdateObjects и OnUpdatingObjects при добавлении TListItemText и прочих элементов, проверяйте их существование, возможно они уже были добавлены вашим кодом ранее.

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

помню, они вызывались еще не к месту имхо, когда я заполнял AItem.Data['xxx'] или наоборот, читал из... сейчас точно не скажу уже

сделал так же флажок и ResetView

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

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

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

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

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

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

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

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

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

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