неработает код для строки меню ПРАВКА

  • Автор темы Alex77777
  • Дата начала
A

Alex77777

есть код всплывающего меню "ПРАВКА"

Private Sub MDIForm_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = 2 Then
PopupMenu mnuEdit
End If
End Sub

при этом это меню работет хотя коды в строке меню "правка", "копировать" и т.п. я не прописывал, но когда же я выбираю например копировать в строке меню или набираю CTRL+C, то это меню не работает, т.к. нет кода в соответствующем месте, помогите, кто знает, каак быть, мне нужно чтобы работала строка меню: "Вырезать", "Копировать", "Вставить", Удалить".

Есть код для строки меню ПРАВКА-КОпировать

Private Sub itmCopy_Click()
Clipboard.SetText txtMain.SelText
End Sub

тогда он пишет "переменная не определена", как при выборе этого пункта в строке меню, так и во всплывающем меню.
 
T

Tanya

Сразу предлагаю вопросы по VB или VBA задавать в соответствующей ветке Visual Basic ^ https://codeby.net/forums/visual-basic.99/
тогда ответы возможно будут предложены раньше :D

теперь по существу вопроса :D

1) Подозреваю, что
это меню работет хотя коды в строке меню "правка", "копировать" и т.п. я не прописывал
возникает в том случае, когда меню вызывается над текстбоксом - это системное меню,
поэтому оно и работает, его обработкой занимается система

2) твое меню должно быть создано в форме MDIForm, пусть его имя будет MDIForm1
обработка нажатия мыши над формой MDIForm1 происходит, тогда когда
мышь кликается над пространством этой формы, а не дочерней, например доченяя форма
занимает только часть родительского окна, т.е. обработку MDIForm_MouseDown оставляем,
только если доступ к высплывающему меню нужен всегда
Из этого еще следует, что именно для дочернего окна нужна обработка нажатия мышки:

Код:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
PopupMenu MDIForm1.mnuEdit
End If
End Sub

3)
пишет "переменная не определена", как при выборе этого пункта в строке меню, так и во всплывающем меню.
я так думаю, что txtMain принадлежит дочернему окну, поэтому в родительском окне и не понимает,
что это за txtMain - нужна полная ссылка:
Код:
Clipboard.SetText ActiveForm.txtMain.Text
 
A

Alex77777

1. Спасибо за ссылку на форум по VB :)
2. Огромное спаибо за код :) , единственный вопрос:

Clipboard.SetText ActiveForm.txtMain.Text

вот только при нажатии на данную клавишу он все время копирует txtMain.Text, и только из одного тексбокса, а у меня их в дочерней форме несколько. Вопрос: как сделать что бы он копировал только выделенный текст и только из того текстбокса в котором выделен текст курсором :(

Заранее спасибо!
 
T

Tanya

With ActiveForm
If TypeName(.ActiveControl.Name)="TextBox" then
Clipboard.SetText .ActiveControl.SelText
End If
End With
 
A

Alex77777

правильно ли я понял: в строке
If TypeName(.ActiveControl.Name)="TextBox" then
"ActiveControl.Name"- это своего рода переменная, тогда как ей присвоить выделенный текст из текстбокса?

а строка
Clipboard.SetText .ActiveControl.SelText
копирует текст в буфер обмена?

у меня при нажатии в строке меню "правка-копировать" и далее при нажатии "вставить" во всплывающем меню, он вставляет любую часть кода из строки "If TypeName(.ActiveControl.Name)="TextBox" then" - это в том случае если я нажал копировать сразу после открытия формы, если же нажимать копировать из строки меню "правка", после нажатия "копировать" всплывающего меню, то она не работает.
 
N

Normann

Не понятно, а у вас PopupMenu должен выскакивать на форме или в текстбоксах?
 
A

Alex77777

PopupMenu это ведь всплывающее меню в текстбоксах - оно работает, не работает строка меню "правка" на самой форме, которое я сделал через редактор меню
 
A

Alex77777

у меня есть материнская Form1 и дочерняя форма Form2
в Form1 есть строка меню: файл, правка, окно и т.п.
в Form2 есть несколько текстбоксов
меня интересует коды строки меню "правка"Form1, они есть, но почему то работают не совсем так как хотелось бы.

строка меню Form1 "правка"

Private Sub itmCopy_Click()
On Error Resume Next
Clipboard.SetText ActiveForm.txtMain.SelText
End Sub

в этом коде я указываю, что копировать нужно из активной формы(Form2 в данном случае получается).

далее строка меню Form1 "вставить" пробовал этот код:

Private Sub itmPaste_Click()
dim Temp$ 'текст из буфера обмена
Temp$=Clipboard.GetText (vbCFText)
End Sub

он не работал,

потом написал следующий:

Private Sub itmPaste_Click()
On Error Resume Next
IF ActiveForm.txtMain.value Then
ActiveForm.txtMain.SelText = Clipboard.GetText
End if
End Sub

этот код работает, но.... вставку он делает только в текстбокс txtMain, а мне нужно, чтобы вставка производилась в любой выбранны мной кусрором текстбокс.


а код всплывающего меню "ПРАВКА":

Private Sub Form1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = 2 Then
PopupMenu mnuEdit
End If
End Sub

работает так как и нужно (т.е копировал из одного тексбокса, а вставлял в другой), здесь все четко.
Вопрос как сделать так, чтобы по такому же принципу работала и строка меню "правка" Form1
 
N

Normann

Лучше бы ты взял книгу и выучил хотябы основу, только зря теряешь время. Такие вопросы решаются быстрее с книгой чем с форумом.
Есть вопрос: как и где ты проверял значение переменной Temp$ ?
Дальше, чтобы программно работать с текущим элементом управления (на котором фокус) нужно использовать метод формы ActiveControl, про который тебе уже говорила Tanya. Он для формы так же как и ActiveForm для MDI формы. Например чтобы присвоить какое-то значение текущему текстбоксу нужно сделать что-то в роде этого:
Код:
Form1.ActiveControl.Text = "Текстовое значение или переменной"
Если текущий контрол не имеет свойства Text (например это CommandButton) то будет ошибка, отлавливай ее сам (тем более ты это уже делал).

На счет всплывающего контекстного меню и меню формы, у тебя здесь вообще не то что ты думаешь. Ты сконструировал меню в материнской форме, во первых ты вызываешь всплывающее меню не на тестбоксе, а на форме, при чем даже не на той где нужный контрол, а на родительской, поэтому то контестное меню которое у тебя вылазит на текстбоксе оно не твое, а стандартное, как уже тебе говорила Tanya. Поэтому то оно и работает нормально, а твое меню здесь и не причем. Если ты ткнешь по рабочей области родительской формы то увидишь свое меню.
 
A

Alex77777

Теперь разобрался, преогромнейшее СПАСИБО! Отдельное за терпение ко мне.
По поводу книги - ее я читал там не так, к сожалению, было подробно описано.

в итоге получилось вот такая штука.

в меню копировать:

Private Sub itmCopy_Click()
On Error Resume Next
Clipboard.SetText ActiveForm.ActiveControl.SelText
End Sub

в меню вставить:

Private Sub itmPaste_Click()
On Error Resume Next
ActiveForm.ActiveControl.SelText = Clipboard.GetText
End Sub

в меню вырезать:

Private Sub itmCut_Click()
On Error Resume Next
ActiveForm.ActiveControl.SelText = Clipboard.GetText
ActiveForm.ActiveControl.SelText = vbNullString
End Sub

в меню удалить:

Private Sub itmDel_Click()
On Error Resume Next
ActiveForm.ActiveControl.SelText = vbNullString
End Sub
 
N

Normann

А как на счет моего вопроса про Temp$ ?
Там тебе еще надо будет от стандартного меню избавиться когда будишь показывать свое меню через клик по текстбоксу, посмотри на MSDNе на тему popupmenu, помоему даже я там на русском видел такую статью.
 
A

Alex77777

Хм............. я только сейчас об этом задумался!.........
Хотя popupmenu мне вообще не нужно по идее...., т.к стандартное меню в текстбоксе все обеспичивает, но с другой стороны это сейчас не надо, а случаи разные бывают.
Один вопрос (возможно я просто тормоз :( ): что такое MSDN? ;)
 
N

Normann

:( MSDN это аббревиатура - Microsof Developer Network, в общем это сайт майкрософт посвященный разработке виндовых приложений средствами майкрософт. Там есть много хорошего - справка, трюки, другие различные статьи, новости, форумы и т.п. Но к большому сожалению там практически все на английском, есть что-то и на русском но для себя ты ничего на русском ничего не найдешь. Справка там самая точная, и полная так что бери словарь и читай. Большинство программистов отождествляют MSDN с большим справочником, потому что это основное применение сайта русскими программерами. Адрес сайта: . Еще MSDN бывает на дисках (архив) для какого либо их продукта отдельно, но найти такой диск в продаже очень сложно.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!