Рейтинг:
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 передает данные между формами[^].