Разделение списка по алфавиту
|
|
mitt32 | Дата: Пятница, 21 Марта 2008, 16:56 | Сообщение # 1 |
Новый участник
Группа: Пользователи
Сообщений: 23
Репутация: 0
Награды: 0
Статус: Offline
| Нужна помощь! Вобщем есть один listbox в который через файл загружаются itemы, нужно чтобы при нажатии заветной конопки все itemы начинающиеся на букву A оказались к примеру в listbox1, а на букву B в listbox2. Хотел сделать проверку первой буквы itemов, но оказалось что переменная item$ начинается с пути к тому файлу из которого все itemы грузятся. Спасибо за внимание...
|
|
| |
as-master | Дата: Пятница, 21 Марта 2008, 18:36 | Сообщение # 2 |
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
| itemы - это звучит круто!!! :) А над ответом щаз подумаем... Хотя неплохо бы для начала уточнить, ЧТО ИМЕННО грузится в список - имена файлов?
Добавлено (21 Март 2008, 18:33) --------------------------------------------- И еще вопрос: а что, ты собрался делать столько много списков - 30 штук - на все буквы алфавита? Добавлено (21 Март 2008, 18:36) --------------------------------------------- И еще вопрос: а что потом будут делать с теми тридцатью списками? Ведь я могу туда просто загрузить имена файлов, но потом списки работать не будут, если у них есть некое назначение. Такие вещи нужно определять заранее, иначе вся работа зазря...
Да пребудет с вами ММВ!
|
|
| |
Rush | Дата: Пятница, 21 Марта 2008, 19:40 | Сообщение # 3 |
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
| Не знаю конкретно, что тебя интересует. Но попробуй посмотреть пример, который я сделал - может что полезным покажется... Что-то ни хрена не прикрепилось - придется на другой ресурс файл бросить. http://www.filespace.org/Rush/sample2.zip
Сообщение отредактировал Rush - Пятница, 21 Марта 2008, 19:54 |
|
| |
mitt32 | Дата: Пятница, 21 Марта 2008, 20:56 | Сообщение # 4 |
Новый участник
Группа: Пользователи
Сообщений: 23
Репутация: 0
Награды: 0
Статус: Offline
| Quote (as-master) ЧТО ИМЕННО грузится в список - имена файлов? Имена+всякая инфа, типа размера, вида, автора и т.д. Quote (Rush) Не знаю конкретно, что тебя интересует. Но попробуй посмотреть пример, который я сделал - может что полезным покажется... Спасибо! Работает, правда одно НО. Работает если файл загружать как txt... я же его загружаю как m3l ибо некоторые переменные мне нужно отсечь с помощью вставки точек в нужных мне местах файла. Файлик то многострочный на сегодняшний деньс сотавляет 5600+ строк.... но в будущем возможно жерез годика 2 достигнет до 8000+... с помощью точки я быстро форматирую текст как мне надо, без них не могу. Правда и разделение по алфавиту идет не быстро, хотя думаю ускорить процесс смогу... но разделение мне нужно для файла загружаемого как m3l
|
|
| |
Rush | Дата: Пятница, 21 Марта 2008, 21:58 | Сообщение # 5 |
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
| mitt32, не загоняй себя в узкие рамки. Это порочный путь. Конечно, легко и быстро отсекать при помощи ExtractName и тому подобным. Но ведь есть быстрая отсечка (и гораздо более гибкая) при помощи делимитеров в так называемых массивах. И формат m3l - ММВ его предварительно обрабатывает, но своя обработка лучше и надежнее, и гибче. Насчет ускорения - надо подумать. Средствами JScript или VBS можно обрабатывать намного быстрее (в разы). А новая версия ММВ позволяет интегрироваться с ними. Вообщем, давай побольше конкретики. А то больше приходится догадываться, что там у тебя в проекте. Ну, конечно, если хочешь все сделать сам, то карты в руки. А так - могу помочь довести до ума...
Сообщение отредактировал Rush - Пятница, 21 Марта 2008, 22:00 |
|
| |
mitt32 | Дата: Пятница, 21 Марта 2008, 23:05 | Сообщение # 6 |
Новый участник
Группа: Пользователи
Сообщений: 23
Репутация: 0
Награды: 0
Статус: Offline
| Ну вот так выглядит отрывок в текстовом файле, это описание одного файла: Code имя файла.name .id=ид файла (для скачвиания) .auth=автор .date=время публикации .ver=версия .cat=категория файла .desc=описание .size=размер файла Описание файлов идет подряд без пустых строк, дабы потом прочитать остальные строки.. Делал так. Загружал этот файл как m3l, конечно псоле этого оставались только названия файла (в listbox1). Когда мне нужно было узнать остальную инфу к примеру id то действовал по формуле j=(numitem-1)*8+1 (если только выбираемое название в listbox1 не равно 1, в этом случае j=1), где numitemка это номер строки в listbox1 а j это уже номер строки уже в файле, что бы узнать id то достаточно к j прибавить 1, т.к. id находится на одну строку ниже, остальная инфа узнается аналогично... скрипт выглядит примерно так: Code t$='<SrcDir>\db.txt' ListBoxGetSelectedItems("listbox1","Items$,NumItems$,#,Count") If (Count<>0) Then For i=1 To Count Item$=GetArrayItem(Items$,#,i) numitem$ = GetArrayItem(NumItems$,#,i) numitem = VAL(numitem$) Next i End If (numitem=1) Then LoadText("EditBox1","<List>1") LoadText("EditBox2","<List>2") LoadText("EditBox3","<List>3") LoadText("EditBox4","<List>4") LoadText("EditBox5","<List>5") LoadText("EditBox6","<List>6") LoadText("EditBox7","<List>7") LoadText("EditBox8","<List>8") Else If (numitem>1) Then j=(numitem-1)*8+1 LoadText("EditBox1","<List>j") LoadText("EditBox2","<List>j+1") LoadText("EditBox3","<List>j+2") LoadText("EditBox4","<List>j+3") LoadText("EditBox5","<List>j+4") LoadText("EditBox6","<List>j+5") LoadText("EditBox7","<List>j+6") LoadText("EditBox8","<List>j+7") End End Были соображения насчет разбиения по алфавиту... Для начала запускался цикл с поиском названия из listbox1 по первой букве с помощью StrCopy с проверкой на A (в случае если такое название на букву A находилось оно добавлялось в др листбокс) и с проверкой на неравенство с буквой B (в случае если название начиналось на B то цикл Returnился и записывалась строка в point), следущий цикл на букву B уже запускался не с начала, а с point, учитывая что файл 8000+ строками запускается прога с циклами на предмет посика алфавита спец символов, цифр, англ букв и рус букв, то каждый цикл не так уж много работал и не приходилось обрабатывать 8000+ строк одному циклу и цикл не зависал... но тогда я использовал другой синтаксис в файле, т.е. использовал другие идентификаторы и не юзал точки как сейчас, теперь же у мну не получается сделать как я выше описал скрипт не работает, уже не помню точно почему... ну там я не правильно кажысь переменную указывал, пример показать не могу, ибо тогда не сохранил файл, а комп завис и пришлось ребутиться... Напишу о смысле проги, это своего рода база данных по файлам, как уже итак видно. Сделать полный список файлов + отображение инфы при выборе файла в боксе не проблема, но вот разбиение по алфавиту, да еще чтобы все не так долго эт трабла... хотя выше описанный метод справляется, но чет связать не могу. Раньше ведь я писал не имя файла. name, а name=имя файла и соответственно искалось "name" и позиция знака "=", а ща я так не пишу и никак в цикл не засуну... Помогите разобрться... извиняюсь если че субурно или непонятно написал
|
|
| |
Rush | Дата: Суббота, 22 Марта 2008, 10:45 | Сообщение # 7 |
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
| Ну, вообще-то, у тебя довольно грамотно организовано. Пока, сходу, не касаясь других аспектов (о них надо думать), можно предложить несколько изменить базу данных. Не многострочную по каждому элементу списка, а однострочную. Загружать можно по-прежнему в формате M3L. Тут, правда, есть опасность присутствия точек в "ид файла" и других пунктах. Почему и говорю - формат M3L имеет свои заморочки... Строка (элемент) выглядит так: Code имя файла.#ид файла#автор#время публикации#версия#категория файла#описание#размер файла# Заметь - после имени файла все так же стоит точка, что и позволяет загружать в том же формате. Конечно, читабельность при просмотре файла теряется, но в базе это и не нужно, ИМХО. Скрипт при выборе пункта в листбоксе можно сделать таким: Code ListBoxGetSelectedItems("listbox1","Items$,NumItems$,#,Count") If (Count<>0) Then For i=1 To Count Item$=GetArrayItem(Items$,#,i) numitem$ = GetArrayItem(NumItems$,#,i) numitem = VAL(numitem$) Next i End line$=StrFromFile(t$,numitem,1) For i=1 To 8 arrsel$[i]=GetArrayItem(line$,#,i) If (i=1) Then delpos=LEN(arrsel$[1]) arrsel$[1]=StrDel(arrsel$[1],delpos,1) End ebox$='EditBox'+CHAR(i) LoadText("ebox$","arrsel$[i]") Next i Остальные проблемы дальше додумаю, в течение выходных...
|
|
| |
mitt32 | Дата: Суббота, 22 Марта 2008, 15:30 | Сообщение # 8 |
Новый участник
Группа: Пользователи
Сообщений: 23
Репутация: 0
Награды: 0
Статус: Offline
| Quote (Rush) Тут, правда, есть опасность присутствия точек в "ид файла" и других пунктах. Почему и говорю - формат M3L имеет свои заморочки... С этим проблем не будет... лишних точек точно не будет Quote (Rush) Заметь - после имени файла все так же стоит точка, что и позволяет загружать в том же формате. Конечно, читабельность при просмотре файла теряется, но в базе это и не нужно, ИМХО. Я подумывал так сделать... Quote (Rush) Остальные проблемы дальше додумаю, в течение выходных... Спасиб что помогаешь!
|
|
| |
Rush | Дата: Воскресенье, 23 Марта 2008, 06:38 | Сообщение # 9 |
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
| mitt32 Насчет сортировки. По "имя файла" у меня наиболее приемлемое решение сложилось такое: 1) Сортировка обычная - ListBoxSortItems("listbox1","NAME") 2) Скрипт выбора пункта заменить на такой (работать будет при любой сортировке, поскольку каждый пункт листбокса все это носит с собой, удивляюсь, как я про это забыл - ведь когда-то использовал): Code ListBoxGetSelectedItems("listbox1","Items$,NumItems$,#,Count") name$=ExtractName(Items$) LoadText("EditBox1","name$") For i=2 To 8 item$[i]=GetArrayItem(Items$,#,i) ebox$='EditBox'+CHAR(i) LoadText("ebox$","item$[i]") Next i Да, я не очень точно уяснил - тебе еще надо в отдельный листбокс по буквам загружать? И сортировку по другим полям элемента делать(ид, автор)? По ним заморочно, наверное... Я по крайней мере пока не вижу достойных решений...
Сообщение отредактировал Rush - Воскресенье, 23 Марта 2008, 07:04 |
|
| |
mitt32 | Дата: Воскресенье, 23 Марта 2008, 14:25 | Сообщение # 10 |
Новый участник
Группа: Пользователи
Сообщений: 23
Репутация: 0
Награды: 0
Статус: Offline
| Quote (Rush) Да, я не очень точно уяснил - тебе еще надо в отдельный листбокс по буквам загружать?И сортировку по другим полям элемента делать(ид, автор)? По ним заморочно, наверное... Я по крайней мере пока не вижу достойных решений... Ммм... я вот ща подумал а мне ведь надо не только в отдельный листбокс по буквам распределить, но и еще и по категории, т.е. сначала нужно отсортировать по категории... ну предположим что существует две категории файлов: моды и утилиты. Нажимаем на кнопку "моды" и мы видим кнопки алфавита (A, B, C, D, ..., Z, А, Б, В, Г, ..., Я, 0-9, спец символы), нажимаем на "A" и видим список всех модов(!) на букву A, аналогично и с категорией "утилиты"... вот такая вот заморочка...
|
|
| |
Rush | Дата: Понедельник, 24 Марта 2008, 14:19 | Сообщение # 11 |
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
| Вот пока какие результаты (в прищепке). Не особо, конечно, но что уж слепилось...
|
|
| |
Rush | Дата: Вторник, 25 Марта 2008, 04:57 | Сообщение # 12 |
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
| Вариант без предварительной сортировки списка
|
|
| |
mitt32 | Дата: Вторник, 25 Марта 2008, 16:56 | Сообщение # 13 |
Новый участник
Группа: Пользователи
Сообщений: 23
Репутация: 0
Награды: 0
Статус: Offline
| Quote (Rush) Вот пока какие результаты (в прищепке). Не особо, конечно, но что уж слепилось... Quote (Rush) Вариант без предварительной сортировки списка Все бы хорошо, только одна небольшая траблочка... твой пример расчитан на малое количество строк... достаточно увеличить их количество до чуть более 1000 и наш проект виснит... причем как в начальной загрузке в SongList так и в загрузке в SongList1
|
|
| |
Rush | Дата: Среда, 26 Марта 2008, 04:02 | Сообщение # 14 |
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
| Quote (mitt32) твой пример расчитан на малое количество строк... достаточно увеличить их количество до чуть более 1000 и наш проект виснит... причем как в начальной загрузке в SongList так и в загрузке в SongList1 Странно. Сейчас увеличил базу до 1200 пунктов, но виснуть не виснет. Начальная загрузка, правда, идет довольно долго (секунд 30), а вот в SongList1 загружается без больших задержек (там ведь цикл не должен быть очень большим - только если на одну букву почти вся база). Но, собственно, проблема-то существует. Я и написал, что не ахти... Там ведь в заголовке не зря альфа стоит. Вся фигня в том, что ММВ ужасно медленно обрабатывает циклы. Это в любом языке не очень быстрая операция, но здесь полный ппц. Будем еще думать... Добавлено (26 Март 2008, 04:02) --------------------------------------------- Кстати, если тебе не просто хочется сделать данную прогу на ММВ, но и действительно нужна такая база для дела, то рекомендую очень неплохую бесплатную и очень быструю программу Table Pro. Формат базы CSV. То есть, практически то же самое представление, как и у нас. Написана на С++. Ничего не пишет в реестр, без инсталляции, размер всего 500 кб вместе со справкой. Quote Простая и удобная база данных для дома и офиса. Быстрый и мощный поиск, экспорт в различные форматы, печать, сортировка по всем полям, настройка пользовательского интерфейса, очень быстрая загрузка и обработка огромного количества записей. Программу можно использовать в качестве удобной оболочки для хранения телефонных справочников, таблиц сотрудников и клиентов, картотек, видеотек, LOG-файлов, файлов статистики и др... http://zgsprojects.narod.ru/TablePro.zip
|
|
| |
mitt32 | Дата: Среда, 26 Марта 2008, 19:02 | Сообщение # 15 |
Новый участник
Группа: Пользователи
Сообщений: 23
Репутация: 0
Награды: 0
Статус: Offline
| Quote (Rush) Странно. Сейчас увеличил базу до 1200 пунктов, но виснуть не виснет. Начальная загрузка, правда, идет довольно долго (секунд 30), а вот в SongList1 загружается без больших задержек (там ведь цикл не должен быть очень большим - только если на одну букву почти вся база).Но, собственно, проблема-то существует. Я и написал, что не ахти...Там ведь в заголовке не зря альфа стоит. Вся фигня в том, что ММВ ужасно медленно обрабатывает циклы. Это в любом языке не очень быстрая операция, но здесь полный ппц.Будем еще думать... Ну это еще от компа зависит... у мну старый комп и там где у тебя выполняется операция за 30 сек, у меня не за одну минуту... Ну, я решил разделить базу на несколько файлов, т.е. каждый файл будет представлять свою категорию, сначала я думал что так не получится и не удобно... вобщем так решается проблема сортировки по категории, да и строк меньше обрабатывать и приложение виснуть не будет... вобщем спасибо за хелп!
|
|
| |
Alex3A | Дата: Среда, 26 Марта 2008, 22:02 | Сообщение # 16 |
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
| Quote (Rush) рекомендую очень неплохую бесплатную и очень быструю программу Table Pro А я, рекомендую базу DBF формата, плагин имеется.
|
|
| |
Power77 | Дата: Четверг, 27 Марта 2008, 02:01 | Сообщение # 17 |
Новый участник
Группа: Пользователи
Сообщений: 1
Репутация: 0
Награды: 0
Статус: Offline
| http://mmbuilder.ru/forum/0-0-0-36 Пункт II.3 правил форума
От Админа: рекламу в подписи вижу в последний раз. Да и на форуме тоже.
Сообщение отредактировал toizy - Четверг, 27 Марта 2008, 10:28 |
|
| |
toizy | Дата: Четверг, 27 Марта 2008, 10:25 | Сообщение # 18 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Power77 Реклама не приветствуется...
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |