Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.81/32: Рейтинг темы: голосов - 32, средняя оценка - 4.81
10 / 7 / 3
Регистрация: 13.07.2018
Сообщений: 565
1

Контекстное меню для TextBox на форме

22.03.2019, 17:46. Просмотров 5766. Ответов 71

Форумчане добрый вечер!
Подскажите сложно сделать контекстное на поле TextBox типа:

Отменить
_________
Вырезать
Копировать
Вставить
Удалить
__________
Выделить все

Причем если функция недоступна, поле меню Enable = False.

Добавлено через 9 минут
Через макросы не нашел все те команды, которые нужны.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2019, 17:46
Ответы с готовыми решениями:

По следам темы "Контекстное меню для TextBox на форме"
Выделено из https://www.cyberforum.ru/ms-access/thread2423596.html Eugene-LS, Eugene-LS,...

Одно контекстное меню для 5 textbox'ов
У меня 5 текстбоксов. Нужно для каждого текстбокса создать контекстное меню с одной кнопкой...

Свое контекстное меню для TextBox
Много написано в сети о контекстном меню для текстбокса для VB-6 а вот для VB.net ничего не нашел....

Создать контекстное меню для нескольких TextBox
Все наверное знают, что при нажатии текста например в ворде и т.д правой клавишей мыши появляется...

71
10 / 7 / 3
Регистрация: 13.07.2018
Сообщений: 565
23.03.2019, 11:36  [ТС] 21
Цитата Сообщение от shanemac51 Посмотреть сообщение
есть смысл пускать ТАКОГО пользователя
Смысл базы и есть в том чтобы пользователи, заносили туда и брали от туда информацию.
0
Модератор
Эксперт MS Access
9789 / 3838 / 615
Регистрация: 07.08.2010
Сообщений: 10,867
Записей в блоге: 2
23.03.2019, 12:04 22
Цитата Сообщение от vb001 Посмотреть сообщение
Смысл базы и есть в том чтобы пользователи, заносили туда и брали от туда информацию
это не проблема --можно ввести столбик выбора и экспортировать выборку в ворд/ексель
занести тоже не проблема ---надо только не разрешать корректировку/удаление старых записей
0
Модератор
Эксперт MS Access
2707 / 1515 / 372
Регистрация: 12.06.2016
Сообщений: 3,760
23.03.2019, 12:12 23
Цитата Сообщение от vb001 Посмотреть сообщение
как сделать по средством VBA?
Посредством VBA делается так:
Visual Basic
1
2
3
4
5
6
 Dim CmBar As Office.CommandBar, _
     CmBarButt As Office.CommandBarButton
 Set CmBar = Application.CommandBars.Add("имя контекстного меню", msoBarPopup, False, True)
 Set CmBarButt = CmBar.Controls.Add(1)
 CmBarButt.Caption = "надпись какая-нибудь"
 CmBarButt.OnAction = "=функция какая-нибудь()"
0
Модератор
Эксперт MS Access
2707 / 1515 / 372
Регистрация: 12.06.2016
Сообщений: 3,760
23.03.2019, 12:15 24
Цитата Сообщение от vb001 Посмотреть сообщение
Вырезать
Копировать
Вставить
Все это - элементы стандартного контекстного меню,
которое и так должно появляться при нажатии правой кнопки мыши.
Без всяких VBA.
0
10 / 7 / 3
Регистрация: 13.07.2018
Сообщений: 565
23.03.2019, 12:21  [ТС] 25
В стандартном меню много ненужного. Связанного с Access. Типа конструктора
0
Модератор
Эксперт MS Access
2707 / 1515 / 372
Регистрация: 12.06.2016
Сообщений: 3,760
23.03.2019, 12:27 26
Цитата Сообщение от vb001 Посмотреть сообщение
Типа конструктора
Если даете пользователям базу, допускающую конструктор, то он и будет доступен.
Давайте им базу, не допускающую конструктора - mde/accde.
0
10 / 7 / 3
Регистрация: 13.07.2018
Сообщений: 565
23.03.2019, 12:41  [ТС] 27
.mde вот меню
0
Миниатюры
Контекстное меню для TextBox на форме  
Модератор
Эксперт MS Access
2707 / 1515 / 372
Регистрация: 12.06.2016
Сообщений: 3,760
23.03.2019, 12:46 28
Во-первых, этого не может быть.

Во-вторых, зачем Вы мне меню формы показываете?
В меню поля даже в mdb никакого конструктора не будет.
0
420 / 84 / 26
Регистрация: 12.04.2015
Сообщений: 325
23.03.2019, 13:23 29
Панург, shanemac51, alvk, Панург, я вчера набросал такое контекстное меню, но не стал размещать т.к. столкнулся вот с какой проблемой.
Дело в том, что в теме vb001 оговаривает следующее условие:
Цитата Сообщение от vb001 Посмотреть сообщение
Причем если функция недоступна, поле меню Enable = False
это действительно логично
я набросал меню, задал обычные макрокоманды (в общем модуле), но вот мне не удалось (наверное в силу того, что я раздавлен работой и семьей и не столько много времени уделяю Access как хотелось бы) задать условие в каких случаях пункт меню активен, а в каком нет. ТО, что сделал (пример во вложении) будет работать при условии помещения курсора в само поле, но, заметил, что при переходе по записям (следующая / предыдущая) может быть момент когда курсор не на поле в таком случае и при вызове контекста все его пункты активны. Как это можно исправить?
и еще проблема это пункт меню "вставить". Из здравого смысла он должен быть активен если в буфере обмена что то есть, в противном случае - он не активен. Такое возможно реализовать? что то поискал похожее по Инету - но толком не подходило, хотя может быть искал, как выразился, Панург - "плохо". Кстати, пример высланный Вами - отличный, но как привязать к OnAction FindControl - не понял если честно. А ведь в такой модели вышеупомянутая проблема - решается без какого то обработчика заметил.
Образец.rar
0
Модератор
Эксперт MS Access
2707 / 1515 / 372
Регистрация: 12.06.2016
Сообщений: 3,760
23.03.2019, 13:29 30
Цитата Сообщение от glsn Посмотреть сообщение
Панург, shanemac51, alvk, Панург,....
Ну, не буду мешать.
0
420 / 84 / 26
Регистрация: 12.04.2015
Сообщений: 325
23.03.2019, 15:14 31
Capi, не поможете?
0
10 / 7 / 3
Регистрация: 13.07.2018
Сообщений: 565
23.03.2019, 19:23  [ТС] 32
Capi, вы же не обиделись? Давайте все вместе сделаем хорошую функцию. И доведем ее до ума. Думаю я не единственный у кого появилась данная задача.

Добавлено через 2 минуты
glsn, круто получилось

Добавлено через 13 минут
glsn, вы сделали выделить все с привязкой к конкретной форме и полю. То есть не смогу я этот модуль использовать в разных формах.
Как переменной присвоить имя открытой формы.
Если мы в место конкретных имен формы и поля будем указывать переменные, которые при нажатии правой кнопки будут записывать имя текущего поля и формы.
На пальцах как то так. Как в жизнь это воплотить?
0
420 / 84 / 26
Регистрация: 12.04.2015
Сообщений: 325
23.03.2019, 20:20 33
Цитата Сообщение от vb001 Посмотреть сообщение
То есть не смогу я этот модуль использовать в разных формах
я не решил вопрос выделения записи. макрокомандой DoCmd.RunCommand acCmdSelectAll на практике не работало - я решил так: ставим курсор в 0 и двигаемся до конца строки тем самым выделив всю.
Вам не обязательно работать в модуле. Я так понимаю что если мы пропишем .OnAction = "нашапродедура" и ниже в модуле формы её сделаем - тоже должно работать, но на практике пока не пробовал т.к. такие вещи вообще потребности нет делать (в базах которые делаю для себя во всяком случае).
0
5851 / 3271 / 705
Регистрация: 05.10.2016
Сообщений: 9,018
24.03.2019, 21:30 34
Цитата Сообщение от vb001 Посмотреть сообщение
Если мы в место конкретных имен формы и поля будем указывать переменные, которые при нажатии правой кнопки будут записывать имя текущего поля и формы.
Вот отвязал от формы и от поля + немного изменил.
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
Option Explicit
'--------------------------------------------------------------------------
' Module    : modTextBoxMenu
' Author    : vb001  ( + я чутка)
' Date      : 24.03.2019
' Purpose   : Контекстное меню для TextBox
'--------------------------------------------------------------------------
'   По материалам:
'   https://www.cyberforum.ru/ms-access/thread2423596-page2.html
'--------------------------------------------------------------------------
 
Private objTBox As Control
Public Sub BuildTextBoxMenu(objTextBox As Control)
'Построение временного меню ....
'--------------------------------------------------------------------------
Dim App As Application
Dim ObjCommandBar As Object  'Office.CommandBar
Dim ObjButton As Object 'Office.CommandBarButton
'--------------------------------------------------------------------------
On Error GoTo BuildTextBoxMenu_Err
    
 
    KillCustomMenuName "TextBoxMenu" 'удаляем если уже построено
    
    
    Set App = Application
    Set ObjCommandBar = App.CommandBars.Add("TextBoxMenu", 5, False, True) '5=msoBarPopup - Последний аргумент = временный
    
    Set objTBox = objTextBox
    
    
    With ObjCommandBar
        Set ObjButton = .Controls.Add(1, 128) '128=acCmdUndo
        With ObjButton
            .Caption = "Отменить (Undo)"
        End With
            
        Set ObjButton = .Controls.Add(1, 21) '21 = Cut
        With ObjButton
            .Caption = "Вырезать (Cut)"
            .BeginGroup = True
            If objTextBox.SelLength = 0 Then
                .Enabled = False
            End If
        End With
                
        Set ObjButton = .Controls.Add(1, 19) '19 = Copy
        With ObjButton
            .Caption = "Копировать (Copy)"
            If objTextBox.SelLength = 0 Then
                .Enabled = False
            End If
        End With
        
        Set ObjButton = .Controls.Add(1, 22) '22 = Paste
        With ObjButton
            .Caption = "Вставить (Paste)"
            'Если буфер обмена пустой ...
            If IsTextInClipboard = False Then
                .Enabled = False
            End If
        End With
        
        
        Set ObjButton = .Controls.Add(1, 478) '478 Delete
        With ObjButton
            .Caption = "Удалить (Delete)"
            '.FaceId = 1088 ???
            If objTextBox.SelLength = 0 Then
                .Enabled = False
            End If
 
        End With
        
        Set ObjButton = .Controls.Add(1, 1)
        With ObjButton
            .Caption = "Выделить всё!"
            .BeginGroup = True 'Разделитель
            .FaceId = 194
            .OnAction = "BuildTextBoxMenu_SelectAll"
        End With
        
        
    End With
'--------------------------------------------------------------------------
'Готово!
    objTextBox.ShortcutMenuBar = "TextBoxMenu"
 
BuildTextBoxMenu_End:
    On Error Resume Next
    Set ObjButton = Nothing
    Set ObjCommandBar = Nothing
    Set App = Nothing
    Err.Clear
    Exit Sub
 
BuildTextBoxMenu_Err:
    MsgBox "Error: " & Err.Number & vbCrLf & Err.Description & vbCrLf & _
    "in Sub: BuildTextBoxMenu in module: modTextBoxMenu", vbCritical, "Error in Application"
    Err.Clear
    Resume BuildTextBoxMenu_End
    
End Sub
Public Function BuildTextBoxMenu_SelectAll()
    objTBox.SetFocus
    objTBox.SelStart = 0
    objTBox.SelLength = Len(objTBox.Text)
End Function
Private Sub KillCustomMenuName(sName$)
' Удаление меню с заданным названием
'--------------------------------------------------------------------------
Dim App As Application
On Error GoTo KillCustomMenu_Err
    
    Set App = Application
    App.CommandBars(sName).Delete
    
 
KillCustomMenu_End:
    On Error Resume Next
    Set App = Nothing
    Err.Clear
    Exit Sub
 
KillCustomMenu_Err:
    'MsgBox "Error: " & Err.Number & vbCrLf & Err.Description & vbCrLf & _
    "in Sub: KillCustomMenu in module: modUtilities", vbCritical, "Error in Application"
    Err.Clear
    Resume KillCustomMenu_End
End Sub
Private Function IsTextInClipboard() As Boolean
'Проверка есть ли текст в буфере обмена ClipBoard
'--------------------------------------------------------------------------
Dim sText As String
Dim cbObject As Object
'--------------------------------------------------------------------------
On Error GoTo IsTextInClipboard_Err
    
    Set cbObject = GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    cbObject.GetFromClipboard
    sText = cbObject.GetText
    'Debug.Print sText
    sText = Trim(sText)
    If Len(sText) > 0 Then
        IsTextInClipboard = True
    End If
 
IsTextInClipboard_End:
    On Error Resume Next
    Set cbObject = Nothing
    Err.Clear
    Exit Function
 
IsTextInClipboard_Err:
    MsgBox "Error: " & Err.Number & vbCrLf & Err.Description & vbCrLf & _
    "in Function: IsTextInClipboard in module: 00_Tests", vbCritical, "Error in Application"
    Err.Clear
    Resume IsTextInClipboard_End
End Function
2
Миниатюры
Контекстное меню для TextBox на форме  
Вложения
Тип файла: zip TextBoxMenu_v02.zip (111.2 Кб, 11 просмотров)
420 / 84 / 26
Регистрация: 12.04.2015
Сообщений: 325
24.03.2019, 22:22 35
Eugene-LS, круто, но почему то сначала выпадает ошибка - м.б. что то нужно включить в References?
Контекстное меню для TextBox на форме
1
420 / 84 / 26
Регистрация: 12.04.2015
Сообщений: 325
24.03.2019, 22:27 36
причем ошибка если буфер обмена пуст
0
5851 / 3271 / 705
Регистрация: 05.10.2016
Сообщений: 9,018
24.03.2019, 23:04 37
Цитата Сообщение от glsn Посмотреть сообщение
причем ошибка если буфер обмена пуст
А так:
0
Вложения
Тип файла: zip TextBoxMenu_v04.zip (36.7 Кб, 14 просмотров)
5851 / 3271 / 705
Регистрация: 05.10.2016
Сообщений: 9,018
24.03.2019, 23:22 38
Цитата Сообщение от glsn Посмотреть сообщение
но почему то сначала выпадает ошибка - м.б. что то нужно включить в References?
Я как раз стремился от них избавится - в версии 02 пропустил объявления в заголовке формы.
Сейчас проверил.
Вставил модуль в своё приложение (скопировал с форума) - работает без ссылки на библиотечку MSO.
Смотрите v04 ...
0
5851 / 3271 / 705
Регистрация: 05.10.2016
Сообщений: 9,018
25.03.2019, 04:28 39
В результате имеем ссылки, как на скрине (ниже), и всё работает!
У меня, во всяком случае (MSA 2010 x86 Eng).
Спасибо vb001 за идею.
Спасибо glsn, за тестирование.
Буду рад любым ...
Спасибо за внимание!
0
Миниатюры
Контекстное меню для TextBox на форме  
7236 / 4522 / 491
Регистрация: 27.03.2013
Сообщений: 16,548
25.03.2019, 06:40 40
Интересно, как скоро запортятся и поперепутаются ранее введенные данные в БД, ибо по любому ТС в спешке может вместо - Скопировать, нажать - Вставить, т.к. у него, после вчерашнего корпоратива рука дрогнула, а он и не заметил, что не в туда мышом ткнул, и пошел другие данные редактировать?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.03.2019, 06:40

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Контекстное меню в виде объектов на форме
Привет ! Нужно создать на форме подобие контекстного меню с разделительными линиями. Чтобы...

Как создать контекстное меню. Например нажимая на richTextBox правой кнопкой мыши, мне бы предоставлялось контекстное меню
Как создать контекстное меню. Например нажимая на richTextBox правой кнопкой мыши, мне бы...

TextBox: вырубить контекстное меню + правильная обработка вставки из буфера
Добрый день! Есть 2 вопроса, первичный поиск результатов не дал. У меня есть свой класс типа...

Контекстное меню по нажатию правой кнопки мыши на форме
Приветствую Вас! Подскажите пожалуйста, как сделать так, чтобы при нажатии в любом произвольном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.