Member 11856456 Ответов: 2

Как сделать событие keydown внутри другого события?


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

Я решил, что могу сделать событие keydown внутри события, которое заполняет новую форму. Прямо сейчас это не работает, но я надеялся спросить кого-нибудь, на правильном ли я пути, и, возможно, если они знают, что мне нужно изменить?

Вот мой код:

Dim dk As System.Windows.Forms.KeyEventArgs
     dk = sender
     If dk.KeyCode = Keys.Escape Then
             picform.Close()
         End If


Что я уже пробовал:

Я пробовал изменить значение dk на целое число, а также пытался изменить его на ключевое значение, но ничего не помогло.

2 Ответов

Рейтинг:
2

Graeme_Grant

Рефакторинг (извлечение) кода в новый метод (Sub / Function). Затем вы можете вызвать его из нескольких мест вашего кода. Пример:

ДО:

Public Class Form1

    Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown

        ' code does something here!

    End Sub

End Class

ПОСЛЕ:
Public Class Form1

    Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown

        NewMethod()

    End Sub

    Sub NewMethod()

        ' code does something here!

    End Sub

    Sub OtherMethod()

        NewMethod()

    End Sub

End Class

Обновлено с новым требованием: Для нового требования вам необходимо использовать WithEvents чтобы захватить событие KeyDown.Вот новый пример, чтобы отразить это.
Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        OpenForm()
    End Sub

    Private WithEvents picform As New Form

    Sub OpenForm()

        picform.Height = 800
        picform.Width = 600
        ' picform.FormBorderStyle = FormBorderStyle.None
        picform.Show()

    End Sub

    Private Sub picform_KeyDown(sender As Object, e As KeyEventArgs) Handles picform.KeyDown

        MsgBox("Picformn keydown event caputred in parent form", MsgBoxStyle.Exclamation)

    End Sub

End Class


Member 11856456

Единственная проблема заключается в том, что там, где написано mybase.keydown, должно быть picform.keydown. Я не могу найти это событие в разделе withevents, но я вижу форму 1. Мне нужно вызвать picform, чтобы выполнить эту функцию. есть предложения?

Graeme_Grant

Событие keydown для формы или элемента управления?

Я прочитал его для формы-то есть: picform. Единственная разница в том, что моя форма называется Form1. В панели инструментов свойств Visual Studio щелкните молнию, и все события для формы или элемента управления будут перечислены.

Если вы имеете в виду элемент управления PictureBox, вместо этого используйте событие PreviewKeyDown.

Ralf Meier

Возможно, вам следует предоставить полный код этой проблемы ...
Для меня невозможно дать вам ответ с таким меньшим количеством информации ...

Member 11856456

поэтому я создал эту форму,

Dim picform как новая форма
пикформ.Управления.Добавить (контроль)
пикформ.Высота = 800
пикформ.Ширина = 600
'picform. FormBorderStyle = FormBorderStyle.Никто
пикформ.Покажите()

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

Graeme_Grant

См. обновление выше.

Задавая вопросы, вы должны четко сформулировать, что именно вы пытаетесь сделать, тогда вы получите лучший ответ с первого раза.

Member 11856456

Я получаю сообщение "не могу получить доступ к удаленному объекту". это близко к тому, что мне нужно проблема заключается в том, когда я иду, чтобы создать другую форму, которая является picform вот когда я получаю эту ошибку.

Ralf Meier

Я не совсем понимаю, что вы имеете в виду.
Но если вы показываете picForm, то picForm обычно имеет фокус-поэтому действие (и события) происходит из picForm.
Если вы хотите иметь picForm-Events вне picForm, вы должны создать его с помощью WithEvents :
& gt;public WithEvents picForm as new Form<
Но это не может быть сделано внутри метода. Для этого вы должны объявить picForm вне вашего метода (потому что вы хотите использовать его события независимо от этого метода).

Graeme_Grant

... в соответствии с приведенным выше кодом в решении ;)

Ralf Meier

Вы правы ... извините ... я этого не видел.
Но я думаю, что "Инкуайрер" этого не понимает ... :(

Ralf Meier

Я думаю, что он создает форму внутри кнопки.Щелчок-метод ...

Graeme_Grant

увлекательно....

Ralf Meier

кстати - Взгляните сюда :
https://www.codeproject.com/Questions/1197425/Why-cant-I-use-a-handler-for-a-new-form

Graeme_Grant

лол... тот же парень, Эй...

Member 11856456

да, я не мог найти на него подходящего ответа. ваш ответ помог в этом, но это не 100% то, что я ищу. это действительно позволяет мне добавить эту пикформу как withevents, что является шагом в правильном направлении. Я все еще исследую это, я занимаюсь этой проблемой уже около недели. Это очень расстраивает лол, но это хороший опыт обучения.

Ralf Meier

Вы не смогли получить адекватный ответ, потому что не умеете правильно задать вопрос и не готовы дать необходимую информацию. Помните: мы не сидим рядом с вами - мы не видим того, что видите вы ...

Рейтинг:
1

Member 11856456

Так что благодаря решению Graeme_Grants я смог выяснить все остальное,мне просто нужен был способ получить обработчик withevent.

 Private WithEvents picform As New Form

Dim picform As New Form
        picform.Controls.Add(expandpic)
        picform.Height = 800
            picform.Width = 600
        ' picform.FormBorderStyle = FormBorderStyle.None
        picform.Show()

        AddHandler picform.KeyDown, AddressOf picform_convert

    End Sub

    Private Sub picform_convert(ByVal sender As System.Object, ByVal e As KeyEventArgs)

        picform = CType(sender, Form)

        If e.KeyCode = Keys.Escape Then
            picform.Close()
            picform.Dispose()
        End If

    End Sub


Только что разобрался с остальным, спасибо за помощь. теперь я знаю, как вызвать обработчик withevent для дальнейшего использования.


Dave Kreskowiak

WithEvents просто означает, что обработчики событий, указывающие предложение Handles, подключены для вас. Если вы не можете использовать WithEvent, вам придется самостоятельно подключать события с помощью AddHandler, как вы это сделали в своем примере.

Ваш пример немного ошибочен. Вы создаете новую переменную экземпляра формы "picform", которая находится внутри метода и затем отображается в немодальном режиме. Сразу же после того, как этот метод существует, переменная picform выходит из области видимости, и форма, которую вы запустили, в конечном итоге умрет, когда сборщик мусора увидит, что ничто не содержит ссылки на нее.

Ваша текущая форма также не должна обрабатывать события другой формы. Это очень плохая практика-вечно связывать две формы вместе. Одно не может быть использовано повторно без другого. Эта концепция называется "разделение интересов". Пикформа должна была быть разработана отдельно, и код для обработки нажатий клавиш должен был быть помещен в этот код формы, а не в код другой формы.

Member 11856456

Дэйв, я ценю твой ответ. Поскольку я новичок в кодировании, поиск вашего "разделения проблем" был чем-то, что я должен был сделать. Поскольку я не очень много знаю о кодировании, есть ли у вас какие-либо примеры создания того, о чем вы говорите, или возможные примеры от других людей. Все, что делает мой код, - это создает временную форму с picturebox в ней, чтобы люди могли увеличить свое изображение. как только они закончат, они могут использовать ключ escape, и тогда он закроет эту временную форму. Если есть лучший, более чистый способ сделать это, я бы с удовольствием узнал, как это сделать.

Dave Kreskowiak

Простой. Класс, а форма есть класс, отвечает за одно и только за одно.

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

В случае форм он отвечает за отображение данных и ввод данных в соответствии с этими данными. Он отвечает только за контроль над этой формой, не более того.

Если речь идет о вашей форме picturebox, то это небольшой бизнес-процесс. Он показывает изображение, которое вы должны куда-то передать. Эта форма позволяет некоторое редактирование этого изображения, например изменение его размера, и возвращает это измененное изображение вызывающему абоненту, вашей первой форме.

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

Вы не должны создавать форму picturebox в коде первой формы. В этом нет необходимости.

Форму элемент управления PictureBox должна быть показана с помощью метода showdialog, не показывают. Это заставляет вашу первую форму остановиться и подождать, пока picturebox for, показанный в виде диалогового окна, будет уволен, прежде чем возобновить работу.

У меня нет времени строить пример, и есть тонны и тонны статей о передаче данных между формами по всему интернету, даже здесь, на CP, codeproject передает данные между формами[^].