• 0
Yarpda

Вопрос по быстродействию TListBox

Вопросы

(почему-то нет ветки в андроид по производительности, поэтому написал сюда)

 

Пробую писать под FM на Андрод и столкнулся с жуткими тормозами при прокрутке в TListBox.

Динамически создаю TListBoxitem'ы и закидываю в каждый итем 4 Tlabel'я разных цветов методом MyListBoxItem.AddObject(MyLabel);

И так для каждого Итема. Если список  из 5-10 итемов прокручивается еще куда ни шло. Но список из 25 итемов  и более просто дико тормозит при прокрутке. 

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

и на производительность FM для Андроид в общем?

Заранее спасибо.

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


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

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

  • 0

Для таких целей просто нужно использовать TListView. ListBox будет тормозить, он не создан для больших списков.

Для вас отлично подойдет MultiDetailView. Он в Samples лежит.

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


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

Вообще не правильный метод вы выбрали! Делается это через Стили и данные присваиваются через StyleData[...]

Создайте свой стиль, разместите в нем компоненты и дайте им имена. Уверен будет намного лучше.

прочитайте про стили в FMX

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


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

Вообще не правильный метод вы выбрали! Делается это через Стили и данные присваиваются через StyleData[...]

Создайте свой стиль, разместите в нем компоненты и дайте им имена. Уверен будет намного лучше.

прочитайте про стили в FMX

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

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


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

Вообще не правильный метод вы выбрали! Делается это через Стили и данные присваиваются через StyleData[...]

Создайте свой стиль, разместите в нем компоненты и дайте им имена. Уверен будет намного лучше.

прочитайте про стили в FMX

Все равно будет дико тормозить.

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


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

100 итемов в ListBoxe с картинками и не тормозит при быстром скроле?

Ну и речь офк идет о мобильных платформах.

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


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

100 итемов в ListBoxe с картинками и не тормозит при быстром скроле?

Ну и речь офк идет о мобильных платформах.

Да, именно о обильных, под Win все ОК.

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


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

Я к тому, что не очень верится что на мобилках стилизованный листбокс с картинками со 100 итемами не тормозит при скролле. А не верится потому, что пробовал. Под настольные ПК понятное дело не тормозит.

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


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

 

Вообще не правильный метод вы выбрали! Делается это через Стили и данные присваиваются через StyleData[...]

Создайте свой стиль, разместите в нем компоненты и дайте им имена. Уверен будет намного лучше.

прочитайте про стили в FMX

Все равно будет дико тормозить.

 

Андроид телефон Samsung Note 4 и на s3 проверял проверил 400 записей с картинками и всем тем что описал выше ,полет нормальный, а вот когда побывал использовать TreeView то он жутко тормозил даже с 10 записями, может все дело в коде?? 

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


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

Подтверждаю, тормоза есть, даже при 25 записях (со стандартным стилем). Устройство указано в подписи, проц далеко не слабый...

Что я заметил, так это 4 бага в листбоксе и тормоза(всё в XE7 без апдейта), в XE5-XE6 тормозов не было, это хорошо видно например здесь (20 секунда, вначале подлагнул скролл, а потом всё как по маслу (подгружалось более 500 записей/итемов), сейчас постоянно так подлагивает скролл).

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


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

Подтверждаю, тормоза есть, даже при 25 записях (со стандартным стилем). Устройство указано в подписи, проц далеко не слабый...

Что я заметил, так это 4 бага в листбоксе и тормоза(всё в XE7 без апдейта), в XE5-XE6 тормозов не было, это хорошо видно например здесь (20 секунда, вначале подлагнул скролл, а потом всё как по маслу (подгружалось более 500 записей/итемов), сейчас постоянно так подлагивает скролл).

попробуйте скролл отключить ,  скролл у меня отключен, и все лишние отключено, все равно код нужен, непонятно как изображения подгружаются , в xe 7 кэширование стилей есть , фото у меня в  StyleBook   Bitmap := GetImage('image'+inttostr(i)+'style'); без кода ответа точно не буде, код и пример приложите

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


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

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

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

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

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

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

Войти

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

Войти


  • Похожий контент

    • От Алексей Алексеев
      Здравствуйте! Помогите начинающему, всё перелазил, всё что мог и всё безрезультатно.
      Такая проблема: 
      Стоит задача убрать перенос строки в Memo:
      Из 
      "1строка"
      "2строка" 
      сделать:
      "1строка 2строка" .
      Казалось бы все просто:
      memo1.Text:=memo1.Text.Replace(#13#10,' '); И на Windows всё работает, но на Android отказывается!
      Просто не реагирует, ошибок не выдает. Проверял на XE8 и на 10.2.
      Может дело в смартфоне Xiomi miMax? Так как вообще memo на нём глючит...
    • От gutalin79
       
      Доброго времени суток!
      Хотел у Вас спросить. Есть ли возможность сделать на Delphi под Android кнопку которая была бы доступна в режиме блокировки? То есть чтобы я мог её нажать и включить фонарик или ещё что-нибудь и при этом не пришлось разблокировать телефон. Заранее благодарю, за ответ!  

    • От brunnengi
      Здравствуйте.
      Требуется программа на андроид с набором кнопок со следующем функционалом:
      1. Кнопка1 - создать базу в test.sqlite (в том месте где доступ к нему есть только у самого приложения (имею ввиду если это не ROOT телефон, при рут и так всё понятно)
      2. Кнопка2 - создать таблицу в базе test.sqlite с названием "TblTest01" (с разным набором полей на своё усмотрение)
      3. Кнопка3 - создать таблицу в базе test.sqlite с названием "TblTest02" (с разным набором полей на своё усмотрение)
      4. Кнопка4 - Добавить строку в таблицу "TblTest01" (любой набор данных на ваших усмотрение)
      5. Кнопка5 - Удалить строку в таблице "TblTest01" (по любому ключу на ваше усмотрение)
      6. Кнопка6 - Изменить строку в таблице "TblTest01" (по любому ключу и любое значение на ваше усмотрение)
       
      Приложение должно иметь фоновый сервис, который должен получать данные с сервера и добавлять их в базу test.sqlite в таблицу "TblTest02".
      При получение новый данных, сервис должен показать в "шторке" сообщение, по клику на которую открывается само приложение с визуальной частью.
      Т.е. если визуально приложение закрыто, выгружено, не запущено или запущено, фоновый процесс должен сам делать запросы к серверу и добавлять новые данные в базу, если они есть/поступили
      Приложение должно запускаться вместе с системой, после перезагрузки и т.д.
      Использовать только те компоненты что доступны в самой среде из коробки.
      Часть где делается запрос к серверу должен иметь timeout равный 20 секундам.
      Сервис должен грамотно делать запросы к серверу как положено в Андроид приложениях. 
      Серверная часть мне не нужна, можете для теста сами эмулирвать эти процессы.
       
       
      -----
      ЦЕНА: 2500р.
      СРОКИ: Не горит, но в целом где то дней 7 есть
      Перечисляю на QIWI, ЯД, Сбербанк, короче куда скажите.
    • От zekelive
      Добрый день, товарищи. Если кто сталкивался, подскажите) в потоке создаются картинкив виде плиток и прочие компоненты и падают на scrollbox.  Но в runtime пролистывание лагает, да в целом вся программа подлагивает. Можно ли как то реализовать подгрузка в фоне без ущерба? Или может ещё какой способ есть?
    • От Вольдемар
      Пользуюсь в своем Android приложении этим компонентом, вроде всё работает. Но хотелось бы асинхронности. Помогите пожалуйста с примером, как сделать асинхронность и получать результат после Post. Спасибо
    • От Aptyp
      На моём Samsung Note 5 вокруг букв проглядываются линии. Причём пробовал 3 различных разрешения экрана, ничего не меняется. У друга на Xiaomi Redmi 4x такого не наблюдается.
      Что это может быть?
       


    • От om.pranayama
      Здравствуйте форумчане и профессионалы разработчики.
      Компилирую проект через C++Builder 10.2  под Android
      Появилась следующая проблема при использовании компонента TBitmapListAnimation
      Если приложение свернуть, а затем развернуть - то появляются жуткие глитчи в ввиде чёрных фонов вокруг компонентов, типа TImage, TButton.
      В Windows такая проблема - не наблюдается.
      Попытки вызвать Repaint или даже Invalidate для всей формы - положительного результата не дают.
      Пожалуйста, помогите решить эту проблему.
      //--------------------------------------------------------------------------------------------------------------------------------------------
      ТЕМУ МОЖНО УДАЛЯТЬ
      Причина не в TBitmapListAnimation а в TAniIndicator, который работал совместно с TBitmapListAnimation.
      Приношу извинения за беспокойство. Проблема была в TAniIndicator. Буду разбираться почему он так себя безобразно ведёт.
      Тему можно удалять.
    • От Aptyp
      В приложении:
          procedure TForm7.Button1Click(Sender: TObject);     var AIntent: JIntent;         AServiceName: string;     begin       AIntent := TJIntent.Create;       AServiceName := 'com.embarcadero.services.Service';       AIntent.setClassName( TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString( AServiceName ) );       AIntent.putExtra( TAndroidHelper.StringToJString( 'Code' ), 0 );       AIntent.putExtra( TAndroidHelper.StringToJString( 'Data' ), TAndroidHelper.StringToJString( 'DataString' ) );       TAndroidHelper.Activity.startService( AIntent );     end;
      В сервисе:
          procedure TDM.AndroidIntentServiceCreate(Sender: TObject);     begin       Toast( 'Create' );     end;          procedure TDM.AndroidIntentServiceHandleIntent(const Sender: TObject;       const AnIntent: JIntent);     begin       Toast( 'HandleIntent' );     end; Сообщение 'Create' показывается, а 'HandleIntent' нет. OnCreate срабатывает, но onHandleIntent не вызывается что бы я не делал. Может я что-то не так делаю?
    • От Roman V
      Всем привет. Учусь работать с ini-файлами на Android. И сразу же возникла проблема, которую никак не могу решить. Хотел написать подобие приложение-тест с хранением данных в ini файле. В итоге все отлично работает на windows,а под Андроид при запуске висит только значок firemonkey секунд 10 и приложение вырубается так и не запустившись. В чем может быть проблема? Использую отладку по USB. 
      TIniFile *Ini = new TIniFile(System::Ioutils::TPath::GetDocumentsPath() + PathDelim + "options.ini"); Юзаю эти библиотеки 
      #include <System.IOUtils.hpp> #include <System.IniFiles.hpp>  
    • От gonzales
      Доброго времени суток!
      Решаю следующую задачу, в приложении динамически формируются разные объекты, наследники от одного класса. При формировании объектов заполняется динамический массив этих элементов. Далее я хочу в отдельном потоке для каждого из элементов массива получить его состояние, то есть делаю запрос к серверу. Все это повешено на таймер, каждую секунду должен отрабатываться запрос. Все более менее работает в Windows, а на Андроиде со временем приложение валится. Вот код таймера, для читаемости я удалил куски с различными вариантами E. RootElements - это массив TEssense от которого есть наследники. Функции GetBoardCurrentValue, GetBoardMaxValue - по сути запросы к серверу. 
      Подскажите, правильно ли я оформляю работу с потоками для работы на Андроиде?
      procedure TForm1.MasterTimerTimer(Sender: TObject); begin TTask.Run( procedure var l, d, a: byte; i,j:integer; E: TEssence; p: Pointer; VirtualNode: IXMLNode; VirtualElementNode: IXMLNode; id: byte; begin l := Length(Form1.RoomElements); for j := 0 to l - 1 do begin E := Form1.RoomElements[j]; // Реле if E is TRele then begin d := (E as TRele).Device_ID; a := (E as TRele).Device_Adress; if Form1.GetBoardCurrentValue(d, a) = true then begin TThread.Synchronize(nil, procedure begin (E as TRele).ReleSwitch.IsChecked := Form1.device[d].Board[a].CurrentValue.ToBoolean; end); end; // (E as TRele).ReleOnTimer(E) end // Диммер else if E is TDimmer then begin d := (E as TDimmer).Device_ID; a := (E as TDimmer).Device_Adress; if Form1.GetBoardMaxValue(d, a) = true then begin TThread.Synchronize(nil, procedure begin if (Form1.device[d].Board[a].Type_ID = TType.Светодиод) or (Form1.device[d].Board[a].Type_ID = TType.Диммер220) then begin (E as TDimmer).DimmerValue.Text := (Form1.device[d].Board[a].MaxValue).ToString; end; end); end; // (E as TDimmer).DimmerOnTimer(E) end // Таймер else if E is TSTimer then begin id := (E as TSTimer).STimerIndex; Form1.FillHTTPRequest(0, 0, HTTP_GET_TIMER_INFO, id); if Form1.AnswerIsComming = HTTP_GET_TIMER_INFO then begin TThread.Synchronize(nil, procedure begin if Form1.HTTPAnswer.Data1 = 0 then (E as TSTimer).Interval.Text := 'OFF' else (E as TSTimer).Interval.Text := 'ON' end); end; // (E as TSTimer).STimerOnTimer(E); end; end; end); end;   
  • Последние посетители   0 пользователей онлайн

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