Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: treeview node.Checked
 
 автор: osmor   (25.10.2006 в 17:25)   личное сообщение
 
 

хочу запретить установку флажка на ноде с отпределенный KEY.
на событие NodeCheck
пишу:

If Node.Key = "r_0" Then
    DoEvents
    Node.Checked = False
End If


причем что интересно, если делать "по шагам", то получается такая картина:

If Node.Key = "r_0" Then ' флажок установлен
    DoEvents  ' флажок установлен
    Node.Checked = False ' флажок НЕ установлен
End If ' флажок НЕ установлен
' флажок установлен

Если просто программно (ну например при нажатии на кнопку) поменять Checked, то все работает...
Кто знает как побороть?
или как запретить ставить галку на определенной ноде?

  Ответить  
 
 автор: Силыч   (25.10.2006 в 17:33)   личное сообщение
 
 

хм.... не знаю, Олег, у меня вот так вот на ноде root отключается спокойно
Private Sub tv_NodeCheck(ByVal Node As MSComctlLib.Node)
Select Case Node.Tag
Case "root":
Node.Checked = False
End Select
End Sub

зы.
может попробуй так сделать:
If Node.Key = "r_0" Then ' флажок установлен
DoEvents ' флажок установлен
Node.Checked = False ' флажок НЕ установлен
exit sub ' :)))
End If ' флажок НЕ установлен
' флажок установлен

  Ответить  
 
 автор: KrukVN   (25.10.2006 в 18:10)   личное сообщение
 
 

А у меня поисходит таже хрень, что и у osmor
может это от версии компонента зависит
я использую Microsoft windows common controls 6.0 (sp6) на Access XP + Win 2k AdvServer

  Ответить  
 
 автор: Силыч   (25.10.2006 в 18:23)   личное сообщение
 
 

нее, уменя тоже оказываеццо так :)
я сконфабулировал себе, панимаешь....

  Ответить  
 
 автор: Serge Gavrilov   (25.10.2006 в 19:23)   личное сообщение
 
 


Dim mClickedNode As MSComctlLib.Node

Private Sub TreeView1_Click()
    If Not mClickedNode Is Nothing Then
        If mClickedNode.Key = "r_0" Then
            mClickedNode.Checked = False
        End If
    End If
End Sub

Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
    Set mClickedNode = TreeView1.HitTest(x, y)
End Sub

Но конечно некрасиво, что метка будет появляться и пропадать.
Субклассингом должно получиться лучше.

  Ответить  
 
 автор: Serge Gavrilov   (26.10.2006 в 14:09)   личное сообщение
 
 

>Субклассингом должно получиться лучше.
У кого-нибудь есть примеры сабклассинга в Access 2000+
Что-то те, которые у меня есть не хотят работать, хотя раньше вроде работали ....

  Ответить  
 
 автор: osmor   (26.10.2006 в 14:15)   личное сообщение
 
 

Это не пойдет?
http://hiprog.com/index.php?option=com_content&task=view&id=450

  Ответить  
 
 автор: Serge Gavrilov   (26.10.2006 в 14:32)   личное сообщение
 
 

Спасибо, мои примеры тоже работают, я забыл о:
=============================================
'ВНИМАНИЕ!!! Если до начала работы субкласса был загружен
'редактор VBA, субкласс может (и будет!) работать некорректно!!!
'Закройте Access, потом снова откройте и запустите пример.
=============================================

  Ответить  
 
 автор: Аноним   (27.10.2006 в 16:49)
 
 

Видимо, в данном случае, в событии NodeCheck нельзя менять свойство элемента Checked,
так как иначе бы это привело к рекурсивному вызову события,
(именно изменение свойства приводит к возникновению события.)
Можно отследить мышку и на событие MouseUp для этого нода сбрасывать птицу.

Dim idx as Integer

Private Sub mTvw_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, ByVal y As stdole.OLE_YPOS_PIXELS)
If idx > 0 Then mTvw.Nodes(idx).Checked = False
End Sub

Private Sub mTvw_NodeCheck(ByVal Node As MSComctlLib.Node)
If Node.Key = "r_0" Then
idx = Node.Index
Else
idx = -1
End If
End Sub

Хотя нажатие кнопок клавиатуры тоже нужно отследить

  Ответить  
 
 автор: Силыч   (27.10.2006 в 17:04)   личное сообщение
 
 

я пошел немного другим путем :)
просто на обработчике проверяю Tag и если он тот, что нужен, то выполняю соответсвующие действия с данными, иначе - просто игнорирую его :) хотя можно и сообщение было бы вывести :)


Private Sub tv_NodeCheck(ByVal Node As MSComctlLib.Node)
    Dim rs2 As Recordset
    Dim I As Long
    
    Select Case Node.Tag
    Case "root":
        Node.Checked = False '-- как выяснилось не работает в этом месте, но и деструктивного ничего не делает тоже :)
    Case "regions":
        Set rs = db.OpenRecordset(TBLoc, dbOpenTable)
        With rs
            .Index = "PrimaryKey"
            .Seek "=", Trim(Node.Text)
            If Not .NoMatch Then
                .Edit
            Else
                .AddNew
            End If
            .Fields("LOCAT") = Nz(Trim(Node.Text), "- nothing -")
            .Fields("STATUS") = Nz(Node.Checked, False)
            .Update
        End With
            Set rs2 = db.OpenRecordset("SELECT dbo_vw_analyze01_locations.ÃÎÐÎÄ, " & _
                      "dbo_vw_analyze01_locations.ÑÊËÀÄ, dbo_vw_analyze01_locations.ENBL " & _
                      "FROM dbo_vw_analyze01_locations WHERE Trim([ÃÎÐÎÄ])='" & Trim(Node.Text) & _
                      "' GROUP BY dbo_vw_analyze01_locations.ÃÎÐÎÄ, dbo_vw_analyze01_locations.ÑÊËÀÄ, " & _
                      "dbo_vw_analyze01_locations.ENBL;")
            With rs2
                Do While Not .EOF
                     rs.Seek "=", Trim(.Fields("ÑÊËÀÄ"))
                     If rs.NoMatch Then
                         rs.AddNew
                     Else
                         rs.Edit
                     End If
                     rs.Fields("LOCAT") = Nz(Trim(.Fields("ÑÊËÀÄ")), "- nothing -")
                     rs.Fields("STATUS") = Nz(Node.Checked, False)
                     rs.Update
                    .MoveNext
                Loop
                .Close
            End With
            Node.Expanded = True
            For I = 0 To Node.Children - 1
                tv.Nodes(Node.Child.Index + I).Checked = Nz(Node.Checked, False)
            Next I
        rs.Close
    Case "locations":
        Set rs = db.OpenRecordset(TBLoc, dbOpenTable)
        With rs
            .Index = "PrimaryKey"
            .Seek "=", Trim(Node.Text)
            If Not .NoMatch Then
                .Edit
            Else
                .AddNew
            End If
            .Fields("LOCAT") = Nz(Trim(Node.Text), "- nothing -")
            .Fields("STATUS") = Nz(Node.Checked, False)
            .Update
            .Close
        End With
    End Select
    
End Sub

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList