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

Тема в разделе "Другие", создана пользователем Alex77777, 3 июл 2007.

  1. Alex77777

    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

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

    Tanya Гость

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

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

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

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

    Код (Text):
    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 - нужна полная ссылка:
    Код (Text):
    Clipboard.SetText ActiveForm.txtMain.Text
     
  3. Alex77777

    Alex77777 Гость

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

    Clipboard.SetText ActiveForm.txtMain.Text

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

    Заранее спасибо!
     
  4. Tanya

    Tanya Гость

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

    Alex77777 Гость

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

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

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

    Normann Well-Known Member

    Регистрация:
    9 авг 2007
    Сообщения:
    168
    Симпатии:
    2
    Не понятно, а у вас PopupMenu должен выскакивать на форме или в текстбоксах?
     
  7. Alex77777

    Alex77777 Гость

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

    Normann Well-Known Member

    Регистрация:
    9 авг 2007
    Сообщения:
    168
    Симпатии:
    2
    Кинь весь код.
     
  9. Alex77777

    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
     
  10. Normann

    Normann Well-Known Member

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

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

    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
     
  12. Normann

    Normann Well-Known Member

    Регистрация:
    9 авг 2007
    Сообщения:
    168
    Симпатии:
    2
    А как на счет моего вопроса про Temp$ ?
    Там тебе еще надо будет от стандартного меню избавиться когда будишь показывать свое меню через клик по текстбоксу, посмотри на MSDNе на тему popupmenu, помоему даже я там на русском видел такую статью.
     
  13. Alex77777

    Alex77777 Гость

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

    Normann Well-Known Member

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

Поделиться этой страницей