Одна из функций принимает в качестве параметра объект (Control).
Нужно у этого объекта вызвать событие.
И вызвать так, чтобы его получили все подписчики.
Такое вообще возможно?
--------------------------------------------------------------------
----------Собственно пример, в котором это нужно--------------------
--------------------------------------------------------------------
В модуле Visual Basic 6.0, есть функция FGEnsureMouseRowColInSelection,
которую я вызываю по нажатию правой кнопкой мыши на FlexGrid-е
для того, чтобы убедиться, что мышкой нажали внутри выделения.
Если нажали не внутри выделения,
то на гриде выделяется та ячейка, на которой кликнули.
А после этого в другой функции этого же глобального модуля
я показываю контекстное меню, например с одним пунктом меню "копировать".
------------------------------------------------------------------------
- Код: Выделить всё
Attribute VB_Name = "modFlexGrid"
Public Function FGEnsureMouseRowColInSelection(aFG As MSHFlexGrid) As Boolean
If aFG.MouseCol < aFG.FixedCols Or aFG.MouseRow < aFG.FixedRows Then Exit Function
If (aFG.MouseCol < aFG.Col And aFG.MouseCol < aFG.ColSel) _
Or (aFG.MouseCol > aFG.Col And aFG.MouseCol > aFG.ColSel) _
Or (aFG.MouseRow < aFG.Row And aFG.MouseRow < aFG.RowSel) _
Or (aFG.MouseRow > aFG.Row And aFG.MouseRow > aFG.RowSel) Then
aFG.Row = aFG.MouseRow
aFG.Col = aFG.MouseCol
aFG.ColSel = aFG.MouseCol
aFG.RowSel = aFG.MouseRow
End If
FGEnsureMouseRowColInSelection = True
End Function
------------------------------------------------------------------------
На форме, где находится этот грид, по смене строки (RowColChange) этого грида
обновлются еще два зависимых списка.
Поскольку я меняю строку (aFG.Row) из кода, то событие RowColChange не возникает.
И из-за этого зависимые списки не обновляются, что приводит к недоразумениям.
Напоминаю, что модуль глобальный и функция используется по проекту много раз.
------------------------------------------------------------------------
Самое простое что придумал, это сделать в форме обработчик события публичным
- Код: Выделить всё
Attribute VB_Name = "frmMain"
Public Sub FG_RowColChange()
txtStatusBar.Text = FG.TextMatrix(FG.Row, FG.Col)
Fill_FG1 'Обновить первый подчиненный список
Fill_FG2 'Обновить второй подчиненный список
End Sub
А в функции вызвать у родительской формы метод FG_RowColChange:
- Код: Выделить всё
Attribute VB_Name = "modFlexGrid"
Public Function FGEnsureMouseRowColInSelection(aFG As MSHFlexGrid) As Boolean
If aFG.MouseCol < aFG.FixedCols Or aFG.MouseRow < aFG.FixedRows Then Exit Function
If (aFG.MouseCol < aFG.Col And aFG.MouseCol < aFG.ColSel) _
Or (aFG.MouseCol > aFG.Col And aFG.MouseCol > aFG.ColSel) _
Or (aFG.MouseRow < aFG.Row And aFG.MouseRow < aFG.RowSel) _
Or (aFG.MouseRow > aFG.Row And aFG.MouseRow > aFG.RowSel) Then
aFG.Row = aFG.MouseRow
aFG.Col = aFG.MouseCol
aFG.ColSel = aFG.MouseCol
aFG.RowSel = aFG.MouseRow
On Error Resume Next
CallByName aFG.Parent, aFG.Name & "_RowColChange", VbMethod
On Error GoTo 0
End If
FGEnsureMouseRowColInSelection = True
End Function
------------------------------------------------------------------------
Все вроде ничего, но есть два существеннх минуса:
1. Если эту функцию будет использовать тот, которых не знает/не помнит,
что обработчик события FG_RowColChange нужно обязательно сделать публичным,
то событие опять не будет вызвано.
2. Этот же объект (грид) может быть передан в другие классы,
в которых тоже обрабатывается это же событие.
И вот в этом классе событие опять не будет вызвано
То есть при таком подходе я не могу вызвать событие так, чтобы его получили все подписчики.
------------------------------------------------------------------------
Собственно вопрос:
Если ли какая-нибудь API-функция (пирсущая именно FlexGrid-у)
или вообще абстрактная, как CallByName,
которая может у объекта вызвать событие, которое получат все его подписчики?
------------------------------------------------------------------------
Спасибо,
Василий Дельцов
icq 93396861
- Код: Выделить всё