Форум программистов, компьютерный форум, киберфорум
Наши страницы
MS Access
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.54/24: Рейтинг темы: голосов - 24, средняя оценка - 4.54
vb001
4 / 3 / 1
Регистрация: 13.07.2018
Сообщений: 350
1

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

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

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

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

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

Добавлено через 9 минут
Через макросы не нашел все те команды, которые нужны.
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2019, 17:46
Ответы с готовыми решениями:

Контекстное меню для работы в Runtime
Доброго времени суток). Прошу помощи в написании контекстного меню для работы в Runtime access с...

Контекстное меню через VBA для отчёта
Нужно быстро убрать стандартное контекстное меню в отчётах и вместо него добавить меню с...

Контекстное меню
не могу найти пример как работать с контекстным меню Только это...

Контекстное меню
Уважаемые, проблемы такова... Как к контестному меню прицепить свое действие, т.е. как его создать...

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

71
vb001
4 / 3 / 1
Регистрация: 13.07.2018
Сообщений: 350
23.03.2019, 11:36  [ТС] 21
Цитата Сообщение от shanemac51 Посмотреть сообщение
есть смысл пускать ТАКОГО пользователя
Смысл базы и есть в том чтобы пользователи, заносили туда и брали от туда информацию.
0
shanemac51
Модератор
Эксперт MS Access
8657 / 3347 / 518
Регистрация: 07.08.2010
Сообщений: 9,326
Записей в блоге: 2
23.03.2019, 12:04 22
Цитата Сообщение от vb001 Посмотреть сообщение
Смысл базы и есть в том чтобы пользователи, заносили туда и брали от туда информацию
это не проблема --можно ввести столбик выбора и экспортировать выборку в ворд/ексель
занести тоже не проблема ---надо только не разрешать корректировку/удаление старых записей
0
Capi
Модератор
Эксперт MS Access
2196 / 1144 / 263
Регистрация: 12.06.2016
Сообщений: 2,718
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
Capi
Модератор
Эксперт MS Access
2196 / 1144 / 263
Регистрация: 12.06.2016
Сообщений: 2,718
23.03.2019, 12:15 24
Цитата Сообщение от vb001 Посмотреть сообщение
Вырезать
Копировать
Вставить
Все это - элементы стандартного контекстного меню,
которое и так должно появляться при нажатии правой кнопки мыши.
Без всяких VBA.
0
23.03.2019, 12:15
vb001
4 / 3 / 1
Регистрация: 13.07.2018
Сообщений: 350
23.03.2019, 12:21  [ТС] 25
В стандартном меню много ненужного. Связанного с Access. Типа конструктора
0
Capi
Модератор
Эксперт MS Access
2196 / 1144 / 263
Регистрация: 12.06.2016
Сообщений: 2,718
23.03.2019, 12:27 26
Цитата Сообщение от vb001 Посмотреть сообщение
Типа конструктора
Если даете пользователям базу, допускающую конструктор, то он и будет доступен.
Давайте им базу, не допускающую конструктора - mde/accde.
0
vb001
4 / 3 / 1
Регистрация: 13.07.2018
Сообщений: 350
23.03.2019, 12:41  [ТС] 27
.mde вот меню
0
Миниатюры
Контекстное меню для TextBox на форме  
Capi
Модератор
Эксперт MS Access
2196 / 1144 / 263
Регистрация: 12.06.2016
Сообщений: 2,718
23.03.2019, 12:46 28
Во-первых, этого не может быть.

Во-вторых, зачем Вы мне меню формы показываете?
В меню поля даже в mdb никакого конструктора не будет.
0
glsn
185 / 73 / 20
Регистрация: 12.04.2015
Сообщений: 291
23.03.2019, 13:23 29
Панург, shanemac51, alvk, Панург, я вчера набросал такое контекстное меню, но не стал размещать т.к. столкнулся вот с какой проблемой.
Дело в том, что в теме vb001 оговаривает следующее условие:
Цитата Сообщение от vb001 Посмотреть сообщение
Причем если функция недоступна, поле меню Enable = False
это действительно логично
я набросал меню, задал обычные макрокоманды (в общем модуле), но вот мне не удалось (наверное в силу того, что я раздавлен работой и семьей и не столько много времени уделяю Access как хотелось бы) задать условие в каких случаях пункт меню активен, а в каком нет. ТО, что сделал (пример во вложении) будет работать при условии помещения курсора в само поле, но, заметил, что при переходе по записям (следующая / предыдущая) может быть момент когда курсор не на поле в таком случае и при вызове контекста все его пункты активны. Как это можно исправить?
и еще проблема это пункт меню "вставить". Из здравого смысла он должен быть активен если в буфере обмена что то есть, в противном случае - он не активен. Такое возможно реализовать? что то поискал похожее по Инету - но толком не подходило, хотя может быть искал, как выразился, Панург - "плохо". Кстати, пример высланный Вами - отличный, но как привязать к OnAction FindControl - не понял если честно. А ведь в такой модели вышеупомянутая проблема - решается без какого то обработчика заметил.
Образец.rar
0
Capi
Модератор
Эксперт MS Access
2196 / 1144 / 263
Регистрация: 12.06.2016
Сообщений: 2,718
23.03.2019, 13:29 30
Цитата Сообщение от glsn Посмотреть сообщение
Панург, shanemac51, alvk, Панург,....
Ну, не буду мешать.
0
glsn
185 / 73 / 20
Регистрация: 12.04.2015
Сообщений: 291
23.03.2019, 15:14 31
Capi, не поможете?
0
vb001
4 / 3 / 1
Регистрация: 13.07.2018
Сообщений: 350
23.03.2019, 19:23  [ТС] 32
Capi, вы же не обиделись? Давайте все вместе сделаем хорошую функцию. И доведем ее до ума. Думаю я не единственный у кого появилась данная задача.

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

Добавлено через 13 минут
glsn, вы сделали выделить все с привязкой к конкретной форме и полю. То есть не смогу я этот модуль использовать в разных формах.
Как переменной присвоить имя открытой формы.
Если мы в место конкретных имен формы и поля будем указывать переменные, которые при нажатии правой кнопки будут записывать имя текущего поля и формы.
На пальцах как то так. Как в жизнь это воплотить?
0
glsn
185 / 73 / 20
Регистрация: 12.04.2015
Сообщений: 291
23.03.2019, 20:20 33
Цитата Сообщение от vb001 Посмотреть сообщение
То есть не смогу я этот модуль использовать в разных формах
я не решил вопрос выделения записи. макрокомандой DoCmd.RunCommand acCmdSelectAll на практике не работало - я решил так: ставим курсор в 0 и двигаемся до конца строки тем самым выделив всю.
Вам не обязательно работать в модуле. Я так понимаю что если мы пропишем .OnAction = "нашапродедура" и ниже в модуле формы её сделаем - тоже должно работать, но на практике пока не пробовал т.к. такие вещи вообще потребности нет делать (в базах которые делаю для себя во всяком случае).
0
Eugene-LS
4024 / 2351 / 453
Регистрация: 05.10.2016
Сообщений: 6,542
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
'--------------------------------------------------------------------------
'   По материалам:
'   http://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 Кб, 6 просмотров)
glsn
185 / 73 / 20
Регистрация: 12.04.2015
Сообщений: 291
24.03.2019, 22:22 35
Eugene-LS, круто, но почему то сначала выпадает ошибка - м.б. что то нужно включить в References?
Контекстное меню для TextBox на форме
1
glsn
185 / 73 / 20
Регистрация: 12.04.2015
Сообщений: 291
24.03.2019, 22:27 36
причем ошибка если буфер обмена пуст
0
Eugene-LS
4024 / 2351 / 453
Регистрация: 05.10.2016
Сообщений: 6,542
24.03.2019, 23:04 37
Цитата Сообщение от glsn Посмотреть сообщение
причем ошибка если буфер обмена пуст
А так:
0
Вложения
Тип файла: zip TextBoxMenu_v04.zip (36.7 Кб, 7 просмотров)
Eugene-LS
4024 / 2351 / 453
Регистрация: 05.10.2016
Сообщений: 6,542
24.03.2019, 23:22 38
Цитата Сообщение от glsn Посмотреть сообщение
но почему то сначала выпадает ошибка - м.б. что то нужно включить в References?
Я как раз стремился от них избавится - в версии 02 пропустил объявления в заголовке формы.
Сейчас проверил.
Вставил модуль в своё приложение (скопировал с форума) - работает без ссылки на библиотечку MSO.
Смотрите v04 ...
0
Eugene-LS
4024 / 2351 / 453
Регистрация: 05.10.2016
Сообщений: 6,542
25.03.2019, 04:28 39
В результате имеем ссылки, как на скрине (ниже), и всё работает!
У меня, во всяком случае (MSA 2010 x86 Eng).
Спасибо vb001 за идею.
Спасибо glsn, за тестирование.
Буду рад любым ...
Спасибо за внимание!
0
Миниатюры
Контекстное меню для TextBox на форме  
VinniPuh
6560 / 3861 / 420
Регистрация: 27.03.2013
Сообщений: 14,249
25.03.2019, 06:40 40
Интересно, как скоро запортятся и поперепутаются ранее введенные данные в БД, ибо по любому ТС в спешке может вместо - Скопировать, нажать - Вставить, т.к. у него, после вчерашнего корпоратива рука дрогнула, а он и не заметил, что не в туда мышом ткнул, и пошел другие данные редактировать?
0
25.03.2019, 06:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2019, 06:40

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

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

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


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

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

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