Хорошо, у меня есть TListBox, который иногда может вызываться для отображения 43 000 строк!
Я знаю, это вряд ли когда-нибудь имеет смысл, но это так.
Теперь вот текущая проблема:
Использование встроенного метода Sort с функцией обратного вызова Compare занимает почти вечность, как и многие минуты.
Поэтому я извлекаю строки из списка в простой старый динамический массив ShortStrintgs, выполняю QuickSort () для этого, и это занимает около трех секунд. В общем, я думаю!
Немного подумав, я вижу, что QuickSort перемещает все эти строки вокруг, в которых нет необходимости, поэтому я могу изменить код, просто перемещая указатели или индексы на строки, и, вуаля, сортировка намного Снова быстрее, забираю под секунду, чтобы отсортировать 43 000 предметов. Большая победа, да?
НО, теперь, если я сделаю LB.Items.Add () или LB.Items.Assign, чтобы переместить отсортированные строки в список, ЭТО займет около 30 секунд! Даже с BEgin / EndUpdate происходит. Если я прослеживаю код, то вижу множество вещей, происходящих с delete () Insert () INsertObject () и сообщениями Windows, которые летят без веской причины.
Мгновение показывает, что у меня есть все строки в LB.TStrings, мне просто нужно, чтобы они перетасовывались вокруг моего массива QuickSorted (). Это должно быть тривиально, просто перемещая некоторые указатели.
Но я не вижу видимого способа установки необработанных указателей TStringList. Нет, Exchange () действительно очень медленный.
Есть идеи, как мне добраться до строковых указателей TString? Это должно быть тривиально, но я не вижу этого.
Спасибо
George