2011-09-27 2 views
0

프로그램에서 다른 양식으로 전환하려고 할 때 항상 예외가 발생합니다. 어쩌면이 문제를 해결하도록 도와 줄 수 있습니다. 여기에 예외 메시지는 다음과 같습니다양식 전환 (VB.NET)

Control.Invoke 내가 양식에 아주 좋은 변수를 첨부

별도의 스레드에서 만든 컨트롤과 상호 작용하는 데 사용되어야하며, 내가 명령을 사용하려고하면이 문제가 발생합니다 MyForm.Show()와 같습니다.

양식이 변수에 첨부되지 않은 경우에는 발생하지 않지만 텍스트 상자 등을 새로 고치는 데는 심각한 문제가 있습니다.

곧 소식을 듣고 싶습니다!


편집;

나는 4 가지 형태가 있습니다.

RegularForm = Me 
StartupForm = frmStartup 
LoginForm = frmLogin 
PasswordForm = frmPassword 
SettingsForm = frmSettings 
주된 형태

Public StartupForm As frmStartup 
Public RegularForm As frmRegularUse 
Public LoginForm As frmLogin 
Public PasswordForm As frmPassword 
Public SettingsForm As frmSettings 

: 모듈

: I 서브 (...)의 메인 모듈의 주요 형태를로드하면 MyBase.Load 난 다음 코드를 실행하는 처리

이것은 양식 새로 고침을 완벽하게 제어하기 위해 고안 한 aproach입니다. 그것은 윈도우 CE와 모토로라 스캐너 프로그램입니다. 예를 들어, LoginForm에 정확한 비밀번호를 입력하면 RegularForm으로 전환하고 싶습니다. RegularForm.Show() 또는 RegularForm.ShowDialog 또는 RegularForm.BringToFront()를 사용하려고하면 예외가 발생합니다. frmRegularUse.Show()를 사용하여 폼을 호출하려고하면 폼을 호출 할 수 있지만 다른 스레드에서 만들어 지므로 믿을 수 없으므로 컨트롤을 느슨하게 할 수 있습니다 (키보드에서 무언가를 가져 오려고 할 때, 응답 없음).

+0

MyForm은 양식의 클래스 이름입니까, 아니면 클래스의 인스턴스입니까? – Martin

+1

다른 양식을 작성하고 표시하는 방법을 보여주는 코드를 게시하십시오. 그러면 문제의 원인을 파악하는 데 도움이됩니다. –

답변

1

양식이 다른 스레드에서 작성되는 것은 의심 스럽지만 중지 할 경우 되돌아 가서 수정하십시오. 모든 양식은 기본 GUI 스레드에서 작성하고 액세스해야합니다. 둘째로, 나는 당신이 양식을 "새롭게"했다고 생각하지 않습니다.

StartupForm = New frmStartup 
RegularForm = New frmRegularUse 
LoginForm = New frmLogin 
PasswordForm = New frmPassword 
SettingsForm = New frmSettings 
+0

"의 대상 버전입니다.NET Compact Framework에서 "late-binding"을 지원하지 않습니다. – jarek

+0

예, VB.NET 'form type = form object'기능은 스레딩을 시도 할 때 많은 vb 프로그래머가 큰 어려움을 겪었습니다. 먼저 frmStartup.BeginInvoke()를 호출하십시오. –

+0

@jarek 당신이 말하고자하는 것이 확실하지 않지만, Moto 및 Intermec 임베디드 장치를 항상 코딩합니다. 양식의 단일 인스턴스를 원할 경우 다음을 포함시켜야합니다. 해당 코드를 Sub Main.Application.Run()에 대한 호출에서 기본 폼 인 싱글 톤을 전달하십시오. 다시 새로 작성하지 마십시오. – tcarvin

0

사실, 제가 한 것은 :이 같은 뭔가가 필요
아직 내가 가진 메인 모듈에서 동일한 코드 : 나는 그것이 작동하도록 관리

Public StartupForm As frmStartup 
Public RegularForm As frmRegularUse 
Public LoginForm As frmLogin 
Public PasswordForm As frmPassword 
Public SettingsForm As frmSettings 

가능한 가장 단순한 방법. 예를 들어 - 나는 로그인 양식을 실행하고 다음 코드 (짧은 긴 이야기) 실행 : 나는 다시 한 번, 내가 실행합니다 frmRegularUse 양식으로 이동

LoginForm = Me 
frmRegularUse.ShowDialog() 

:

RegularForm = Me 
frmPasswordForm.ShowDialog() 

을 그리고 그래서 ...
나는 약간의 테스트를했고 꽤 괜찮습니다. 내일 나는 그것을 조금 더 세련되게하려고 노력할 것이다. ;-)