[Решено] Посоветуйте компонент ListView но с форматированием
Модератор: Модераторы
- serbod
- постоялец
- Сообщения: 449
- Зарегистрирован: 16.09.2016 10:03:02
- Откуда: Минск
- Контактная информация:
Координаты это по старой дельфйской привычке. Автоматический align дело хорошее, я уже писал разработчикам Лазаря про TControlGrid. Но главная проблема не расположить и отрисовать контролы - это чистая математика и делается очень быстро. Проблема в создании и инициализации большого количества "тяжелых" визуальных объектов, это сильно нагружает менеджер памяти и может сильно зависеть от библиотеки виджетов (Win, Qt, Gtk, итд..). И Visible := False тут не всегда помогает. Нужны "виртуальные" контролы, легкие и абстрактные. Как TListItem, TTreeItem. А из них уже строить визуальные контролы, близкие к нативным - всякие TMenu, TToolBar, TListView..
Но пока что получается, что предельно простой TStaticText по скорости инициализации примерно равен довольно сложному TPanel..
Но пока что получается, что предельно простой TStaticText по скорости инициализации примерно равен довольно сложному TPanel..
Главная проблема в том что надо стараться использовать всё как задумано. Костылять можно - для себя от лени или когда другого выхода нет, а надо здесь и сейчас...
Рекомендовать такое на форумах, а темболее пропагандировать как хорошее решение нельзя!
Рекомендовать такое на форумах, а темболее пропагандировать как хорошее решение нельзя!
- serbod
- постоялец
- Сообщения: 449
- Зарегистрирован: 16.09.2016 10:03:02
- Откуда: Минск
- Контактная информация:
Увы, Borland не успел развить тему стандартных контролов как элементов контейнеров. И получается, что у каждой библиотеки визуальных компонентов свои варианты стандартных контролов, которые не взаимозаменяемы. Даже в стандартных библиотеках есть отдельно Data Controls, отдельно RTTI Controls, отдельно контролы для LazReport, а еще куча всяких Edit'ов, которые по сути обычный TEdit с кнопкой.
А ведь были задумки делать комбинации контролов - TUpDown линкуется к TEdit и наделяет его новыми свойствами. В TActionList есть действия для списков (TListBox, TComboBox, и подобные), что позволяло привязать один виртуальный список к нескольким визуальным. Если бы Borland не сдох, то в дельфях было бы сделано даже лучше, чем в Qt.
А ведь были задумки делать комбинации контролов - TUpDown линкуется к TEdit и наделяет его новыми свойствами. В TActionList есть действия для списков (TListBox, TComboBox, и подобные), что позволяло привязать один виртуальный список к нескольким визуальным. Если бы Borland не сдох, то в дельфях было бы сделано даже лучше, чем в Qt.
serbod писал(а):Увы, Borland не успел развить тему стандартных контролов как элементов контейнеров.
Борланд делал обертку над контролами предоставлеными windows. Такчто или вопросы к микрософт, или имели бы "ненативные" контролы
"Ой мама шикидым!"

(Старый скрин увы потерян. это 32 бита на 64 битной оси в режиме 64 бита вообще 0.0127 c )
SuperPanel.7z
Сам в трансе ... я уперся в визуализацию (до сих пор чуть дергается при выборе ) и на скорость внимание не обращал ...
Что у тебя с очисткой списка я вообще с трудом понимаю .
Даже если бы я делал ее в цикле получил бы примерно равную с заполнением скорость ...
Заполнение честное ...
(То есть я не рисую картинку по номеру, а реально беру данные из списка .)
Хотя на своем опыте почти убедился что рисовать твоим способом ближе "образцам мирового искусства" но то что ты делаешь с данными это тихий при тихий ужос ... Карл пошел пить валерьянку ...
Зы
СкролБокс вообще "не приделах" был с самого начала . Ну лень мне было DrawList (как в этой версии ) написать сразу... да там пять-десять строчек но это же сразу понятно, что нужно как в литбоксе только видимые элементы показывать . Тут тоже чуть лень проявляется ...
Понятно что нужно сделать замену полей в нарисованных панельках, а не тупо чистить весь список котролов и вставлять все по новому .
(результат авто настройка чуть чуть но дергает изображение, что если заметишь сразу создает плющение недоделки... )

(Старый скрин увы потерян. это 32 бита на 64 битной оси в режиме 64 бита вообще 0.0127 c )
Сам в трансе ... я уперся в визуализацию (до сих пор чуть дергается при выборе ) и на скорость внимание не обращал ...
Что у тебя с очисткой списка я вообще с трудом понимаю .
Даже если бы я делал ее в цикле получил бы примерно равную с заполнением скорость ...
Заполнение честное ...
Код: Выделить всё
SuperList.add('0|'+IntToStr(i+1)+'|'+'Малый зал'+'|'+'300$'+'|'+'Закрыт');
(То есть я не рисую картинку по номеру, а реально беру данные из списка .)
Хотя на своем опыте почти убедился что рисовать твоим способом ближе "образцам мирового искусства" но то что ты делаешь с данными это тихий при тихий ужос ... Карл пошел пить валерьянку ...
Зы
СкролБокс вообще "не приделах" был с самого начала . Ну лень мне было DrawList (как в этой версии ) написать сразу... да там пять-десять строчек но это же сразу понятно, что нужно как в литбоксе только видимые элементы показывать . Тут тоже чуть лень проявляется ...
Понятно что нужно сделать замену полей в нарисованных панельках, а не тупо чистить весь список котролов и вставлять все по новому .
(результат авто настройка чуть чуть но дергает изображение, что если заметишь сразу создает плющение недоделки... )
Последний раз редактировалось Alex2013 07.09.2022 14:40:52, всего редактировалось 4 раза.
Ндаа... Почему это уже не скролбокс с кучей панелов??
>>Заполнение честное ...
не спорю, я тебя обгоню применив другой контейнер - tvector вместо динмассива. или сделаю примерно также используя список который не люблю
>>Что у тебя с очисткой списка я вообще с трудом понимаю .
У меня с ней всё в порядке. я делал стресс-тест с самым плохим сценарием - удаление всех элементов по одному, задом наперед.
Я тоже могу хлопнуть всё сразу, только какой в этом смысл в рамках данного теста? Смысл должен быть таким чтоб контрол даже в самом плохом сценарии отработал как в хорошем, у меня такой задачи небыло - цифры именно про создание и удаление 10000 итемов поодиночке.
Ок. ты сделал "виртуальный" листбокс с "окном" создание и отображение только видимых элементов (отсыл в тему про ускорение графики
). Т.е. изначально предложеная реализация тупо в лоб не устроила?
Замечу - объем и сложность кода уже больше моего, а качество хуже(( Скорость у тебя лучше только потому что это не стресс и TStringlist имеет capacity.
Добавлено спустя 4 минуты 17 секунд:
>>но то что ты делаешь с данными это тихий при тихий ужос ... Карл пошел пить валерьянку ...
Повторяю это динмассив. Я думал взять tvector, но не стал - вдруг у тебя 2.6
Это первый шаг - набросок и оценка производительности на плохом сценарии. дальше если это было бы для дела - устранение узких мест и всё пришло бы к максимальной скорости которую может дать листбокс
>>Заполнение честное ...
не спорю, я тебя обгоню применив другой контейнер - tvector вместо динмассива. или сделаю примерно также используя список который не люблю
>>Что у тебя с очисткой списка я вообще с трудом понимаю .
У меня с ней всё в порядке. я делал стресс-тест с самым плохим сценарием - удаление всех элементов по одному, задом наперед.
Я тоже могу хлопнуть всё сразу, только какой в этом смысл в рамках данного теста? Смысл должен быть таким чтоб контрол даже в самом плохом сценарии отработал как в хорошем, у меня такой задачи небыло - цифры именно про создание и удаление 10000 итемов поодиночке.
Ок. ты сделал "виртуальный" листбокс с "окном" создание и отображение только видимых элементов (отсыл в тему про ускорение графики
Замечу - объем и сложность кода уже больше моего, а качество хуже(( Скорость у тебя лучше только потому что это не стресс и TStringlist имеет capacity.
Добавлено спустя 4 минуты 17 секунд:
>>но то что ты делаешь с данными это тихий при тихий ужос ... Карл пошел пить валерьянку ...
Повторяю это динмассив. Я думал взять tvector, но не стал - вдруг у тебя 2.6
Это первый шаг - набросок и оценка производительности на плохом сценарии. дальше если это было бы для дела - устранение узких мест и всё пришло бы к максимальной скорости которую может дать листбокс
Да понял я понял ...
Кстати, попытка напрямую подменить код прорисовки своим треском провалилась ...
Не копируется графика с канваса на канваса хоть тресни . Даже видимый сделал ...ноль внимания фунт презрения .
может нужно сначала на битмап копировать ?
Кстати, попытка напрямую подменить код прорисовки своим треском провалилась ...
Не копируется графика с канваса на канваса хоть тресни . Даже видимый сделал ...ноль внимания фунт презрения .
может нужно сначала на битмап копировать ?
Последний раз редактировалось Alex2013 29.10.2016 02:01:29, всего редактировалось 1 раз.
>>Заполнение честное ...
Потом пользователь для разноарбузия переименует залы например в '|\/|алый зал боль|_|_|ого театра'
Добавлено спустя 6 минут 47 секунд:
>>может нужно сначала на битмап копировать ?
Снова какаято идея?
Лучше просто убери панели итемов и рисуй итемы руками на исходной панели (или что там у тебя в основе). Так глядишь сделаешь конкурента virtualtree
Потом пользователь для разноарбузия переименует залы например в '|\/|алый зал боль|_|_|ого театра'
Добавлено спустя 6 минут 47 секунд:
>>может нужно сначала на битмап копировать ?
Снова какаято идея?
Лучше просто убери панели итемов и рисуй итемы руками на исходной панели (или что там у тебя в основе). Так глядишь сделаешь конкурента virtualtree
zub писал(а):>>Заполнение честное ...
Потом пользователь для разноарбузия переименует залы например в '|\/|лый зал боль|_|_|ого театра'
Ну если это реально бы было возможно то я бы заменил знак на что-то еще или вообще (как кстати на самом деле делал) заменил бы строку на шестнадцатеричный дамп и плевать бы хотел на то что внутри еще десять уровней древовидной БД (Объем только с каждым уровнем удваивается но у меня реально было два или три уровня так что все "зайцы шли лесом " )
Самый красивый способ борьбы с хитро форматированными строками это пожать их чем-то вроде LZW и написать вначале каждого поля его длину.
>>заменил бы строку на шестнадцатеричный дамп и плевать бы хотел на то что внутри еще десять уровней древовидной
Несогласен. но это уже уходит за рамки топика.
Ставим точку:
Если контрол нам по сути ненужен и можно его "нарисовать" - мы рисуем. Это ест на порядок меньше ресурсов.
Добавлено спустя 3 минуты 24 секунды:
>>Самый красивый способ борьбы с хитро форматированными строками это пожать их чем-то вроде LZW и написать вначале каждого поля его длину.
Конечно лучше "придумать" какойнить язык разметки, но если нет - ненадо ничего клеить, нужно хранить соответствующую структуру данных а не юзать "склейку" которая в компилтайме никак не контролируется, а в рантайме кушает проц на ровном месте и может крэшнуться от любого чиха
Несогласен. но это уже уходит за рамки топика.
Ставим точку:
Если контрол нам по сути ненужен и можно его "нарисовать" - мы рисуем. Это ест на порядок меньше ресурсов.
Добавлено спустя 3 минуты 24 секунды:
>>Самый красивый способ борьбы с хитро форматированными строками это пожать их чем-то вроде LZW и написать вначале каждого поля его длину.
Конечно лучше "придумать" какойнить язык разметки, но если нет - ненадо ничего клеить, нужно хранить соответствующую структуру данных а не юзать "склейку" которая в компилтайме никак не контролируется, а в рантайме кушает проц на ровном месте и может крэшнуться от любого чиха
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Alex2013 писал(а):Не копируется графика с канваса на канваса хоть тресни . Даже видимый сделал ...ноль внимания фунт презрения .
может нужно сначала на битмап копировать ?
Вполне ожидаемо. Данная работа делается системой и ей не надо вмешательства левого кода. Тем более, что, судя по всему, сначала заполняется буфер, а потом с него обновляется канвас.
Alex2013
Кстати, рисовать можно чтоб выглядело как системный контрол
viewtopic.php?f=10&t=5917&start=120#p82977
viewtopic.php?f=10&t=5917&start=135#p83258
контролы там только скролбар и тедит на первом скрине
Кстати, рисовать можно чтоб выглядело как системный контрол
viewtopic.php?f=10&t=5917&start=120#p82977
viewtopic.php?f=10&t=5917&start=135#p83258
контролы там только скролбар и тедит на первом скрине
Да, посмотрел на твой Object Inspectr и увидел далекое будущее своего "Инспектора элиментов" ...
Заняться им придется потому как ValueListEditor слишком приметивен и неудобен
.(впрочем возможно я в опциях не разобрался и если настроить все не так уж плохо ка при установках по умолчанию )
Одно по любому плохо, нужно водить дополнительные поля с описанием типов данных в описания инструментов . Сколько кода перелопатить придется ...
В прочем есть идея как сделать чуть проще : Можно сделать универсальный мастер заполнения (тыкаешь мышкой в название поля и получаешь табличку где самостоятельно выбираешь тип поля или диалог-помощник (Выбор имени файла , цвета,редактор теста или настройку шрифтов... )
)
Заняться им придется потому как ValueListEditor слишком приметивен и неудобен
.(впрочем возможно я в опциях не разобрался и если настроить все не так уж плохо ка при установках по умолчанию )
Одно по любому плохо, нужно водить дополнительные поля с описанием типов данных в описания инструментов . Сколько кода перелопатить придется ...
В прочем есть идея как сделать чуть проще : Можно сделать универсальный мастер заполнения (тыкаешь мышкой в название поля и получаешь табличку где самостоятельно выбираешь тип поля или диалог-помощник (Выбор имени файла , цвета,редактор теста или настройку шрифтов... )
-
AlexDanilov
- новенький
- Сообщения: 17
- Зарегистрирован: 24.10.2016 14:11:46
- Откуда: Kiev
Alex2013, ух, большое спасибо за пример!
Подскажите, а может можно также панели добавлять в ListBox или лучше самому написать код, который будет отслеживать, какая строка (TPanel) выбрана в данный момент?
Подскажите, а может можно также панели добавлять в ListBox или лучше самому написать код, который будет отслеживать, какая строка (TPanel) выбрана в данный момент?
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 31.10.2016 23:23:14, всего редактировалось 3 раза.
