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

Вывод данных


Razmir

Вопрос

Доброго времени. Есть массив данных о товаре, на основании которых должен выводится стилизованный список. Динамически создается Rectangle, который окрашивается градиентом в зависимости от даты поступления, на нем же 2 Button - 1 с информацией об излишке или недостаче, при нажатии на которую появляется окно для коррекции информации, 2 для обновления даты. Так же 2 Label, в которых выводится название товара и дата поступления. Проблема в следующем: пробовал использовать ListBox, ListView, TreeView. При создании списка жуткие тормоза. То есть пока все Item выведутся проходит пару тройку секунд и это при списке из 20 товаров, боюсь представить, как это долго если товаров будет 100 и больше. При чем на андроид таких тормозов нет, только под виндой. Как можно решить данную проблему?

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

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

  • 0

не видя кода сказать тяжело.
Но в целом можно просто кинуть layout, в него VertScroll box, а в него уже создавать все нужные вами Items в real-time. 
На моей практике это работает под виндой очень быстро.

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

 

21 часов назад, krapotkin сказал:

обычно когда что-то идет не так, смотрят кот и анализируют алгоритм

Код как бы 2 варианта.

Первый, это в стилях создаю тот итем как мне нравится, и в цикле присваиваю значения, на примере ListBox:

  for i := 0 to xcount-1 do
  begin
    n:=trunc(date-strtodate(s));
    list.Items.Add(nomenklatura[i]);
    with list.ListItems[list.Count-1] do
    begin
      if (n>3) and (n<10) then StyleLookUp:='ListBoxItemBrown1';
      if (n<=3) then StyleLookUp:='ListBoxItemGreen1';
      if (n>9) then StyleLookUp:='ListBoxItemRed1';
      StylesData['Label2.Text']:=xdate[i];
      if list.Name='ListBox1' then StylesData['Button1.OnClick'] := TValue.From<TNotifyEvent>(XItemClick);
      if list.Name='ListBox2' then StylesData['Button1.OnClick'] := TValue.From<TNotifyEvent>(form2.XItemClick);
    end;
  end;

Здесь вроде как все элементарно, но со стилями вообще жуткие тормоза. 

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

  begin
  FRectangle := TRectangle.Create(Owner);
    with FRectangle do
    begin
      Align:=TAlignLayout(9);
      Margins.Left:=3;
      Margins.Right:=3;
      Margins.Bottom:=3;
      Margins.Top:=3;
      XRadius:=7;
      YRadius:=7;
      locGradient := TGradient.Create;
      n:=trunc(date-xdate[i]);
      if (n>3) and (n<10) then
      with locGradient do
      begin
        Color  :=$FFFBFAFA;
        Color1 :=$FFDABC76;
      end;
      if (n<=3) then
      with locGradient do
      begin
        Color  :=$FF73FD11;
        Color1 :=$FF4EA43B;
      end;
      if (n>9) then
      with locGradient do
      begin
        Color  :=$FFFD834E;
        Color1 :=$FFC8311A;
      end;


      with Fill do
      begin
        Kind      := TBrushKind.Gradient;
        Gradient  := locGradient;
      end;
    end;

    FDate:=TLabel.Create(self);
    with FDate do
    begin
      Parent:=FRectangle;
      StyledSettings := [];
      Text:=xdate[i];
      Align:=TAlignlayout.Left;
      width:=80;
      Margins.Left:=3;
      Margins.Bottom:=3;
      Margins.Right:=3;
      Margins.Top:=3;
      textsettings.VertAlign:=TTextalign(0);
      TextSettings.HorzAlign:=TTextalign(0);
      TextSettings.Font.Size:=14;
      TextSettings.Font.Style:=TextSettings.Font.Style + [TFontStyle.fsBold];
    end;

    FName:=TLabel.Create(self);
    with FName do
    begin
      Parent:=FRectangle;
      Text:=nomenklatura[i];
      StyledSettings := [];
      Align:=TAlignlayout(9);
      Margins.Left:=5;
      Margins.Bottom:=3;
      Margins.Right:=0;
      Margins.Top:=3;
      TextSettings.HorzAlign:=TTextalign.Leading;
      textsettings.VertAlign:=TTextalign(0);
      textsettings.WordWrap:=true;
      TextSettings.Font.Size:=14;
      TextSettings.Font.Style:=TextSettings.Font.Style + [TFontStyle.fsBold];
    end;

   FButton:=TCornerButton.Create(self);
    with FButton do
    begin
      width:=40;
      Parent:=FRectangle;
      StyledSettings := [];
      Align:=TAlignlayout.Right;
      Margins.Left:=0;
      Margins.Bottom:=7;
      Margins.Right:=7;
      Margins.Top:=7;
      Xradius:=15;
      yradius:=15;

      TextSettings.HorzAlign:=TTextalign(0);
      textsettings.VertAlign:=TTextalign(0);
      textsettings.WordWrap:=true;
      TextSettings.Font.Size:=14;

      TextSettings.Font.Style:=TextSettings.Font.Style + [TFontStyle.fsBold];
      TextSettings.FontColor:=talphacolorRec.Ivory;
      text:='✔';
      OnClick:=FButtonClick;
    end;
    FKol:=TCornerButton.Create(self);
    with FKol do
    begin
      width:=40;
      Parent:=FRectangle;
      StyledSettings := [];
      Align:=TAlignlayout(2);
      Margins.Left:=7;
      Margins.Bottom:=7;
      Margins.Right:=0;
      Margins.Top:=7;
      Xradius:=15;
      yradius:=15;
      text:=floattostr(abs(хvolume[i]));
      OnClick:=FKolClick;
      TextSettings.HorzAlign:=TTextalign(0);
      textsettings.VertAlign:=TTextalign(0);
      textsettings.WordWrap:=true;
      TextSettings.Font.Size:=14;
      if h>=0 then TextSettings.FontColor:=talphacolorRec.Lightgreen else TextSettings.FontColor:=talphacolorRec.Red;
      TextSettings.Font.Style:=TextSettings.Font.Style + [TFontStyle.fsBold];
      tag:=x;
    end;

в этом случае работает быстрей, но тем не менее появление каждого итема можно посчитать

Ссылка на комментарий
  • 0
21 часов назад, brunnengi сказал:

Но в целом можно просто кинуть layout, в него VertScroll box, а в него уже создавать все нужные вами Items в real-time. 

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

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

1) Со стилями тормоза из-за того, что каждый раз итему переприсваивается стиль, и начинается реальный кипеш там под капотом.

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

2) Зачем создавать динамически все контролы, если можно все оформить в TFrame и просто создавать его и класть хоть в listBox хоть в ScrollBox. (Это по сути одно и то же почти)

3) Все зависит от количества элементов. Если их 30, то listBox вывезет. если 300 - то ни listBox ни ScrollBox тут не вывезут.

Тогда надо брать ListView. Там все чуть сложнее, но зато нет проблем с производительностью.

 

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

Очень медленно. Отключите стилизацию итема проверьте что это именно она. 

После этого поместите создание всех итемов между beginupdate и endupdate, чтобы после каждого не шло рисование 

Изменено пользователем krapotkin
Ссылка на комментарий
  • 0
3 часа назад, krapotkin сказал:

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

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

 

Ссылка на комментарий
  • 0
3 часа назад, krapotkin сказал:

2) Зачем создавать динамически все контролы, если можно все оформить в TFrame и просто создавать его и класть хоть в listBox хоть в ScrollBox. (Это по сути одно и то же почти)

Сейчас пробую TFrame, интересная штука, как то раньше не использовал, возможно то, что надо

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

Очень медленно. Отключите стилизацию итема проверьте что это именно она. 

Этот вариант как раз таки без стилизации, динамическое создание компонентов, со стилизацией еще медленнее

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

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

 

Нет. У rectangle нет стиля. Это базовый объект

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

Собирайте пример, выкладывайте сюда

Сравнил с вашим вариантом, я не использовал beginupdate, потому как у меня загружается items при onshow и тогда форма как бы подвисает, что не желательно, попробовал с кнопки создавать действительно, практически моментально все создается. Буду думать как организовать загрузку иначе. Спасибо. Уже не впервые выручаете. Отдельное спасибо за подсказку на счет фреймов.

Ссылка на комментарий
  • 0
В 06.03.2021 в 16:36, Razmir сказал:

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

ну не знаю про тонны кода. Не вижу где тут будет много кода.
Сортировка это дело для StringList или Dictionary и т.д. смотря чем пользуетесь.
А когда список есть или он поменялся, то просто отображаем его в чем хотим. Т.е. сначала подготавливаем данные, а потом уже отображаем.
Просто по мне как раз таки layout и элементы в них дают большую свободу, как в стиле так и в функциях. Но тут уже всё на ваше усмотрение.
 

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

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

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

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

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

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

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

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

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

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

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