[Решено] Посоветуйте компонент ListView но с форматированием

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение zub » 26.10.2016 21:29:40

>>Стебу то ... а возни на десять минут ....
Хвастать нечем. реакция на мышь? добавление удаление итемов? ресайз?
Если я правильно понял форматированый текст не делаем? Ок.
Пожалуйста и тестик в виде 2х кнопок - добавить в начало списка 10000 итемов, удалить из начала списка 10000 итемов. замер времени потраченый на сие действия.
Код: Выделить всё
if sel then pl.Color:=clRed;

так не пойдет. у итема надо пропертю selected - негоже ее в цвет всовывать. Давай посеръезней
Моё - я пока занят, позже сегодня сделаю
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение Alex2013 » 26.10.2016 22:07:14

zub писал(а):>>Например некие последовательности
Надо было разобраться, а не списывать на ненадежность. Не всё работает так как ты ожидаешь, но всегда можно вникнуть


...и сказать "Брат, мы здесь тебя сменить готовы, победим, но мы пойдем путем другим!" (с)Мяковский :mrgreen:

Часто одно и тоже можно сделать чуть иначе и от "перемены слагаемых" сумма иногда все-же может изменится ... :idea: Просто в стандартных компонентах это сделали те кто их писал и отлаживал и к тому же обычно обладая большим опытом и знаниями . И пусть "Стандартные" не значит "Отличные" но достаточно часто означает "надежные".
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение Sharfik » 26.10.2016 22:42:57

Лекс Айрин писал(а): AlexDanilov писал(а):
Я вот читаю, что VirtualTreeview...
дерево и список понятия разные.

Дерево тот же список, просто ты смотришь на него с другого ракурса.
Для VirtualTreeview все едино. Отлично подходит под большинство задач.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 766
Зарегистрирован: 20.07.2013 01:04:30

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение Alex2013 » 26.10.2016 22:56:47

zub писал(а):>>Стебу то ... а возни на десять минут ....
Хвастать нечем. реакция на мышь? добавление удаление итемов? ресайз?
Если я правильно понял форматированый текст не делаем? Ок.
Пожалуйста и тестик в виде 2х кнопок - добавить в начало списка 10000 итемов, удалить из начала списка 10000 итемов. замер времени потраченый на сие действия.
Код: Выделить всё
if sel then pl.Color:=clRed;

так не пойдет. у итема надо пропертю selected - негоже ее в цвет всовывать. Давай посеръезней
Моё - я пока занят, позже сегодня сделаю


Я не хвастаюсь просто дальше совсем уж рутина что-бы ее было интересно писать "просто так".

Удаление ?
1 добавить кнопку и написать проверку цвета (или еще какого-то флага) в цикле ...
2 по нахождению сделать Op:=Controls[i];Controls.delete(i); (и SuperList .delete(i);)op.free;
"Тысячи итемов" это за пределами прорисовки и проблемы с ними это совсем другие проблемы .
Рисуются десятки максимум сотни элементов о них и разговор , а если в рабочем списке действительно много данных нужно подключать БД и это уже совсем другая история .

Раесайз ? А он всюду нужен ? Ну ресайз так ресайз ...
FormResize(Sender: TObject); никто не отменял .. Вам как по столбикам размещать или только вертикали масштабировать ? Да все это уже есть в ListViwew .. нужно просто смотреть на предполагаемую трудоемкость.... но если это просто фиксированная табличка на форме то зачем город городить ? Прокрутил выбрал и ...ВСЕ .
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение zub » 27.10.2016 00:29:09

>>что-бы ее было интересно писать "просто так".
а мы не просто так, мы чтобы уяснить разницу в подходах - "создать контрол ради надписи" vs "нарисовать надпись"
вот что получилось у меня.
Списка два потому что это непросто чтото "наформошлепаное" и настроеное в онЧетоТам изделие, а более-менее полноценный хелпер, который можно прилепить к любому листбоксу.
Правый список постоянный, с левым работают кнопки AddItems и RemoveItems - добавление и удаление 10000 итемов. время замеряется, у меня заняло 0.17сек - добавление и 2.4сек удаление. Но у меня самое что нинаесть тупое использование динмассива - добавляетсяубавляется по еденичке, если работать "пачками" - будет быстрее, кроме того можно переделать на использование уже существующего массива данных (он ведь есть уже в программе) - тогда будет максимум производительности на которую способен системный листбокс. К красоте я не стремился и текст рисую как попало))

Добавлено спустя 14 минут 34 секунды:
Если убрать затраты на "тупой" массив то заполнение-удаление листбокса займет
0.137sec
0.241sec
к таким циферкам и надо стремиться
У вас нет необходимых прав для просмотра вложений в этом сообщении.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение Лекс Айрин » 27.10.2016 09:23:38

Sharfik писал(а):Дерево тот же список, просто ты смотришь на него с другого ракурса.


Главное случайно не показать пользователям этот "другой ракурс". Может, проще обычный вывод через format? Или использовать TStringGrid со скрытыми линиями?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение serbod » 27.10.2016 14:59:33

Необязательно с панельками мучиться, можно все содержимое строки таблицы разместить цивильно на TFrame и оперировать сразу строками-фреймами.

VirtualTreeview очень хороший вариант не только для деревьев, но и для таблиц и списков. Ведь список это дерево без веток.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение Alex2013 » 28.10.2016 01:34:53

zub писал(а):>>что-бы ее было интересно писать "просто так".
а мы не просто так, мы чтобы уяснить разницу в подходах - "создать контрол ради надписи" vs "нарисовать надпись"
вот что получилось у меня.

Добавлено спустя 14 минут 34 секунды:
Если убрать затраты на "тупой" массив то заполнение-удаление листбокса займет
0.137sec
0.241sec
к таким циферкам и надо стремиться


Только что посмотрел код . Снимаю шляпу .... :idea:
Это труд ! Признаю себя халтурщиком и лентяем ... :oops: Но я признаться думал, что и намека будет достаточно .
Хорошо завтра выложу свой аналог "полного кода" ... Сразу говорю, что мой код скорее всего будет "одноразовым" .
Вся суть того что я доказывал, в возможной простой замены прорисовки через канвас на несколько стандартных компонентов .
(причем не "на все случаи жизни", а только для самых простейших )
Ну сам посуди...
Вот твой код
Код: Выделить всё
procedure TSuperListBoxHelper.DrawItem(Control: TWinControl; Index: Integer;
                                       ARect: TRect; State: TOwnerDrawState);
var
  rx,ry:integer;
  CRect:TRect;
  ts:TTextStyle;
  fs:TFontStyles;
begin
  //if not ({odSelected}{odComboBoxEdit}odDisabled in state) then
  //if (state<>[])and(state<>[odHotLight])and(state<>[odPainted]) then
  rx:=ARect.Right-ARect.Left;
  ry:=ARect.Bottom-ARect.Top;
  ts:=TListBox(Control).canvas.TextStyle;
  ts.Alignment:=taLeftJustify;
  ts.Layout:=tlCenter;
  ts.Clipping:=true;
  fs:=TListBox(Control).canvas.Font.Style;

  TListBox(Control).canvas.FillRect(ARect);

  CRect:=ARect;
  CRect.Right:=CRect.Left+(rx div 2);
  CRect.Bottom:=CRect.Top+(ry div 2);
  TListBox(Control).canvas.Font.Style:=fs+[fsBold];
  TListBox(Control).canvas.TextRect(CRect,0,0,ItemDataArray[Index].str1,ts);

  CRect.Bottom:=ARect.Bottom;
  CRect.Top:=CRect.Bottom-(ry div 2);
  TListBox(Control).canvas.Font.Style:=fs+[];
  TListBox(Control).canvas.TextRect(CRect,0,0,ItemDataArray[Index].str2,ts);

  ts.Alignment:=taCenter;
  CRect:=ARect;
  CRect.Right:=CRect.Right+(rx div 4);
  CRect.Left:=CRect.Left-(rx div 4);
  TListBox(Control).canvas.Font.Style:=fs+[fsBold];
  TListBox(Control).canvas.TextRect(CRect,0,0,ItemDataArray[Index].str3,ts);

  ts.Alignment:=taRightJustify;
  CRect:=ARect;
  CRect.Left:=CRect.Right-(rx div 2);
  TListBox(Control).canvas.Font.Color:=clGreen;
  TListBox(Control).canvas.Font.Style:=fs+[fsBold,fsItalic];
  TListBox(Control).canvas.TextRect(CRect,0,0,ItemDataArray[Index].str4,ts);
end;


А вот мой ....

Код: Выделить всё
Function  TF1.NewItemSList(Stol,Zall,Cena,Sost:String; Sel:Boolean):TPanel;
var
  PL,PL1,PL2:TPanel;
begin
PL:=TPanel.Create(f1);pl.Align:=alTop;  PL.Height:=82;
if sel then pl.Color:=clRed;
PL.Caption:=Cena;
PL1:=TPanel.Create(pl); PL1.Width:=80; pl1.Align:=alLeft;
  PL.InsertControl(PL1);
     PL2:=TPanel.Create(pl1); PL2.Height:=40; pl2.Align:=alTop;
     PL2.Caption:=Zall;
      PL1.InsertControl(PL2);
     PL2:=TPanel.Create(pl1); PL2.Height:=40; pl2.Align:=alTop;
     PL2.Caption:=Stol;
      PL1.InsertControl(PL2);
PL1:=TPanel.Create(pl); PL1.Width:=60; pl1.Align:=alRight; pl1.Font.Color:=clGreen;
PL1.Caption:=Sost;
  PL.InsertControl(PL1);
pl.OnClick:=@Panel1Click;
Result:=PL;
end;


Что бы заменить твой код своим ( в твоей же версии программы) мне понадобится практически ОДНА дополнительная строчка ...
Что-то вроде:
pl:= NewItemSList(...); TListBox(Control).canvas.CopyRect(ARect,PL.Canvas,pl.BoundsRect);pl.free;

Коментарии практически излишни ... (Особенно при учете того, что мой код можно еще чуть подсократить )
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение zub » 28.10.2016 02:12:23

>>Но я признаться думал что и намека будет достаточно .
Я прекрасно понимаю что ты хочешь. Так делать нельзя.
Вернее какбы можно, и наверно если никому не показывать как оно работает - никто и не заметит (пока в списке не появится достаточное колво элементов). Я уверен что для програмистов которые такое допускают в аду есть специальная сковорода.

Сам как думаешь, переживет твой способ добавление 10000 итемов? Сколько времени это займет? потом реально будет чтонить поскролить-поресайзить?
Я думаю не переживет(( еще и винду подвесит при вылете. Вангую невозможность работы с такой реализацией уже на ~300 итемов.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение sign » 28.10.2016 06:46:10

AlexDanilov писал(а):Добрый вечер, коллеги.

Пожалуйста, посоветуйте компонент табличного представления, в котором можно:
1. Управлять высотой или отступами в ячейках
2. Задавать шрифт каждой ячейке
3. Выводить многострочное содержание

Во вложении пример, как я хочу, чтобы таблица выглядела.

Использую сплошь и рядом VirtualTreeView

Можно всё!
В примере, строка со свечой выделена, там Hot выделение, когда над строкой проходит курсор.
Желтый фон строки - фокус.
Синий цвет шрифта - заголовки разделов.

1.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение zub » 28.10.2016 09:16:34

sign писал(а):Использую сплошь и рядом VirtualTreeView

Можно всё!

Я против VirtualTreeView ниче сказать нехочу)), но его использование а в рамках топика (не для дерева) избыточно - это по сути будет тотже TListBox\TListView с овнердравом.

VirtualTreeView выглядит нативно на lin/win с хитрыми темами?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение serbod » 28.10.2016 15:01:16

zub писал(а):Сам как думаешь, переживет твой способ добавление 10000 итемов? Сколько времени это займет? потом реально будет чтонить поскролить-поресайзить?
Я думаю не переживет(( еще и винду подвесит при вылете. Вангую невозможность работы с такой реализацией уже на ~300 итемов.

Создание 10 000 панелек внутри TScrollBox займет пару секунд на винде и Pentium4. А отрисовка (прокрутка и ресайз) вообще не тормозят. На миникомпьютерах (RaspberryPi, CubieBoard, итд..) может заметно тормозить изменение Parent контрола (не знаю почему), но 300 панелек не проблема.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение zub » 28.10.2016 16:04:27

>>Создание 10 000 панелек внутри TScrollBox займет пару секунд на винде и Pentium4. А отрисовка (прокрутка и ресайз) вообще не тормозят.
c Align:=alTop? может путаете с vcl? (хотя сомневаюсь что там такое прокатит)
Ну ладно, дождемся теста

Добавлено спустя 2 минуты 18 секунд:
Проверил, для I7 и вин7 это проблема:
Код: Выделить всё
procedure TForm1._onCreate(Sender: TObject);
var
  i:integer;
begin
  ScrollBox1.DisableAlign;
  for i:=1 to 1000 do
  with TPanel.Create(self) do
  begin
    align:=alTop;
    parent:=ScrollBox1;
  end;
  ScrollBox1.EnableAlign;
end;
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение serbod » 28.10.2016 16:56:21

На Core-i3 таблица из 5000 контролов:
TPanel ~3.5 секунды.
TLabel ~1.2 секунды
TStaticText ~3.1 секунды

Код: Выделить всё
procedure TFormMain.btnTestClick(Sender: TObject);
var
  dt: TDateTime;
  x, y: Integer;
  Pan: TPanel;
begin
  dt := Now();
  ScrollBox1.Visible := False;
  for y := 0 to 1000-1 do
  begin
    for x := 0 to 5-1 do
    begin
      Pan := TPanel.Create(ScrollBox1);
      Pan.Name := 'Pan_'+IntToStr(y)+'_'+IntToStr(x);
      Pan.AutoSize := False;
      Pan.Width := 100;
      Pan.Height := 25;
      Pan.Top := y * Pan.Height;
      Pan.Left := x * Pan.Width;
      Pan.Parent := ScrollBox1;
    end;
  end;
  ScrollBox1.Visible := True;
  lbStatus.Caption := FormatDateTime('nn:ss.zzz', Now()-dt);
end;
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Посоветуйте компонент типа ListView но с форматированием

Сообщение zub » 28.10.2016 17:31:10

1. Разговор о 10000 итемов. т.е. в 10000 в столбик (если не понял к чему я клоню - это должно переполнить макстмальную высоту скролбокса :mrgreen: )
2. ScrollBox1.Visible - уверен что не моргнет на всех поддерживаемых платформах? а если моргнет? а если к размеру скролбокса есть привязки и будет реалигн всего хозяйства на форме?
3. Где align? суть спора в
Alex2013 писал(а):Тем что можно юзать центровку и прочий сервис стандартных компонент не вникая в "тонкую механику" а в общем случае даже в координаты . Важно не на чем "рисовать", а как обойтись без "рисования"

Сам считаешь координаты... Тогда уж и рисуй сам
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: MailRu[bot] и гости: 87

Рейтинг@Mail.ru