Страница: 1 | 2 |
Вопрос: Как программно вкл/выкл List1.Sorte
Добавлено: 28.01.05 10:05
Автор вопроса: VladeD
Привет всем!
Мне понадобилось в ListBox'e выключить сортировку программно.
Поставил кнопку-нажал и получил:
-----------------------------------
ERROR:
"Ошибка компиляции
Невозможно присвоение свойству, доступному только для чтения"
-----------------------------------
А мне вот нужно, и все тут !!!
Есть ли такая возможность выключать сортировку, что бы записи в Listbox были в той последовательности, в какой я их ввожу в данный момент и при обновлении из файла, например, тоже !!!
Спасибо
Ответы
Всего ответов: 29
Номер ответа: 1
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #1
Добавлено: 28.01.05 11:01
Попробуй оспользоваться алгоритмами сортировки ?
Номер ответа: 2
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #2
Добавлено: 15.02.05 13:19
Могу дезвозмездно ввыставить алгоритм QSort
Быстрее стандартного, да и вообще шустрый.
У меня модуль специально на ListBox ориентирован.
Принцип:
- Загрузить LB в массив
- Отсортировать массив
- Заменить прежние значения LB новыми
Option Explicit
Dim StringArr() As String
Public Sub SortListBox(ByRef ListB As ListBox)
Dim lngIndex As Long
Dim lngCount As Long
lngCount = ListB.ListCount - 1
ReDim StringArr(lngCount)
For lngIndex = 0 To lngCount
StringArr(lngIndex) = ListB.List(lngIndex)
Next
QuickSortStringArray LBound(StringArr), UBound(StringArr)
ListB.Clear
For lngIndex = 0 To UBound(StringArr)
ListB.AddItem StringArr(lngIndex)
Next
End Sub
Public Sub QuickSortStringArray(ByVal lngLBound As Long, ByVal lngUBound As
Long)
Dim lngX As Long
Dim lngY As Long
Dim strMidBound As String
Dim strTemp As String
If lngUBound >= 0 And lngUBound > lngLBound Then
strMidBound = LCase(StringArr((lngLBound + lngUBound) \ 2))
lngX = lngLBound
lngY = lngUBound
Do While lngX <= lngY
If LCase(StringArr(lngX)) >= strMidBound And
LCase(StringArr(lngY)) <= strMidBound Then
strTemp = StringArr(lngX)
StringArr(lngX) = StringArr(lngY)
StringArr(lngY) = strTemp
lngX = lngX + 1
lngY = lngY - 1
Else
If LCase(StringArr(lngX)) < strMidBound Then lngX = lngX + 1
If LCase(StringArr(lngY)) > strMidBound Then lngY = lngY - 1
End If
Loop
QuickSortStringArray lngLBound, lngY
QuickSortStringArray lngX, lngUBound
End If
End Sub
Сорри, автор потерялся. Я модуль только чуть подправил (сменил синтаксис
кода и код обмена значений массива)
На algolist принцип работы описывается
Номер ответа: 3
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #3
Добавлено: 15.02.05 17:37
Мой что на форуме по PowerBasic шустрей будет
Номер ответа: 4
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #4
Добавлено: 15.02.05 21:00
Берешь 2 Listbox-а, один sorted, другой - нет, и добавляешь одновременно в оба. Если нужно сортированное представление данных - показываешь первый, если несортированное - второй.
И не надо времени тратить на сортировку.
Номер ответа: 5
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #5
Добавлено: 17.02.05 07:54
sne, я PowerBasic незнаю
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 17.02.05 10:24
2ZagZag, там два варианта, на PB и VB... и тема что-то вроде PB vs VB...
Номер ответа: 7
Автор ответа:
VladeD
Вопросов: 8
Ответов: 40
Профиль | | #7
Добавлено: 17.02.05 12:39
cresta
Это простое техническое решение. Иногда может и нужно так решить. А у меня их на форме несколько: в одном список кабелей. В другом список параметров для их расчета, третий- др. и т.д.
Т.е. твое предложение не солидно в эстетическом или композиционном плане. Ну и мягко говоря - это свой выход из положения от незнания. А нужно сполна использовать свойства VB6, тогда программа красивая и технически грамотно выглядит...:)
Спасибо.
Номер ответа: 8
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #8
Добавлено: 17.02.05 13:10
А-а-а ... У-у-у...
Вообще-то странно слышать на этом форуме такое. И приятно Обычно люди хотят как попроще. А не так как лучше. Поэтому и придумал два листбокса.
Т.е. твое предложение не солидно в эстетическом или композиционном плане
Тогда могу предложить более солидное в эстетическом и композиционном плане
1.Данные не добавляй в листбокс. Делай массив строк. Листбокс - только для отображения.
2.Массив не тасуй (не сортируй) ни в коем случае. Просто добавляй очередную строку в конце массива. Сортируй указатели на строки. Основная затрата времени при сортировке - перестановка элементов. Перестановка указателей (т.е. чисел Long) происходит в разы быстрее, чем перестановка строк. К тому же у тебя будет под рукой одновременно два вида представления: сортированное (указатели) и несортированное (строки).
3.Создай таблицу указателей на строки массива, причем указатели в таблице должны быть расположены (сортированы) так, чтобы первый указывал на меньшую строку, последний - на самую большую строку (в смысле алфавита)
4.Если нужно начальное (несортированное) представление - загружай последовательно из массива строки в лист. Они ведь в том порядке, в котором добавлялись.
5.Если нужно сортированное представление - загружай последовательно в лист строки, соответствующие указателям в таблице. Строки, соответствующие указателям, будут добавляться в алфавитном порядке (в сортированном виде).
6.Если строк много - лучше использовать quicksort, если немного - например сортировку пузырьком.
Пока более солидного ничего не придумал.
Номер ответа: 9
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #9
Добавлено: 17.02.05 13:15
Вот ещё один существенный плюс такой схемы:
Сортировка как таковая вообще не нужна. Вернее нужна, но в сильно упрощенном и облегченном виде:
Данные ведь добавляются поочередно, значит надо просто найти место для указателя в таблице и воткнуть его сходу в положенное ему место, не вороша всю таблицу сортировкой с сопутствующей кучей перестановок.
Номер ответа: 10
Автор ответа:
VladeD
Вопросов: 8
Ответов: 40
Профиль | | #10
Добавлено: 17.02.05 13:40
cresta
Ну это уж здоороово ты меня...:)
И в то же время сложно (в плане составления кода в предлагаемом алгоритме). С массивами для таких переменных, например из баз данныых, таблиц - у меня не совсем дружба...:)
И я их обхожу (и обходил ранее), хотя это тоже не в соответстви с требованиями "эстетического плана" и с сортировкой...
Ну да ладно, все равно к этому по-позже приду, а то много идей накопилось, а я их отодвигаю в сторону по указанной выше причине.
Спасибо! Небольшая разминка получена.
Номер ответа: 11
Автор ответа:
VladeD
Вопросов: 8
Ответов: 40
Профиль | | #11
Добавлено: 17.02.05 13:40
cresta
Ну это уж здоороово ты меня...:)
И в то же время сложно (в плане составления кода в предлагаемом алгоритме). С массивами для таких переменных, например из баз данныых, таблиц - у меня не совсем дружба...:)
И я их обхожу (и обходил ранее), хотя это тоже не в соответстви с требованиями "эстетического плана" и с сортировкой...
Ну да ладно, все равно к этому по-позже приду, а то много идей накопилось, а я их отодвигаю в сторону по указанной выше причине.
Спасибо! Небольшая разминка получена.
Номер ответа: 12
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #12
Добавлено: 17.02.05 14:08
Да не думаю, что этот алгоритм такой уж сложный. Даже наоборот, весьма прозрачный. Попробую его реализовать в коде.
Номер ответа: 13
Автор ответа:
VladeD
Вопросов: 8
Ответов: 40
Профиль | | #13
Добавлено: 17.02.05 14:18
Заранее спасибо. Я буду благодарен за науку.
А то уж много сучаев когда надо данные держать "на слуху" и тут же, если это окончательный вариант их значений, записать их то-ли в базу, то-ли в Ексель... т.д.
Хотя при переходе на ХР, к сожалению, появились новые проблемы работы с БД. Вот было хорошо с Win98...а жаль.:)
Номер ответа: 14
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #14
Добавлено: 17.02.05 16:09
Это называется "сортировка с вставками" Для двухсвязных списков это работает быстро, а вот для массивов обычно медленнее, чем тот же quicksort
Номер ответа: 15
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #15
Добавлено: 17.02.05 17:01
Sharp, ты не понял в чём дело. Сортировки не производятся. При добавлении строки в массив, те указатели, которые уже существовали, выстроены по порядку следования строк, на которые они указывают. Их не надо сортировать. Вставляется один указатель в нужное место, а те, которые были начиная с этого места, скопом сдвигаются в сторону конца массива указателей на 1 позицию. Это всего один проход массива строк (для поиска места для нового указателя) и всего один проход массива указателей чтобы поставить новый указатель на найденное место.