Помните последнюю использованную функцию / сохранить функцию в переменной? - PullRequest
0 голосов
/ 29 июня 2018

У меня есть программа, которая автоматизирует определенные процессы, чтобы сэкономить время, такие как выбор случайного выбора из списка, выбор нескольких случайных вариантов из списка, копирование ссылок на социальные сети в буфер обмена и т. Д. Я настроил несколько глобальных горячие клавиши для моих наиболее часто используемых функций, а остальные можно выбрать из ContextMenuStrip. Очевидно, что для щелчка правой кнопкой мыши и выбора элемента в ContextMenuStrip требуется больше времени, чем для нажатия горячей клавиши, очевидно.

Я хочу добавить горячую клавишу, которая будет выполняться для последней выбранной опции из ContextMenuStrip. Таким образом, если я хочу выполнить определенную функцию 10 раз подряд, я могу выбрать ее из ContextMenuStrip один раз , а затем просто нажать горячую клавишу 9 раз для остальных. Как мне этого добиться?

1 Ответ

0 голосов
/ 29 июня 2018

Для приведенного ниже примера создайте новый проект приложения WinForms и добавьте TextBox, Button и ContextMenuStrip. Добавьте три пункта в меню и назовите их «Первый», «Второй» и «Третий». Присвойте ContextMenuStrip свойству ContextMenuStrip формы.

Public Class Form1

    'A delegate referring to the method to be executed.
    Private method As [Delegate]

    'An array of arguments to be passed to the method when executed.
    Private arguments As Object()

    Private Sub FirstToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles FirstToolStripMenuItem.Click
        'Execute Method1 with no arguments.
        method = New Action(AddressOf Method1)
        arguments = Nothing
        ExecuteMethod()
    End Sub

    Private Sub SecondToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SecondToolStripMenuItem.Click
        'Execute Method2 with text from a TextBox as arguments.
        method = New Action(Of String)(AddressOf Method2)
        arguments = {TextBox1.Text}
        ExecuteMethod()
    End Sub

    Private Sub ThirdToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ThirdToolStripMenuItem.Click
        'Execute Method3 with no arguments.
        method = New Action(AddressOf Method3)
        arguments = Nothing
        ExecuteMethod()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'Execute again the last method executed.
        ExecuteMethod()
    End Sub

    Private Sub ExecuteMethod()
        If method IsNot Nothing Then
            'Invoke the current delegate with the current arguments.
            method.DynamicInvoke(arguments)
        End If
    End Sub

    Private Sub Method1()
        MessageBox.Show("Hello World", "Method1")
    End Sub

    Private Sub Method2(text As String)
        MessageBox.Show(text, "Method2")
    End Sub

    Private Sub Method3()
        MessageBox.Show("Goodbye Cruel World", "Method3")
    End Sub

End Class

Теперь вы можете щелкнуть правой кнопкой мыши форму и выбрать пункт меню, чтобы выполнить один из трех методов с именами Method1, Method2 и Method3. Если вы нажмете Button, он будет выполнен заново в зависимости от того, что было выполнено в последний раз.

Я также показал, как вы можете выполнять метод с аргументами и без них. Просто обратите внимание, что в этом случае нажатие Button после выбора пункта меню «Второй» выполнит Method2 с тем, что TextBox содержалось в то время, когда оно было выполнено в первый раз, а не с тем, что оно содержит сейчас. Если вам нужно было использовать текущее значение, вы должны получить его внутри метода, а не передавать его в качестве аргумента. Я просто включил эту часть, чтобы продемонстрировать передачу аргументов делегатам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...