|
|
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Добрый день! подскажите пожалуйста, как отсортировать данные в 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 не представляю, как это сделать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:13 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterinaШтифт 2.3х16.019 Штифт 2.3х8 ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:16 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
ок, это тоже наоборот конечно.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:19 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
что, так невозможно? не может быть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:21 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:21 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterina, Это тролль, вышел из троллиного загончика в тематические форумы и с удивлением для себя обнаружил там обитаемый мир ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:24 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Arioch, понятно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:25 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Arioch, то есть работать нужно с каждой записью отдельно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:28 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Работать нужно с парами записей. Какие пару будут - о каких Delphi спросит, такие и будут. Ваша задача - дать функцию сравнения, которой предъявят два объекта ( два указателя ,две строки - детали не важны ), а она даст результат сравнения (целое число, которое <0 или =0 или >0) Ищите примеры Delphi Custom Sort В разных классах используются немножко разное оформление, немножко разные названия и т.д. Но суть не меняется. Мы должны написать свой коомпаратор (сравнивалку) в том или ином виде, а потом в том или ином виде попросить Delphi сортировать не по её встроенным правилам, а по правилу нашей собственнйо сортировки. Ничего сложного тут нет, скорее нудное дело. Поищите примеры и задания на тему custom Sort, напишите пяток демонстрашек, и уловите идею. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:32 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
И еще вопрос, насколько вообще много азписей в дереве. TTreeView не самый быстрый компонент Windows Если количество строк в целом пойдет на тысячи ,а тем более на десятки тысяч, то нужно будет искта ьрдугие компоненты, например VTV ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:33 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
спасибо! будем искать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:33 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterinaне представляю, как это сделать... Есть слово "шрифт ", которое всегда можно игнорировать. Далее два числа [с точкой] через букву "х". Или нужен именно рабочий код? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:33 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
wadman, не совсем поняла, если честно, о чем Вы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:38 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
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 Впрочем, повторюсь, концептуально правильнее и быстрее в работе программы сортировать данные ПЕРЕД их внесением в дерево. Конечно, если дерево маленькое и программа одноразовая, то можно и пренебречь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:38 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
[quot Arioch]Arioch сортировать данные ПЕРЕД их внесением в дерево то есть это в момент формирования дерева, потому что данных в дереве больше 11 000, и возможно, лучше их сортировать до внесения в дерево? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:42 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
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 и по достиэении каждого участка проводит сравнения, пока не найдет первое неравенство. В общем, все очевидно просто, но до чёртиков нудно и скучно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:45 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterinaне совсем поняла, если честно, о чем Вы... Строку нужно разбирать на составные посимвольно. При чем первым словом можно пренебречь еще до разбора (вырезать). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:46 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Ariochwadman, Компаратор ползет по строке, отсекая участки типа 1/2/3 и по достиэении каждого участка проводит сравнения, пока не найдет первое неравенство. начала копать именно в этом направлении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:49 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterinaArioch сортировать данные ПЕРЕД их внесением в дерево то есть это в момент формирования дерева, потому что данных в дереве больше 11 000, и возможно, лучше их сортировать до внесения в дерево? Если уже есть 11К записей - и в будущем номенклатура будет только увеличиваться - я бы уже отказался от TTreeView и научился работать с TVirtualTreeView (TVirtualStringTree), в частности совсем не обязательно грузить все дерево сразу, достаточно грузить те куски ,которые видны на экране. Впрочем, если скорость будет достаточной, можно и сразу всё загрузить. И ещё, у вас дерево или плоский список ? Если дерево, то на каждом уровне у вас не 11К записей, а наверное 20-30. И вот перед заполнением каждого уровня желательно его заранее отсортировать. Можно сортировать и внутри дерева - два-три десятка непосредственный детей отсортируются очень быстро. Но это плохая привычка, которая вас потом догонит и укусит сзади. Деревья и прочее - это контролы для показа информации на экране, а не для хранения и подготовки информации. Даже там, где скорости пока достаточно. Допустим вы решите пока использовать обычный Windows TTreeView, попробуете так и этак, и пока что скорости достаточно. Через год будет не 11 тысяч записей, а 110 тысяч ,и дерево надо будет срочно менять. Если вы сейчас заморочились и написали сортировку вне дерева, вам нужно будет только поменять типа переменных и заменить метод добавления листа со старого дерев на новое. Если вы сейчас съэкономите и сделаете сортировку средствами самого контрола, то в таком случае потом переписывать будет намного больше. Есть у вашей программы долгое будущее или это одноразовый инструмент, использовать и выкинуть - знаете только вы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:52 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
[quot Arioch]TsYekaterinaпропущено... И ещё, у вас дерево или плоский список ? дерево с множеством родителей и потомков ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:56 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
AriochTsYekaterinaпропущено... то есть это в момент формирования дерева, потому что данных в дереве больше 11 000, и возможно, лучше их сортировать до внесения в дерево? И вот перед заполнением каждого уровня желательно его заранее отсортировать. а как это осуществить? я понимаю, что это намного умнее и эффективнее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 15:59 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
хочется научиться, чтобы дальше я могла этим оперировать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 16:00 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterina, а как вы сейчас заполняете каждый уровень ? вы берете какой-то источник (массив, TList<record-type>, TCollection, ...), бежите по нему в цикле и по одной строчке вставляете в текущего родителя в дереве. Вот в промежуток между "получили источник" и "побежали по источнику" надо вставить "отсортировать источник по моему нестандартному правилу сравнения". Как делается последнее вам сказали. Как оформляется - немного по разному в разных источниках. Идея одна и та же, но конкретные названия и типы (boilerplate) отличаются. AriochИщите примеры Delphi Custom Sort В разных классах используются немножко разное оформление, немножко разные названия и т.д. Но суть не меняется. Для начала можете не в дерево выводить, а например в TMemo для простоты, для демонстрашки. В качестве источника - просто сотня названий из списка. Например в текстовом файле. грузите оттуда строчку за строчкой в источник ( TList<string> или TStringList ), потом делаете Custom Sort в применении к выбранному источнику, потом делаете типа Memo1.Lines.AddStrings( источник ); когда суть процесса заработает, начнете его переформлять применительно к вашему дереву и вашей процедуре его загрузки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 16:06 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterina, http://www.yandex.ru/yandsearch?clid=9582&text=пример delphi ttreeview customsort для первого ознакомления с темой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 16:08 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39599084&tid=2041199]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
166ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
| others: | 287ms |
| total: | 555ms |

| 0 / 0 |
