• 0
Авторизация  
haword

ListView и фильтр в Berlin

Вопросы

Привет всем.

Столкнулся с непонятной ситуацией, поискал в гугле, не нашел ничего похожего. Проблема - есть ListView, в него загружаются в отдельном потоке строки, под 100 штук, проект ранее работал отлично на Seattle, просто тупо перенес в Berlin. Вроде все красиво, все работает. НО как только попробовал использовать фильтр так облом. Фильтруются только те строки которые видны были на экране. Если я не сролил вниз список то те сроки что не были показаны в фильтр попадают с пустыми значениями и мой фильтр их отсекает. Если я проскролю вниз вверх список то в фильтр попадают все строки и он начинает работать нормально. 

Я так понимаю проблема из-за нового ListView в Берлине. Ощущение что не создаются поля пока не будут показаны на экране и из-за этого они пустые при фильтрации. Как лечить? Создавать в дизайнтайме поля ListView? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 ответов на этот вопрос

  • 0

Добрый день.
У меня в Berlin фильтрация происходит нормально и с невидимыми на экране строками. Всего 160 строк в Listview. 

Фильтрую через TEdit:

procedure TForm1.SearchChangeTracking(Sender: TObject);
var Lower: string;
begin
    Lower := Search.Text.Trim.ToLower;
    if Lower = '' then begin
        if Assigned(listView1.Items.Filter) then listView1.Items.Filter := nil;
    end
    else begin
        listView1.ItemIndex := -1;
        listView1.Items.Filter := function(X: string): Boolean
        begin
            Result := Lower.IsEmpty or X.ToLower.Contains(Lower);
        end;
    end;
end;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

да сейчас попробовал на нулевом проекте, то же работает. странно. спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

кидаем на форму ListView, выставляем свойство показать строку поиска. на кнопку вешаем сие действие, запускаем, все красиво, ищет все что занесли

var
 i: Integer;
 l: TListViewItem;
begin
  ListView1.Items.Clear;
  for I := 0 to 1000 do
    begin
      l:= ListView1.Items.Add;
      l.Text:= i.ToString;
    end;

end;
И начинается самое интересное, изменяем процедуру добавив всего одну сроку l.Data['id'] := i; типа храним идентификатор, и ставим его ДО заполнения поля Text, запускаем программу, заполняем данными, вуаля, в поиске только видимые строки )

var
 i: Integer;
 l: TListViewItem;
begin
  ListView1.Items.Clear;
  for I := 0 to 1000 do
    begin
      l:= ListView1.Items.Add;
      l.Data['id'] := i;
      l.Text:= i.ToString;
    end;

end;

Изменено пользователем haword

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

почему до? потому что если после то работает если до то фиг вам. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

решение, сперто из токио. 

procedure TListViewItem.SetData(const AIndex: string; const AValue: TValue);
var
  LObject: TListItemDrawable;
  LHandled: Boolean;
  LDataObject: TObject;
  LBitmap: TBitmap;
begin
  if FData = nil then
    FData := TDictionary<string, TValue>.Create;
  if not AValue.IsObject then
  begin
    FData.AddOrSetValue(AIndex, AValue);
    LHandled := False;
    if View.Initialized then // ДОБАВЛЕНО
    begin
      if Objects.Appearance <> nil then
        Objects.Appearance.SetObjectData(Self, AIndex, AValue, LHandled);
      if not LHandled then
      begin
        LObject := Objects.FindDrawable(AIndex);
        if LObject <> nil then
          LObject.Data := AValue;
      end;
    end; // ДОБАВЛЕНО
  end
  else

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

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

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