powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / нестандартная сортировка в TreeView
25 сообщений из 57, страница 1 из 3
нестандартная сортировка в TreeView
    #39599084
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! подскажите пожалуйста, как отсортировать данные в treeview в узле необходимым мне образом?
например, такой набор данных:
Штифт 1х4
Штифт 1х5
Штифт 2.10х36
Штифт 2.2х16.Хим.Окс.прм
Штифт 2.2х20
Штифт 2.3х16.019
Штифт 2.3х8
Штифт 2.6х16
Штифт 2х12.20Х13.Хим.Пас
Штифт 2х14
Штифт 2х16
Штифт 2х4
Штифт 2х5
Штифт 2х5.019
Штифт 2х5.20Х13.Хим.Пас
Штифт 2х8
Штифт 2х8.0115
Штифт 3х16.20Х13.Хим.Пас
Штифт 6х36.20Х13.Хим.Пас
нужно отсортировать, чтобы было:
Штифт 1х4
Штифт 1х5
Штифт 2х12.20Х13.Хим.Пас
Штифт 2х14
Штифт 2х16
Штифт 2х4
Штифт 2х5
Штифт 2х5.019
Штифт 2х5.20Х13.Хим.Пас
Штифт 2х8
Штифт 2х8.0115
Штифт 2.2х16.Хим.Окс.прм
Штифт 2.2х20
Штифт 2.3х16.019
Штифт 2.3х8
Штифт 2.6х16
Штифт 2.10х36

не представляю, как это сделать...
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599089
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsYekaterinaШтифт 2.3х16.019
Штифт 2.3х8

???
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599096
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ок, это тоже наоборот конечно....
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599101
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что, так невозможно? не может быть...
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599102
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. пишешь функцию, которая сравнивает две записи и сообщает какая из них больше, а какая меньше (comparison function)
2. запрашиваешь сортировку, с использованием этой своей функции сравнения (CustomSort)

Лучше всего сортировать данные заранее, до того, как они попадут в визуальный компонент (в данном случае TTreeView, но не важно, правило общее).

Если это невозможно, то сортировать можно уже "в дереве"

Например так ,если функцию сравнения оформить отдельной глобальной функцией
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ComCtrls_TCustomTreeView_CustomSort.html

Или вот так, если функцию сравнения оформить событием TTreeView.OnCompare
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ComCtrls_TCustomTreeView_AlphaSort.html
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599105
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsYekaterina,

Это тролль, вышел из троллиного загончика в тематические форумы и с удивлением для себя обнаружил там обитаемый мир
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599108
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch, понятно
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599110
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch,

то есть работать нужно с каждой записью отдельно?
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599119
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работать нужно с парами записей.
Какие пару будут - о каких Delphi спросит, такие и будут.

Ваша задача - дать функцию сравнения, которой предъявят два объекта ( два указателя ,две строки - детали не важны ), а она даст результат сравнения (целое число, которое <0 или =0 или >0)

Ищите примеры Delphi Custom Sort

В разных классах используются немножко разное оформление, немножко разные названия и т.д.

Но суть не меняется. Мы должны написать свой коомпаратор (сравнивалку) в том или ином виде, а потом в том или ином виде попросить Delphi сортировать не по её встроенным правилам, а по правилу нашей собственнйо сортировки.

Ничего сложного тут нет, скорее нудное дело. Поищите примеры и задания на тему custom Sort, напишите пяток демонстрашек, и уловите идею.
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599122
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще вопрос, насколько вообще много азписей в дереве.
TTreeView не самый быстрый компонент Windows
Если количество строк в целом пойдет на тысячи ,а тем более на десятки тысяч, то нужно будет искта ьрдугие компоненты, например VTV
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599123
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо! будем искать...
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599124
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsYekaterinaне представляю, как это сделать...
Есть слово "шрифт ", которое всегда можно игнорировать.
Далее два числа [с точкой] через букву "х".

Или нужен именно рабочий код?
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599131
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

не совсем поняла, если честно, о чем Вы...
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599133
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ComCtrls_TCustomTreeView_CustomSort.html

Этот метод сортирует все дерево целиком.

Но можно сортировать и конкретный куст, начиная от какого-то элемента и ниже.
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ComCtrls_TTreeNode_CustomSort.html

Впрочем, повторюсь, концептуально правильнее и быстрее в работе программы сортировать данные ПЕРЕД их внесением в дерево. Конечно, если дерево маленькое и программа одноразовая, то можно и пренебречь.
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599139
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Arioch]Arioch сортировать данные ПЕРЕД их внесением в дерево
то есть это в момент формирования дерева, потому что данных в дереве больше 11 000, и возможно, лучше их сортировать до внесения в дерево?
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599142
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

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

в принципе строка состоит из отдельных участков

1) чисел
2) нечисел
3) поломатых чисел

числа - это последовательность из цифр и точек, в которой точек ноль или одна. Сразу вопрос, могут ли вместо точек быть запятые?

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

нечисла - это всё остальное, сравниваются просто как текст. Ну и опять "снова вопрос" - вероятно большие и малые буквы не различаются? Как "Аааа", больше (позже), чем "ААаа", или равны ?
http://www.delphisources.ru/pages/faq/faq_delphi_basics/AnsiCompareText.php.html
http://www.delphisources.ru/pages/faq/faq_delphi_basics/AnsiCompareStr.php.html

Компаратор ползет по строке, отсекая участки типа 1/2/3 и по достиэении каждого участка проводит сравнения, пока не найдет первое неравенство.

В общем, все очевидно просто, но до чёртиков нудно и скучно.
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599144
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsYekaterinaне совсем поняла, если честно, о чем Вы...
Строку нужно разбирать на составные посимвольно. При чем первым словом можно пренебречь еще до разбора (вырезать).
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599149
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ariochwadman,

Компаратор ползет по строке, отсекая участки типа 1/2/3 и по достиэении каждого участка проводит сравнения, пока не найдет первое неравенство.

начала копать именно в этом направлении.
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599157
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsYekaterinaArioch сортировать данные ПЕРЕД их внесением в дерево
то есть это в момент формирования дерева, потому что данных в дереве больше 11 000, и возможно, лучше их сортировать до внесения в дерево?

Если уже есть 11К записей - и в будущем номенклатура будет только увеличиваться - я бы уже отказался от TTreeView и научился работать с TVirtualTreeView (TVirtualStringTree), в частности совсем не обязательно грузить все дерево сразу, достаточно грузить те куски ,которые видны на экране. Впрочем, если скорость будет достаточной, можно и сразу всё загрузить.

И ещё, у вас дерево или плоский список ?

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

Но это плохая привычка, которая вас потом догонит и укусит сзади.

Деревья и прочее - это контролы для показа информации на экране, а не для хранения и подготовки информации. Даже там, где скорости пока достаточно.

Допустим вы решите пока использовать обычный Windows TTreeView, попробуете так и этак, и пока что скорости достаточно. Через год будет не 11 тысяч записей, а 110 тысяч ,и дерево надо будет срочно менять.

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

Есть у вашей программы долгое будущее или это одноразовый инструмент, использовать и выкинуть - знаете только вы.
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599161
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Arioch]TsYekaterinaпропущено...

И ещё, у вас дерево или плоский список ?

дерево с множеством родителей и потомков
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599168
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AriochTsYekaterinaпропущено...

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

И вот перед заполнением каждого уровня желательно его заранее отсортировать.
а как это осуществить? я понимаю, что это намного умнее и эффективнее...
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599170
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хочется научиться, чтобы дальше я могла этим оперировать...
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599185
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsYekaterina,

а как вы сейчас заполняете каждый уровень ?

вы берете какой-то источник (массив, TList<record-type>, TCollection, ...), бежите по нему в цикле и по одной строчке вставляете в текущего родителя в дереве. Вот в промежуток между "получили источник" и "побежали по источнику" надо вставить "отсортировать источник по моему нестандартному правилу сравнения".

Как делается последнее вам сказали.
Как оформляется - немного по разному в разных источниках. Идея одна и та же, но конкретные названия и типы (boilerplate) отличаются.


AriochИщите примеры Delphi Custom Sort
В разных классах используются немножко разное оформление, немножко разные названия и т.д.
Но суть не меняется.

Для начала можете не в дерево выводить, а например в TMemo для простоты, для демонстрашки.
В качестве источника - просто сотня названий из списка.
Например в текстовом файле.

грузите оттуда строчку за строчкой в источник ( TList<string> или TStringList ), потом делаете Custom Sort в применении к выбранному источнику, потом делаете типа Memo1.Lines.AddStrings( источник );

когда суть процесса заработает, начнете его переформлять применительно к вашему дереву и вашей процедуре его загрузки.
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599188
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TsYekaterina,

http://www.yandex.ru/yandsearch?clid=9582&text=пример delphi ttreeview customsort

для первого ознакомления с темой
...
Рейтинг: 0 / 0
нестандартная сортировка в TreeView
    #39599189
TsYekaterina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch,

спасибо!
...
Рейтинг: 0 / 0
25 сообщений из 57, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / нестандартная сортировка в TreeView
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]