Один код контекстного меню для нескольких элементов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ser-Robotiaga
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 19.01.2007 (Пт) 0:45

Один код контекстного меню для нескольких элементов

Сообщение Ser-Robotiaga » 29.05.2010 (Сб) 23:22

Есть массив элементов управления (RichTextBox). При вызове и отработке пункта контекстного меню на любом из RichTextBox выполняется некоторый код, одинаковый для всех RichTextBox. Не могу сообразить, как сделать, чтобы этот код распространялся на все RichTextBox. Я понимаю, что можно создать переменную уровня формы и присвоить ей значение Index в процедуре RichTextBox1_MouseUp(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single).
А можно ли обойтись без глобальных переменных?

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Re: Один код контекстного меню для нескольких элементов

Сообщение Kovu » 29.05.2010 (Сб) 23:26

Достаточно создать несколько экземпляров RichTextBox1, присвоив первому значение 0 и раскопировав по форме. Либо написать код только в процедуре для одного из контролов, а из остальных вызывать эту процедуру.
Если всё делать своими ручками, они скоро отвалятся !

Ser-Robotiaga
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 19.01.2007 (Пт) 0:45

Re: Один код контекстного меню для нескольких элементов

Сообщение Ser-Robotiaga » 29.05.2010 (Сб) 23:49

Массивы уже созданы. Контекстное меню вызывается классическим кодом
Код: Выделить всё
Public Sub RichTextBox1_MouseUp(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = vbRightButton Then
    PopupMenu mnuRTF
End If
End Sub

В результате раскрывается контекстное меню, когда я кликаю на одном из пунктов меню вызывается следующая процедура например Private Sub mnuFont_Click(). Для контекстного меню есть только одно событие Click, в которое я не могу передать номер RichTextBox. Получается, что я могу передать только глобальную переменную, содержащую номер RichTextBox.
Для наглядности код
Код: Выделить всё
Private Sub mnuFont_Click()
    'эмулировать ошибку если нажата кнопка Cancel
    cdlOpen.CancelError = True
    On Error GoTo Errhandler:
    'установить флаги специальных эффектов и всех шрифтов системы
   cdlOpen.Flags = cdlCFEffects Or cdlCFBoth
    'показать окно выбора шрифта
    cdlOpen.ShowFont
    'установить пользовательские параметры форматирования:
    RichTextBox1(i).SelFontName = cdlOpen.FontName
    RichTextBox1(i).SelFontSize = cdlOpen.FontSize
    RichTextBox1(i).SelColor = cdlOpen.Color
    RichTextBox1(i).SelBold = cdlOpen.FontBold
    RichTextBox1(i).SelItalic = cdlOpen.FontItalic
    RichTextBox1(i).SelUnderline = cdlOpen.FontUnderline
    RichTextBox1(i).SelStrikeThru = cdlOpen.FontStrikethru
Errhandler:
    'выйти из процедуры если нажата кнопка Cancel
End Sub

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Один код контекстного меню для нескольких элементов

Сообщение Денис » 31.05.2010 (Пн) 14:33

Когда Вы жмете мышкой на контроле, он выполняет SetFocus и, очевидно, получает фокус. Таким образом мы можем вообще не пользоваться массивами, не пользоваться глобальными переменными, но поиметь общую процедуру для нескольких однотипных контролов. Весь фокус в том, что нужно теребить коллекцию Controls формы (к сожалению, разработчики не снабдили ее интерфейсом, то-ли из вредности, то-ли не успели, то-ли не вкурили).

В общем, всё еще проще. Надо RichTextBox1(i) заменить на Me.ActiveControl (если в VB есть, в VBA есть):

Код: Выделить всё
Private Sub mnuFont_Click()
    'эмулировать ошибку если нажата кнопка Cancel
    cdlOpen.CancelError = True
    On Error GoTo Errhandler:
    'установить флаги специальных эффектов и всех шрифтов системы
   cdlOpen.Flags = cdlCFEffects Or cdlCFBoth
    'показать окно выбора шрифта
    cdlOpen.ShowFont
    'установить пользовательские параметры форматирования:
    with Me.ActiveControl
        .SelFontName = cdlOpen.FontName
        .SelFontSize = cdlOpen.FontSize
        .SelColor = cdlOpen.Color
        .SelBold = cdlOpen.FontBold
        .SelItalic = cdlOpen.FontItalic
        .SelUnderline = cdlOpen.FontUnderline
        .SelStrikeThru = cdlOpen.FontStrikethru
    end with
Errhandler:
    'выйти из процедуры если нажата кнопка Cancel
End Sub


Фишка в том, что процедура всяко будет вызываться над одним из ричтекстбоксов, а значит, нужные свойства у ActiveControl будут.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Ser-Robotiaga
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 19.01.2007 (Пт) 0:45

Re: Один код контекстного меню для нескольких элементов

Сообщение Ser-Robotiaga » 31.05.2010 (Пн) 18:16

Спасибо, Денис. Это то, что нужно. Работает. :thumright:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 23

    TopList