Пожааалстаа! Подскажите как работать с TreeView!
Пример:
WareName WareCode WareMasterCode
Товары 0
Кофе 1 0
Чибо 2 1
Элит 3 1
..................................
...надо создать древовидную структуру...
...если кто знает - помогите...
...если TreeView для этого не подходит, то подскажите другой вариант...
Пишу в VB6
Для каждого товара есть поля Code (код товара) и MasterCode (код группы, совпадает с кодом группы товаров)...
Пример:
WareName WareCode WareMasterCode
Товары 0
Кофе 1 0
Чибо 2 1
Элит 3 1
..................................
...надо создать древовидную структуру...
...если кто знает - помогите...
...если TreeView для этого не подходит, то подскажите другой вариант...
Пишу в VB6
Я точно сейчас не помню, но, по-моему, я для этого ListView использовал. У TreeView, по-моему, тоже есть свойства соответствующие, но, увы, не могу сейчас с ним помочь:{
WareName|WareCode|WareMasterCode|
Товары..|0.......|..............|
Кофе....|1.......|0.............|
Чибо....|2.......|1.............|
Элит....|3.......|1.............|
Надеюсь так понятнее...
...нашел одно свойство, называется "TreeView1.Nodes"
Это не оно?
Если оно, то что значат его параметры (читай "что и куда вставлять")?
Ну подскажите хоть альтернативное решение!!!
Я на экселе делал. Красотища...
Если да, то как?
В смысле на VBA?
Если да, то как?
В Экселе есть такое понятие - Структура.
В меню - Данные/Группа и структура...
И я через макрос делал самостоятельно такое деревце. Многие про структуру не знают, поэтому увидя результат, приходят в восторг. :)
такие структуры я уже проходил...
мне надо на форме...
...и контролы нужные есть, но я пока не знаю как ими пользоваться:(
:{ Ну я же не это имел ввиду...
такие структуры я уже проходил...
мне надо на форме...
...и контролы нужные есть, но я пока не знаю как ими пользоваться:(
Да я так и понял... Но подумалось "а вдруг?"... :)
насчет TreeView - может таки вспомнишь?
если будет свободное время...
...ато проект горит, а без TreeView в списках товаров разобраться не реально:{
:o прайс ~ 3000 позиций:o
To mhaturov:
насчет TreeView - может таки вспомнишь?
если будет свободное время...
...ато проект горит, а без TreeView в списках товаров разобраться не реально:{
:o прайс ~ 3000 позиций:o
Подождёшь денёк - другой? Ей Богу, я бы с радостью хоть сейчас, но у меня тут такая запарка...:{ Только раскидаюсь с делами - вышлю описание. Чуто-чуть погоди. А пока поройся со свойствами TreeView. Уточни ещё, откуда подгружаются товары? Из БД? Хотя, по большому счёту, без разницы...
...пока другие функции попишу:)
Данные подгружаются в рекордсет, а уже из него в контрол...
...пасибо что не остался равнодушен к проблеме ближнего:)
Пару дней подожду...
...пока другие функции попишу:)
Данные подгружаются в рекордсет, а уже из него в контрол...
...пасибо что не остался равнодушен к проблеме ближнего:)
Слушай, чтобы тебе время не терять, спроси ещё тут(ссылки на страницы сайтов - сам там найдёшь нужные форумы). Может, там помогут. Если найдёшь ответ - сообщи сюда, ладно.
http://www.rsdn.ru/forum/?group=vb
Кроме того:
http://www.relib.com/articles/articles.asp?cid=3
http://www.vbrussian.com/conf/
P.S. Еще адрес (вернее, уточнение одного из них):
http://www.relib.com/forums/forum.asp?tp=11
Для каждого товара есть поля Code (код товара) и MasterCode (код группы, совпадает с кодом группы товаров)...
Пример:
WareName WareCode WareMasterCode
Товары 0
Кофе 1 0
Чибо 2 1
Элит 3 1
..................................
...надо создать древовидную структуру...
...если кто знает - помогите...
...если TreeView для этого не подходит, то подскажите другой вариант...
Пишу в VB6
Все просто %) Даже TreeView не надо! решение на самом деле элементарное.... %)
Но только у себя я этого примера не нашел... могу выложить завтра...
Какое решение то?
Начт так. Создаете родительский э-т простым add:
Set LI = ListView.ListItems.Add(, "E2", "name", , IconN)
Потом чтобы создать у этого э-та дочерний, делаете так:
LI.ListSubItems.Add(параметры)
...так что, если кому надо - обращайтесь...
...появилась другая проблема:
как определить глубину вложений?
то есть глубина вложений ветви неизвестна...
....это я прогнал:D
...более умный (по-моему) вопрос:
как определить имеется ли Node с заданным ключем?
Неее...
....это я прогнал :D
...более умный (по-моему) вопрос:
как определить имеется ли Node с заданным ключем?
Хе! %)
У меня в свое время такая же проблема возникла... Как Вы понимаете, проверять на насинг без толку, хотя это первое, что приходит в голову.
Надо делать он еррор резюм некст и присваивать любому ноду искмый элементдерева или листа. Потом проверять если еггог не ноль, то нули его и делай нужные выводы. Если надо просто удалить, под он еррор резюм некст удаляй. если его нет, он просто попытается выкинуть ошибку, а мы это предотвратим. :angel:
...но что то у меня не срабатывает Он Еррор...
...где его вставить, чтобы он работал?
Заполнение "Дерева" у меня в Private Function...
...может ее сделать Public?
Сегодня день какой то не такой?
Он Еррор всегда стабильно работал, а сегодня...:{
:devil: я в шоке!!!
Сегодня день какой то не такой?
Он Еррор всегда стабильно работал, а сегодня...:{
А что прописано в OnError? Кстати, OnError Resume Next лучше вообще не использовать - черевато. Поэтому, где можно, лучше обойти это. Попробуй подключить тот обработчик, который описан в http://forum.codenet.ru/showthread.php?threadid=13626 (вопрос про подстановку в комбобокс). Этот обработчик подключается, как глобальная процедура, затем пишешь OnError Goto <Имя метки>. Метку помещаешь после досрочного завершения процедуры (Exit Sub, Exit Function и т.д.) В метке пишешь вызов этого обработчика, и передаёшь ему номер и дескрипшен ошибки и имя модуля, где она возникла. После этого, в случае возникновения ошибки, программа не прерывается (если, конечно, ошибка не критичная (не описана переменная, например и присутствует Option Explicit в заголовке модуля)). Обработчик выдаёт сообщение об ошибке и пишет информацию в лог-файл, указанный в его коде (в примере это - Anketa.log). Потом можешь просто брать лог-файл и анализировать, какая ошибка в каком модуле возникла. Если модуль большой, можно создать в нём меточки, значения которых будет изменяться после обределённых частей кода, и в модуль передавать, помимо имени процедуры и модуля, значение меточки. Потом по этому значению лёгко найти место ошибки. Ну сам посмотришь, как я его вызываю - в том разделе форума все примеры есть.
Кстати, какая ошибка у тебя не обрабатывается? OnError не все подряд ошибки может обработать.
:devil: я в шоке!!!
Сегодня день какой то не такой?
Он Еррор всегда стабильно работал, а сегодня...:{
По поводу поиска ключа. Есть очень хитрый и прикольный вариант. Можно айтемы при заполнении элемента дублировать в коллекции, но в ней Имя Айтема - ключ, а ListIndex - параметр ключа. Если имена айтемов дублируются, прибавлять к дублям константы. Затем из коллекции просто вытягиваешь значение по имени айтема и получаешь его List Index :) . Ну а если айтемов мало - нечего заморачиваться - ищи это дело в цикле и не парься.:D
Структура в базе хранится как (имя) (код) (код группы)...
...у кореня дерева код группы=Null...
...я перегружую функцию, кот-я создает ноды (зачем что то искать, если просто можно несколко раз ее перегрузить и добраться до концов ветвей?)
...если при очередной перегрузке не создан ни один нод, то Flag=False - все, дерево построено!
...фигня в том, чтобы обработать ситуацию, когда очередной нод не может найти свой Parent (кстати по этому поводу и ошибка выдается №35601)....
...ну как, полный бред, или можно реализовать? P(
В кратце расскажу что я собственно делаю:
Структура в базе хранится как (имя) (код) (код группы)...
...у кореня дерева код группы=Null...
...я перегружую функцию, кот-я создает ноды (зачем что то искать, если просто можно несколко раз ее перегрузить и добраться до концов ветвей?)
...если при очередной перегрузке не создан ни один нод, то Flag=False - все, дерево построено!
...фигня в том, чтобы обработать ситуацию, когда очередной нод не может найти свой Parent (кстати по этому поводу и ошибка выдается №35601)....
...ну как, полный бред, или можно реализовать? P(
Попробуй так:
Private Sub EEE()
On Error Goto ErrHnd
...............
...............
...............
Exit Sub
ErrHnd:
If Err.Number = 35601 THEN
Err.Clear
Resume Next
ELSE
Err.Raise Err.Number, Err.Dascription
End IF
End Sub
...я уже туда MsgBox засунул - никакой реакции...
...только ошибки выдает...
Да! Ничего опасного в он еррор реюм некст нет! надо только перед отключением проверить err.number и задать его нулем....
Вообще при удалении э-та дерева его подэ-ты не удаляются, поэтому требуется рекурсивный обход...
Да! Ничего опасного в он еррор реюм некст нет! надо только перед отключением проверить err.number и задать его нулем....
Ага, а потом гадать, почему прога "глючит":D Я сталкивался с такой бедой. Пусть лучше выдаёт сообщение об ошибке - хоть будешь знать, где "глюк", а то потом забудешь, что есть тонкие места, и повесишься, ища место ошибки. Лучше писать так, чтобы ошибок вообще не могло возникать. А на On Error можно вешать обработчик конкретной ошибки. Например:
On Error GoTo ErrHng:
.....................
.....................
.....................
Exit Sub
ErrHng
If Err.Number = XXX
Resume [NEXT]
ELSE
Err.Raise Err.Number, <Имя процедуры>, Err.Description
End IF
End Sub
Ага, а потом гадать, почему прога "глючит":D Я сталкивался с такой бедой. Пусть лучше выдаёт сообщение об ошибке - хоть будешь знать, где "глюк", а то потом забудешь, что есть тонкие места, и повесишься, ища место ошибки. Лучше писать так, чтобы ошибок вообще не могло возникать. А на On Error можно вешать обработчик конкретной ошибки. Например:
On Error GoTo ErrHng:
.....................
.....................
.....................
Exit Sub
ErrHng
If Err.Number = XXX
Resume [NEXT]
ELSE
Err.Raise Err.Number, <Имя процедуры>, Err.Description
End IF
End Sub
Я именно об этом и говорил... но удалять субобъекты надо! Если их станет больше 65535-ти то жди сюрпризов, и вообще память почем зря переполнять нехорошо...
на ваших примерах я понял свою ошибку:
использовать ON ERROR надо!
а я это дело игнорировал...:{
поэтому вдвойне неприятно, что ON ERROR у меня работать не хочет:(
Есть предположения, что я делаю не так?
здрасте!
на ваших примерах я понял свою ошибку:
использовать ON ERROR надо!
а я это дело игнорировал...:{
поэтому вдвойне неприятно, что ON ERROR у меня работать не хочет:(
Есть предположения, что я делаю не так?
Напиши пример кода, в котором не работает On Error
Напиши пример кода, в котором не работает On Error
sub main()
ON ERROR GOTO Err
******************
******************
Exit Sub
Err:
MsgBox "Error!"
end sub
sub main()
ON ERROR GOTO Err
******************
******************
Exit Sub
Err:
MsgBox "Error!"
end sub
Err - это объект VB, ссылка на объект коллекции ошибок. Попробуй метку по-другому обозвать.
Err - это объект VB, ссылка на объект коллекции ошибок. Попробуй метку по-другому обозвать.
Это я для примера Err использовал...
...а вообще из ваших примеров брал.
Это я для примера Err использовал...
...а вообще из ваших примеров брал.
Хорошо, а в теле процедуры какой код? И в каком месте валится, конкретно (выдели его как-нибудь).
...например:
sub main()
ON ERROR GOTO Errrr
For...
************************
NodeX=Nodes.Add(....)
************************
Next...
Exit sub
Errrr:
MsgBox "Error!"
end sub
, при отсутствии Parent Node выдавало ошибку №35601, как я уже писал выше...
Я в разные функции вставлял, и везде ноль реакции...
...например:
sub main()
ON ERROR GOTO Errrr
For...
************************
NodeX=Nodes.Add(....)
************************
Next...
Exit sub
Errrr:
MsgBox "Error!"
end sub
, при отсутствии Parent Node выдавало ошибку №35601, как я уже писал выше...
Подозреваю, что тут рекурсивная ошибка. Сделай так:
Private Sub XXX
On Error Goto ErrHnd
Exit sub
ErrHnd:
debug.Print Err.Number
Resume Next
End Sub
Затем запусти это дело. Получишь ошибку. Посмотришь, какой номер тебе отдебажило. Затем в ErrHng добавляешь
Private Sub XXX
On Error Goto ErrHnd
Exit sub
ErrHnd:
Select Case Err.Number
Case <Номер отдебаженой ошибки>
Err.Number = 0
Err.Clear
Resume next
Case Else
debug.Print Err.Number
Resume Next
end Select
End Sub
Затем таким образом отлавливаешь номер 2 рекурсивной ошибки. Добавляешь её в обработчик
Private Sub XXX
On Error Goto ErrHnd
Exit sub
ErrHnd:
Select Case Err.Number
Case <Номер отдебаженой ошибки>
Err.Number = 0
Err.Clear
Resume next
Case <Номер отдебаженой ошибки №2>
Err.Number = 0
Err.Clear
Resume next
Case Else
debug.Print Err.Number
Resume Next
end Select
End Sub
Если номера ошибок в этом коде изменяются, то, значит, тут одна ошбка тянет другую. Тебе нужно всю цепочку этих ошибок включить в обработчик, иначе получается так: возникает ошибка, ты её обрабатываешь, но она успевает вытянуть следующую и т.д. Кроме того. On Error НЕ ВСЕГДА может работать с коллекциями из внешнего модуля. Возможно, это твой случай. Я, как немного освобожусь, подумаю над твоей проблемой.
...буду разбираться...
...как твой проект? закончил?
Большое спасибо за ответ...
...буду разбираться...
...как твой проект? закончил?
К сожалению, ещё парюсь...:{
...уже почти доделал, показал шефу, а он мне:
"Сильно заумно" & "Надо сделать проще" (читай "тупее")...
...и такое мне рассказал:devil: