Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: TreeView и INI-файл Добавлено: 30.06.06 22:42  

Автор вопроса:  Abriel
В TreeView во время выполнения формируем определенную структуру, например:
Root1
*- Child1
*--- SubChild1
*--- SubChild2
*- Child2
*--- SubChild1
*- Child3
...

В процессе формирования все это записывается в INI-файл в виде, например:
[Root1]
[Root1\Child1]
[Root1\Child1\SubChild1]
[Root1\Child1\SubChild2]
[Root1\Child2]
[Root1\Child2\SubChild1]
[Root1\Child3]

В процессе удаления сразу всей ветви как из TreeView, так и с INI использую рекурсию и API:
WritePrivateProfileString CurrentNode.FullPath, vbNullString, vbNullString, INIFileName

Все бы хорошо, да именно секция [Root1\Child1\SubChild2] в данном случае не удаляется почему-то!
Ребят, помогите разобраться! Может есть более разумная альтернатива решения подобной задачи, поскажите (желательно в виде примера на VB 6.0).

Ответить

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

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



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #1 Добавлено: 01.07.06 02:27
Не хотелось бы давать советов в стиле vbnet, но все же...

INI - это именно требование?
Почему не используешь XML?

По теме:
Что возвращает функция WritePrivateProfileString?
Что возвращает GetLastError?

Ответить

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



Вопросов: 9
Ответов: 12
 Профиль | | #2 Добавлено: 01.07.06 03:24
В основном играюсь в VB 6.0 и особо не вникал в XML, который под vbnet подкреплен!
WritePrivateProfileString - ф-ция копирует стринг в файл инициализации и возвр. не нулевое значение.
GetLastError - здесь даже не причем, т.к. ошибки то явной не возникает. Это скорей какой-то мой недочет, вот поэтому я и прошу пояснения...
Почему в INI не удаляется именно последняя поочередно идущая дочерняя ветвь (секция), хотя процедура рекурсии проходит по всем нодам и соответственно должна удалять все секции в INI???

Ответить

Номер ответа: 3
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #3 Добавлено: 01.07.06 03:41
(имхо) Не стоит заниматься ерундой с INI...
было бы на порядок проще и удобнее сериализовать твою коллекцию TreeNodeCollection
лишился бы кучи проблем.. как минимум:
- избавился от рекурсии
- уменьшил количество кода
- увеличил бы быстродействие

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 01.07.06 04:18
Я бы все-ти использовал рекурсию вместе с XMLTextReader вместо сериализации - люблю скорость и минимализм :)

Ответить

Номер ответа: 5
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #5 Добавлено: 01.07.06 11:45
Я бы все-ти использовал рекурсию вместе с XMLTextReader вместо сериализации - люблю скорость и минимализм :)

А вот тут ты ошибаешься.. и ошибаешься по нескольким причинам:
- минимизации кода ты не получишь, поскольку против 3 строк сериализации тебе придется писать ф-ю рекурсивного обхода дерева
- и в скорости будет явный проигрыш. Либо читать сразу весь весь файл и приводить его к типу(в случае сериализации), либо читать его построчно и заполнять дерево. И эта разница во времени станет особенно заметна на больших файлах.. (проверено)
А если, к тому же, вместо XMLTextReader использовать BinaryFormatter, то разница будет более, чем очевидна.. Ибо тот же MS заявляет о том, что в бинарном виде скорость чтения/записи до 80 раз выше чем у XML...

Ответить

Номер ответа: 6
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #6 Добавлено: 01.07.06 15:11
минимизации кода ты не получишь

Нет, не получу, получу минимизация выходящего файла.
Ради интереса посаотри набор свойств TreeNode и какое количество из них реально необходимо.

и в скорости будет явный проигрыш

В скорости у меня в принципе не может быть проигрыша, так как внизу XmlSerializer лежит тот самый XmlTextWriter и XmlTextReader, а возможно даже олее медленный XmlDocument.
Кроме того при сериализации/десериализации будет очень плотно использовать рефлексию поэтому у тебя все будет работать _медлденнее_ причем возможно даже на порядки.

Насчет BinaryFormatter.
Я не разбирался еще с функциональностью этого класса, но если также использует рефлексию (а я в этом уверен), то тут вопрос спорный, без бенчмарка не разобраться.

Ответить

Номер ответа: 7
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #7
Добавлено: 01.07.06 18:14
2 EROS: ИМХО ты не прав по части скорости. Почему? Ну хотя бы потому что целое всегда тормознее частного, если можно так выразиться. XmlSerializer внутри юзает во-первых, reflection, во-вторых тот же xmltextwriter.

Почему Reflection? Потому что xmlserializer сам не знает о структуре сериализуемых данных и для этого ему приходится разбираться в структуре данных и в специальных атрибутах сериализации.

То есть в нагрузку к тому же xmltextwriter мы добавляем reflection. Так где здесь может появиться выигрыш в скорости?

Если я не прав, то бенчмарк нас рассудит :)

Ответить

Номер ответа: 8
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #8
Добавлено: 01.07.06 18:16
Сорри за дублирование ответов. До поста Brand'а не дошел, когда из меня полезла истина :)

Ответить

Номер ответа: 9
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #9 Добавлено: 02.07.06 04:08
Убедили...
Время записи 1000 нодов на HDD, ms
BinaryFormatter: 34,5579
XmlWriter: 11,5171

Единственное, что вызывает сомнения, так это то что в xml я писал лишь 5 основных свойств нода (больше поленился), в то время как BinaryFormatter пишет объект абсолютно полностью... Однако разница в количестве кода весьма и весьма ощутима...

Ответить

Номер ответа: 10
Автор ответа:
 Abriel



Вопросов: 9
Ответов: 12
 Профиль | | #10 Добавлено: 02.07.06 15:04
А мне так приятно, что решилась не моя, но не менее важная проблема... В принцыпе сам доковырялся. А вот вышеописанные "баталии" очень даже впечатлили и обучили. Всем спаиб!

Ответить

Номер ответа: 11
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #11 Добавлено: 02.07.06 18:07
:-))
главный вывод, который ты дожен сделать- это отказаться от INI и использовать NET - технологии!
А юзать XmlWriter или BinaryFormatter - это уже дело личных предпочтений.

Ответить

Номер ответа: 12
Автор ответа:
 Abriel



Вопросов: 9
Ответов: 12
 Профиль | | #12 Добавлено: 02.07.06 22:48
Вопросик на засыпку...
Имеется массив со строками, например:
000
000\111
000\111\222
Как можно заполнить TreeView по иерархии этих строк-путей, например:
000
=== 111
======= 222
Имеются только эти строки... Подскажите, плиз!

Ответить

Номер ответа: 13
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #13 Добавлено: 02.07.06 23:28
парсинг строк, рекурсия...

Ответить

Номер ответа: 14
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #14 Добавлено: 02.07.06 23:31
Говорили тебе откажись от INI .. так нет же, не послушался...
А теперь придется тебе эти строки парсить..
Вообщем идея такова(схемотично):
1.Сортируешь этот массив
2.Берешь строчку.. сплитом разбиваешь её в массив
3.Дальше берешь первый элемент массива
    - проверяешь, если такой нод у тебя есть, то получаешь на него ссылку, если нет, то добавляешь новый нод
    - берешь следующий элемент массива, ссылка на родителя у тебя уже есть, проверяешь его коллекцию Nodes. Если такой нод в этой коллекции есть, то получаешь на него ссылку, если нет, опять новый..
    - и так до конца массива...
4. Берешь следующую строчку и все повторяется сначала...

Ответить

Страница: 1 |

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



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