|
|
|
нестандартная сортировка в 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 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Arioch, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 16:08 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Arioch, надеюсь разобраться)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 16:09 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterinaШтифт 2х14 Штифт 2х16 Штифт 2х4 Штифт 2х5 Хмммм.... Это всё-таки правильный конечный результат или нет????? В ровно таком виде вам даже писать ничего не надо, только попросить дерево отсортироваться - и оно само отсортируется построчно. Потому что текст "16" меньше, чем текст "2" - первая буквоцифра меньше, остальное не волнует А вот число 16 больше, чем число 2, если его выделить из текста и какая вам сортировка на самом деле нужна я уже не понимаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 16:13 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Arioch, второпях писала, поэтому и последовательность не учла.. прошу прощения за ошибки. сортироваться должно каждое последовательное число. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 16:15 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterina, тогда прямая вам дорого в Гугл https://www.google.ru/search?q=delphi alphanumeric comparison например первые два результата https://www.experts-exchange.com/questions/23086281/Natural-Order-String-Sort-Compare-in-Delphi.html http://forum.lazarus.freepascal.org/index.php?topic=24450.0 только имейте в виду, что это просто обсуждения вопроса между делом, и насколько тамошними заримсовками можно пользоваться - они для этого в общем случае и не предназначены: http://www.gunsmoker.ru/2010/05/90.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 16:20 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterina, Можешь для интереса глянуть . Я там своё решение кидал для похожей задачи, только надо на уточняющие вопросы по ТЗ ответить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 16:25 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Огромное Вам спасибо за помощь! буду со всем разбираться... возможно, появятся вопросы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 16:27 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterina, перед построением дерева отсортируй данные, заранее. А потом загружай. Очень простой алгоритм: загрузи текст в TStringList, потом вызови CustomSort c указанием функции хитрой сортировки. В этой самой функции разбирай текст на куски, ищи среди них числа. Если оба куска - числа - то сравнивай их как числа. Иначе - как строки. Всё. :) Пример: на форме есть TMemo, в ней твой неотсортированный текст. Задача - отсортировать его. Пример Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Что за функция MyCompare? Вот она: Код: pascal 1. На вход подается список строк (TStringList) и индексы (Index1, Index2) строк, которые надо сравнить. Пример реализации: MyCompare Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. Осталась совсем мелочь: разбор исходных строк. Не будем мудрить: NextItem Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 17:23 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
чччДОчень простой алгоритм: загрузи текст в TStringList Это медленно, TList<string> лучше Но.... это в предположении что у нее есть строки и только строки, нет никаких реальных данных за этими строками (объекта, записи, артикула на складе или в ценнике - ничего нет, только строки) А оно должно быть и сортировтаь надо будет реальные объекты, а не только строки из объектов выдранные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 17:33 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Arioch, а вдруг файл текстовый больше семи гигабайт будет, или эмбаркадеро эмбарго для России на стринглист введет. Тут тоже без специально нанятого программиста никак, да-да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 17:37 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
чччД, я именно поэтому избегал называть конкретные классы, а когда называл - называл сразу несколько кандидатов потому что одно дело - общая методика, а другая - якобы готовый к использованию код В принципе, там вполне может быть TStringList - для того, чтобы в .Objects[i] хранить скастованный указатель на record с реальными данными, например. В 1990-х это была стандартная практика. В общем, детали реализации могут быть весьма развесистыми, так что пусть ТС научится общему подходу, а потом применяет его к своим частностям. тем более тьфу-тьфу кажется человек готов учиться сам, а не требовать готового кода ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 18:30 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
чччДразбор исходных строк. Не будем мудрить: кстати, хороший пример для филиппики Раймонда Чена про программы с форумов потому что твой парсер при случае "123.24.543" назовёт одним числом. И "212-85-06" тоже за число посчитает. И ".0123" тоже, хотя это уже серая зона. Такие дела.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 18:36 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Arioch...твой парсер при случае "123.24.543" назовёт одним числом. И "212-85-06" тоже за число посчитает. И ".0123" тоже, хотя это уже серая зона. Такие дела.... Ну так исправь, коль неймётся. И кэшед буфферз подключи для полного счастья. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 18:45 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
чччД, "говнокода" (с) на форумах и так полно, зачем его количество увеличивать? я даже в функцию с E-E не вчитывался внимательно, хотя она как минимум про ситуацию "две точки" в курсе написать этот парсер я за полчаса могу, повторяю ,конечные автоматы штука простая, но ооооочень нудная. я человеку объяснял где искать удочки ты вместо удочек дал ему рыбу второй свежести, как внезапно (с) оказалось но виноват оказываюсь я пичалька ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 18:53 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Arioch, ты проблемы на пустом месте выдумываешь. Ну ладно, используй константу в cDigits вот такую: Код: pascal 1. ...ах, снова беда, с отрицательными числами будет не та сортировка? А они есть, в номенклатуре, отрицательные? Это одноразовая задача, од-но-ра-зо-ва-я. С чего ты вдруг решил, что ТС глубинное погружение более важно, чем решение частного случая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 19:03 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Сделать компаратор (comparer), где для каждой пары: - парсить первые два числа по возможности (достаточно по цифрам); - если оба числа -- сравнивается одно, потом второе (CompareValue); - если у кого-то одно числа -- сравнивается одно; - если нет числе -- ничего (результат считать одинаковым); - если результат одинаков, то сравнивается уже обычный текст (CompareText) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2018, 20:32 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
еще раз добрый день! Пыталась я разобраться с функцией AnsiCompareStr, но так думаю, что это не то, что нужно. дело в том, что я, наверно, неправильно все-таки описала ТЗ. Я привела единичный случай данных одного узла. на самом деле в разных узлах дерева хранятся типы данных с разными значениями. и сравнить их нужно не по наименованию или госту, а именно, по обозначению, например, в записи Болт 5х25 ГОСТ 11111-2018 сортировать буду только по значению 5х25 и т.д. как-то можно отсортировать данные в каждом узле отдельно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 11:43 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
это данные из другого узла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 11:45 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
есть данные и такого плана 5584АП5Т 5584ИЕ10Т 5559ИН1Т 5584ЛИ1Т 5584ЛЛ1Т ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 11:47 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterina, что за косноязычность. Разберись и четко сформулируй задачу, а не картинки вываливай, всякий раз неправильные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 12:39 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Надо, используя мозг, придумать алгоритм удовлетворяющий вашим критериям. После того как сможете его описать, закодировать не составит труда (в крайнем случае здесь помогут). А телепаты, знающие что там у вас может встретиться, готовятся к празднику ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 12:48 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterinaкак-то можно отсортировать данные в каждом узле отдельно? Ещё раз прочитай 21176860 и покажи как ты это пыталась реализовать и что получиось. white_niggerНадо, используя мозг, придумать алгоритм удовлетворяющий вашим критериям А именно: Как рубить названия на отдельные части? Какие типы частей могут быть и как это определять? Как сравнивать части того или иного типа. А самое правильное (если возможно) было бы не строками заниматься, а тащить через программу "паспорт изделия" - типа record или class, в котором все параметры будут отдельно и явно прописаны как разные переменные. У тебя сейчас где-то есть нормальное представление о предметах. Скажем, винт характеризуется 0) тем, что он винт, а не болт 1) длиной 2) диаметром (строго говоря, двумя диаметрами) 3) типом головки (потайная, полукруглая, ...) 4) типом отвертки (плоский шлиц, крест, 6-гранник, ....) 5) диаметром головки 6) возможно, высотой(длиной) головки 7) направлением резьбы 8) шагом резьбы ( или наклоном ) 9) саморез или нужно предварительно сверлить 10) для какого материала - в дерево вкручиивать, в пластик, в металл.... ....и вероятно есть ещё разные признаки. Насчёт двух диаметров - если когда-то чертила или видела чертежи, то отдельно считается и чертится по гребням резьбы и по "канавкам" между гребнями. Но там редко бывают необычные соотношения, так что редко нужно хранить оба значения. А вот выбрать какое одно из двух будет использовать программа и не путать в дальнейшем - надо. Понятно, что для каждого артикула вести полный паспорт - накладно. И не во всех случаях нужно. Но это уже вам решать, что нужно, а что нет. В любом случае, на заводе, который винт делал, вся эта инфомрация должна была быть. Потом винт продали, купили, привезли, поставили на учёт в вашей бухгалтерии, вбили в вашу программу, и пройдя через все модуля программы он добрался до вашего дерева. На каждом этом этапе часть информации наверное терялась. И это проблема. В идеале у тебя к каждой "строке" должен быть "привязан" паспорт. И тогда функция сравнения была бы тривиальна, ты бы сначала проверяла типы изделий (например, любой винт всегда больше любого болта), а потом убедившись, что типы паспортов совпадают, просто бы шла по отдельным "графам" паспортов от более важного к менее важному и сравнивала. У тебя же получилось, что некоторая информация из паспортов была отброшена, некоторая же была свалена в одну строку, полу-формализованную, полу-стандартную. И тебе сейчас нужно рзобрать (parse) строку и попытаться из неё извлечь это информацию обратно. Задача нечёткая и неприятная. Да, если тебе нужна только сортировка (а не нужен поиск/фильтр, нет (и никогда не будет) задачи покупателю/продавцу "показать винты и болты длиной от 3 до 5 см") то полный парсинг не нужен, достаточно упрощённого. Но во-первых и это медленнее, чем прямое сравнения регулярных паспортов. A во-вторых "задача нечёткая": вот у тебя винт в середине "....gx6.ВТ1-0...." а над ним и под ним "....gx6.36.01...." Вот приедут эти строки в твой компаратор. Поползёт он по ним. ".....gx", а дальше цифра - это кусок-строка, сравниваем через AnsiTextCompare, получаем 0, надо сравнивтаь дальше Ползёт дальше "....6." - это число шесть и... точка это уже новая строка или всё ещё число? Ну ладно, допустим (оооочень плохое слово), что точка - всегда разделят блоки, а дробная часть всегда отбивается запятыми и никогда точками (а если мы не угадали, что тогда?), но пока - д-о-п-у-с-т-и-м. ...."6" в обеих строках. Кусок-число. Превращаем его из строки в число (операция сама по себе долгая и чреватая ошибками) и сравниваем две переменных integer или single. Sign( int1-int2 ) = 0, опять равенство, опять надо дальше сравнивать. Ползём по двум строка синхронно дальше. строка 2: "." и за ним цифра 3. Значит кусок-строка была один символ "." , а дальше будет кусок-число строка 1: ".ВТ" и за ним цифра 1. Значит кусок строка будет ".ВТ" и эти два куска сравниваем в AnsiTextCompare - тут строки разные, результат будет не ноль, и сравнение заканчиваем. А вот ЕСЛИ БЫ сравнение не закончилось, то дальше бы сравнивали числа "36" (ил "36.016") и "1" (из "1-0"). Т.е. вероятно (слово настолько же отвратительное, как "допустим") пошла рассинхронизация, начали вероятно сравнивать разные по смыслу блоки. Вот такие дела.... Перед тобой три дороги, и выбрать из них можешь только ты, оценивая состояние вашей программы, состояние бизнес-процессов и компетентности/аккуратности пользователей программы, и свои умения. 1) добиться, чтобы до самого списка доходили не просто полу-бессистемные строки, а полноценные РЕГУЛЯРНЫЕ паспорта изделий. Сортировку/поиск/фильтрацию делать по ним. Это наиболее "правильный" и быстрый способ, но не всегда возможный. 2) сделать полноценный парсинг строк, восстановление типа паспорт и заполнение всех полей, которые удастся заполнить (и отметку какие поля заполнены, какие нет), потом сортировку по временному паспорту. Это наиболее медленный способ. Но ты хотя бы сама будешь понимать что и с чем ты сравниваешь. 3) сделать халявный полу-парсинг, понадеявшись что большая часть строк заполнена более-менее стандартно, а на редкие исключения наплевать, виноват кто-то другой будет. Это то, о чём тебе с самого начала говорили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 13:40 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterinaШтифт 2.2х16.Хим.Окс.прм Штифт 2.2х20 Штифт 2.3х16.019 Ага, хренушки там. Вот здесь явно точка отделяет не разные смысловые блоки, а целую и дробную часть одного и того же числа. А на картинке твоей - "Винт В.М2,5-gx6....." - тут дробная часть отбивается запятыми. А точки отбивают только смысловые блоки. А если дальше рыться, наверное найдётся и место, гед через запятую перечислены разные аттрибуты, разные по смыслу куски. И вот для каждой строки твоей программе придется угадывать, что означает каждая точка ,и что означает каждая запятая. И либо делать полноценный парсинг, восстановление паспорта по строке. В программу закладывая какие смысловые блоки могут встречаться в разных типах названий, и как эти смысловые блоки отбиваются друг от друга. Либо не терять данные изначально, вести по программе именно паспорт изделия, а не его бесформенное название-строку. Строка уже будет необязательным дополнением к паспорту, а не наоборот. Либо выпендриться и сделать ууумную функцию, которая сможет в каждой строке угадать где какие блоки. А и всё равно однажды встретится хитровыподвернутая строка, которую даже такая функция не разгадает.... Ведь не даром во всех магазинах/складах есть артикул (он же SKU - Storage Kept Unit number), уникальный идентификатор, по которому можно выдернуть "карточку товара", где в явном и раздельном виде будут (должны быть) описаны его свойства. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 13:53 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
чччД, человек НЕ программист, не математик. знаешь как бывает, "ты ж программист - вон секретарша телефон сломала, почини" а тут обратная ситуация, похоже. "ты похожа на программиста - иди затыкай дырку" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 13:54 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
TsYekaterina, авторданных с разными значениями. и сравнить их нужно не по наименованию или госту, а именно, по обозначению, например, в записи Болт 5х25 ГОСТ 11111-2018 сортировать буду только по значению 5х25 и т.д. как-то можно отсортировать данные в каждом узле отдельно? Значит в компараторе нужно сравнивать не всю строку целиком, а конкретное значение. Нужно из строки это значение выделить и передавать компоратору. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 15:28 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
В данном случае будет уместней такой алгоритм: 1. При добавлении узла в дерево разбиваем строку детали на составные части по максимуму. В алгоритм уж не буду влезать, неохота. Но разбиваем на составные части. 2. Копируем эти составные части в запись aka структуру, выделенную в памяти (New / AllocMem) 3. Добавляем узел, указатель на заполненную структуру как его поле Data 4. Реализуем OnCompare, где в зависимости от текущего режима сортировки элементарно сравниваются поля структур двух узлов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 15:57 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Ariochчеловек НЕ программист, не математик.Да здесь и не нужно быть ни тем ни другим. Достаточно уметь формулировать правила по которым ты сам в голове решаешь, что перед чем должно идти. И здесь никто другой не поможет. Хз как эти винты сортировать: по размеру, головке, шлицу, цвету, артикулу, фазе луны... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 16:24 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
white_niggerХз как эти винты сортировать: по размеру, головке, шлицу, цвету, артикулу, фазе луны... а вот это как раз и есть математический (физический и т.д.) склад мышления. выделение разных сущностей объекта и иих сортировка по важности. тренировка абстрагировать, выводить за скобки общее, оставлять в скобках различное т.е. речь не о "знать все аксиомы наизусть", а о подходе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 16:53 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Arioch, гони ты эту деву с гуманитарным складом к хвостам собачьим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 17:08 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
чччД, вот странный ты физики-ядерщики неизвестного возраста тебе нравятся, а прекрасные девы - нет.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 17:25 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Arioch, учитывая, что ТС не знает, что хочет - походе, что дева настоящая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 17:56 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
Ariochа вот это как раз и есть математический (физический и т.д.) склад мышления. выделение разных сущностей объекта и иих сортировка по важностиНе выдергивай из контекста. Любая бабка на базаре расскажет тебе о продаваемом товаре, какой кусок мяса лучше (должен находится выше в TreeView) а какой хуже/ниже. И ей не нужен для этого "математический" склад ума. Даже больше, многие программисты с их складом ума не смогут так рассортировать мясные вырезки. Чем это отличается от сортировки болтов и прочей электроники? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2018, 20:03 |
|
||
|
нестандартная сортировка в TreeView
|
|||
|---|---|---|---|
|
#18+
white_nigger, Вот! Она интуитивно сравнит два куска мяса и покажет на лучший. Выполнит сравнение. Но сформулировать правила, по которым любой исполнитель сможет сравнить - не сформулировать. Предложи кошке или собаке мясо свежее и тухлое - она выберет. Но спроси у неё как - не раскажет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2018, 00:28 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2041199]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
161ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
1ms |
| others: | 272ms |
| total: | 546ms |

| 0 / 0 |
