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

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

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

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

Сообщение serbod » 28.10.2016 17:52:38

Координаты это по старой дельфйской привычке. Автоматический align дело хорошее, я уже писал разработчикам Лазаря про TControlGrid. Но главная проблема не расположить и отрисовать контролы - это чистая математика и делается очень быстро. Проблема в создании и инициализации большого количества "тяжелых" визуальных объектов, это сильно нагружает менеджер памяти и может сильно зависеть от библиотеки виджетов (Win, Qt, Gtk, итд..). И Visible := False тут не всегда помогает. Нужны "виртуальные" контролы, легкие и абстрактные. Как TListItem, TTreeItem. А из них уже строить визуальные контролы, близкие к нативным - всякие TMenu, TToolBar, TListView..

Но пока что получается, что предельно простой TStaticText по скорости инициализации примерно равен довольно сложному TPanel..
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

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

Сообщение zub » 28.10.2016 18:04:05

Главная проблема в том что надо стараться использовать всё как задумано. Костылять можно - для себя от лени или когда другого выхода нет, а надо здесь и сейчас...
Рекомендовать такое на форумах, а темболее пропагандировать как хорошее решение нельзя!
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение serbod » 28.10.2016 18:34:57

Увы, Borland не успел развить тему стандартных контролов как элементов контейнеров. И получается, что у каждой библиотеки визуальных компонентов свои варианты стандартных контролов, которые не взаимозаменяемы. Даже в стандартных библиотеках есть отдельно Data Controls, отдельно RTTI Controls, отдельно контролы для LazReport, а еще куча всяких Edit'ов, которые по сути обычный TEdit с кнопкой.

А ведь были задумки делать комбинации контролов - TUpDown линкуется к TEdit и наделяет его новыми свойствами. В TActionList есть действия для списков (TListBox, TComboBox, и подобные), что позволяло привязать один виртуальный список к нескольким визуальным. Если бы Borland не сдох, то в дельфях было бы сделано даже лучше, чем в Qt.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

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

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

serbod писал(а):Увы, Borland не успел развить тему стандартных контролов как элементов контейнеров.

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

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

Сообщение Alex2013 » 29.10.2016 01:49:24

"Ой мама шикидым!" :idea: :shock: :roll:
Изображение
(Старый скрин увы потерян. это 32 бита на 64 битной оси в режиме 64 бита вообще 0.0127 c )
:arrow: SuperPanel.7z

Сам в трансе ... я уперся в визуализацию (до сих пор чуть дергается при выборе ) и на скорость внимание не обращал ...
Что у тебя с очисткой списка я вообще с трудом понимаю .
Даже если бы я делал ее в цикле получил бы примерно равную с заполнением скорость ...
Заполнение честное ...
Код: Выделить всё
SuperList.add('0|'+IntToStr(i+1)+'|'+'Малый зал'+'|'+'300$'+'|'+'Закрыт');

(То есть я не рисую картинку по номеру, а реально беру данные из списка .)

Хотя на своем опыте почти убедился что рисовать твоим способом ближе "образцам мирового искусства" но то что ты делаешь с данными это тихий при тихий ужос ... Карл пошел пить валерьянку ...
Зы
СкролБокс вообще "не приделах" был с самого начала . Ну лень мне было DrawList (как в этой версии ) написать сразу... да там пять-десять строчек но это же сразу понятно, что нужно как в литбоксе только видимые элементы показывать . Тут тоже чуть лень проявляется ...
Понятно что нужно сделать замену полей в нарисованных панельках, а не тупо чистить весь список котролов и вставлять все по новому .
(результат авто настройка чуть чуть но дергает изображение, что если заметишь сразу создает плющение недоделки... )
Последний раз редактировалось Alex2013 07.09.2022 15:40:52, всего редактировалось 4 раз(а).
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 29.10.2016 02:36:30

Ндаа... Почему это уже не скролбокс с кучей панелов??

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

>>Что у тебя с очисткой списка я вообще с трудом понимаю .
У меня с ней всё в порядке. я делал стресс-тест с самым плохим сценарием - удаление всех элементов по одному, задом наперед.
Я тоже могу хлопнуть всё сразу, только какой в этом смысл в рамках данного теста? Смысл должен быть таким чтоб контрол даже в самом плохом сценарии отработал как в хорошем, у меня такой задачи небыло - цифры именно про создание и удаление 10000 итемов поодиночке.
Ок. ты сделал "виртуальный" листбокс с "окном" создание и отображение только видимых элементов (отсыл в тему про ускорение графики :mrgreen: ). Т.е. изначально предложеная реализация тупо в лоб не устроила?
Замечу - объем и сложность кода уже больше моего, а качество хуже(( Скорость у тебя лучше только потому что это не стресс и TStringlist имеет capacity.

Добавлено спустя 4 минуты 17 секунд:
>>но то что ты делаешь с данными это тихий при тихий ужос ... Карл пошел пить валерьянку ...
Повторяю это динмассив. Я думал взять tvector, но не стал - вдруг у тебя 2.6
Это первый шаг - набросок и оценка производительности на плохом сценарии. дальше если это было бы для дела - устранение узких мест и всё пришло бы к максимальной скорости которую может дать листбокс
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Alex2013 » 29.10.2016 03:00:05

Да понял я понял ...
Кстати, попытка напрямую подменить код прорисовки своим треском провалилась ...
Не копируется графика с канваса на канваса хоть тресни . Даже видимый сделал ...ноль внимания фунт презрения . :idea:
может нужно сначала на битмап копировать ?
Последний раз редактировалось Alex2013 29.10.2016 03:01:29, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 29.10.2016 03:01:10

>>Заполнение честное ...
Потом пользователь для разноарбузия переименует залы например в '|\/|алый зал боль|_|_|ого театра' :D

Добавлено спустя 6 минут 47 секунд:
>>может нужно сначала на битмап копировать ?
Снова какаято идея?
Лучше просто убери панели итемов и рисуй итемы руками на исходной панели (или что там у тебя в основе). Так глядишь сделаешь конкурента virtualtree
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Alex2013 » 29.10.2016 03:10:00

zub писал(а):>>Заполнение честное ...
Потом пользователь для разноарбузия переименует залы например в '|\/|лый зал боль|_|_|ого театра' :D

Ну если это реально бы было возможно то я бы заменил знак на что-то еще или вообще (как кстати на самом деле делал) заменил бы строку на шестнадцатеричный дамп и плевать бы хотел на то что внутри еще десять уровней древовидной БД (Объем только с каждым уровнем удваивается но у меня реально было два или три уровня так что все "зайцы шли лесом " ) :mrgreen:

Самый красивый способ борьбы с хитро форматированными строками это пожать их чем-то вроде LZW и написать вначале каждого поля его длину.
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение zub » 29.10.2016 03:26:18

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

Ставим точку:
Если контрол нам по сути ненужен и можно его "нарисовать" - мы рисуем. Это ест на порядок меньше ресурсов.

Добавлено спустя 3 минуты 24 секунды:
>>Самый красивый способ борьбы с хитро форматированными строками это пожать их чем-то вроде LZW и написать вначале каждого поля его длину.
Конечно лучше "придумать" какойнить язык разметки, но если нет - ненадо ничего клеить, нужно хранить соответствующую структуру данных а не юзать "склейку" которая в компилтайме никак не контролируется, а в рантайме кушает проц на ровном месте и может крэшнуться от любого чиха
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Лекс Айрин » 29.10.2016 09:56:25

Alex2013 писал(а):Не копируется графика с канваса на канваса хоть тресни . Даже видимый сделал ...ноль внимания фунт презрения . :idea:
может нужно сначала на битмап копировать ?


Вполне ожидаемо. Данная работа делается системой и ей не надо вмешательства левого кода. Тем более, что, судя по всему, сначала заполняется буфер, а потом с него обновляется канвас.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение zub » 29.10.2016 12:50:27

Alex2013
Кстати, рисовать можно чтоб выглядело как системный контрол
viewtopic.php?f=10&t=5917&start=120#p82977
viewtopic.php?f=10&t=5917&start=135#p83258
контролы там только скролбар и тедит на первом скрине
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Alex2013 » 31.10.2016 11:45:36

Да, посмотрел на твой Object Inspectr и увидел далекое будущее своего "Инспектора элиментов" ... :wink:
Заняться им придется потому как ValueListEditor слишком приметивен и неудобен
.(впрочем возможно я в опциях не разобрался и если настроить все не так уж плохо ка при установках по умолчанию )
Одно по любому плохо, нужно водить дополнительные поля с описанием типов данных в описания инструментов . Сколько кода перелопатить придется ... :roll:
В прочем есть идея как сделать чуть проще : Можно сделать универсальный мастер заполнения (тыкаешь мышкой в название поля и получаешь табличку где самостоятельно выбираешь тип поля или диалог-помощник (Выбор имени файла , цвета,редактор теста или настройку шрифтов... ) :idea: )
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение AlexDanilov » 31.10.2016 18:13:08

Alex2013, ух, большое спасибо за пример!

Подскажите, а может можно также панели добавлять в ListBox или лучше самому написать код, который будет отслеживать, какая строка (TPanel) выбрана в данный момент?
AlexDanilov
новенький
 
Сообщения: 17
Зарегистрирован: 24.10.2016 15:11:46
Откуда: Kiev

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

Сообщение Alex2013 » 31.10.2016 23:50:54

AlexDanilov писал(а):Alex2013, ух, большое спасибо за пример!

Подскажите, а может можно также панели добавлять в ListBox или лучше самому написать код, который будет отслеживать, какая строка (TPanel) выбрана в данный момент?

Всегда пожалуйста .... правда особенно не за что !

Что-то у тебя путаница образовалась .
Если про мой код то там просто нужно заменить "мультиселект" на код вроде этого ...
Код: Выделить всё
const
Ind:LongInt=0;
procedure TF1.Panel1Click(Sender: TObject);
Var S:String;   
    I:LongInt;
Procedure Sel(C:Char;);
begin
S:=SuperList[I]; S[1]:=C;
SuperList[I]:='';SuperList[I]:=S;
end;
begin
I:=IND; Sel('0');
IND:=StrToInt(TPanel(Sender).Hint);
I:=IND; Sel('1');
DrawList;
//тут можно добавить реакцию на выбор
//...
end;

...и получишь почти аналог классического листбокса где Ind будет заменой TListBox.ItemIndex
( в примере нет управления кнопкам клавиатуры но добавить его совсем не сложно ... еще в панель можно добавить например мемо или редактор строк и разные кнопки ) Но в принципе мой вариант бльше годится для показ просмотра и "информационного выбора " чем для замены листбокса с полосой выбора если это устроит просто убери код меняющий цвет панели и все будет отлично . (еще можно добавить стрелку указатель за пределами панели так может получится даже красивее ...)

Код Zub-a сложней но надежнее по прорисовке . За советам по нему лучше обратится непосредственно к автору .
Последний раз редактировалось Alex2013 01.11.2016 00:23:14, всего редактировалось 3 раз(а).
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 91

Рейтинг@Mail.ru