Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Как программно вкл/выкл List1.Sorte Добавлено: 28.01.05 10:05  

Автор вопроса:  VladeD
Привет всем!
Мне понадобилось в ListBox'e выключить сортировку программно.
Поставил кнопку-нажал и получил:
-----------------------------------
ERROR:
"Ошибка компиляции
Невозможно присвоение свойству, доступному только для чтения"
-----------------------------------
А мне вот нужно, и все тут !!!
Есть ли такая возможность выключать сортировку, что бы записи в Listbox были в той последовательности, в какой я их ввожу в данный момент и при обновлении из файла, например, тоже !!!
 Спасибо

Ответить

  Ответы Всего ответов: 29  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #1
Добавлено: 28.01.05 11:01
Попробуй оспользоваться алгоритмами сортировки :) ?

Ответить

Номер ответа: 2
Автор ответа:
 ZagZag



ICQ: 295002202 

Вопросов: 87
Ответов: 1684
 Профиль | | #2 Добавлено: 15.02.05 13:19
Могу дезвозмездно ввыставить алгоритм QSort
Быстрее стандартного, да и вообще шустрый.
У меня модуль специально на ListBox ориентирован.
Принцип:
- Загрузить LB в массив
- Отсортировать массив
- Заменить прежние значения LB новыми

Attribute VB_Name = "basListQuickSort"
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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #14
Добавлено: 17.02.05 16:09
Данные ведь добавляются поочередно, значит надо просто найти место для указателя в таблице и воткнуть его сходу в положенное ему место, не вороша всю таблицу сортировкой с сопутствующей кучей перестановок.

Это называется "сортировка с вставками" :) Для двухсвязных списков это работает быстро, а вот для массивов обычно медленнее, чем тот же quicksort

Ответить

Номер ответа: 15
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #15 Добавлено: 17.02.05 17:01
Sharp, ты не понял в чём дело. Сортировки не производятся. При добавлении строки в массив, те указатели, которые уже существовали, выстроены по порядку следования строк, на которые они указывают. Их не надо сортировать. Вставляется один указатель в нужное место, а те, которые были начиная с этого места, скопом сдвигаются в сторону конца массива указателей на 1 позицию. Это всего один проход массива строк (для поиска места для нового указателя) и всего один проход массива указателей чтобы поставить новый указатель на найденное место.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам