Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / нестандартная сортировка в TreeView / 25 сообщений из 57, страница 1 из 3
08.02.2018, 15:13
    #39599084
TsYekaterina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная сортировка в TreeView
Добрый день! подскажите пожалуйста, как отсортировать данные в 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
08.02.2018, 15:16
    #39599089
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная сортировка в TreeView
TsYekaterinaШтифт 2.3х16.019
Штифт 2.3х8

???
...
Рейтинг: 0 / 0
08.02.2018, 15:19
    #39599096
TsYekaterina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная сортировка в TreeView
ок, это тоже наоборот конечно....
...
Рейтинг: 0 / 0
08.02.2018, 15:21
    #39599101
TsYekaterina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная сортировка в TreeView
что, так невозможно? не может быть...
...
Рейтинг: 0 / 0
08.02.2018, 15:21
    #39599102
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная сортировка в TreeView
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
08.02.2018, 15:24
    #39599105
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная сортировка в TreeView
TsYekaterina,

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

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

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

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

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

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

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

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

не совсем поняла, если честно, о чем Вы...
...
Рейтинг: 0 / 0
08.02.2018, 15:38
    #39599133
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная сортировка в TreeView
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
08.02.2018, 15:42
    #39599139
TsYekaterina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная сортировка в TreeView
[quot Arioch]Arioch сортировать данные ПЕРЕД их внесением в дерево
то есть это в момент формирования дерева, потому что данных в дереве больше 11 000, и возможно, лучше их сортировать до внесения в дерево?
...
Рейтинг: 0 / 0
08.02.2018, 15:45
    #39599142
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная сортировка в TreeView
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
08.02.2018, 15:46
    #39599144
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная сортировка в TreeView
TsYekaterinaне совсем поняла, если честно, о чем Вы...
Строку нужно разбирать на составные посимвольно. При чем первым словом можно пренебречь еще до разбора (вырезать).
...
Рейтинг: 0 / 0
08.02.2018, 15:49
    #39599149
TsYekaterina
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
нестандартная сортировка в TreeView
Ariochwadman,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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