0

プログラムで異なるフォームを切り替えようとすると、常に例外が発生します。多分あなたは私がこの問題を解決するのを手伝ってくれるでしょう. 例外メッセージは次のとおりです。

別のスレッドで作成されたコントロールと対話するには、Control.Invoke を使用する必要があります。

フォームを非常に優れた変数にアタッチしましたが、MyForm.Show() などのコマンドを使用しようとすると、この問題が発生します。

フォームが変数に関連付けられていない場合は発生しませんが、テキストボックスなどを更新する際に大きな問題が発生します。

ご連絡をお待ちしております。


編集;

私は4つの異なるフォームを持っています。メイン モジュールとメイン フォームをロードすると、Sub (...) Handles MyBase.Load で次のコードを実行します。

モジュール内:

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

主な形式:

RegularForm = Me
StartupForm = frmStartup
LoginForm = frmLogin
PasswordForm = frmPassword
SettingsForm = frmSettings

これは、フォームの更新を完全に制御するために私が考案したアプローチです。Windows CE 搭載 Motorola Scanner 用のプログラムです。たとえば、LoginForm に正しいパスワードを入力したときに、RegularForm に切り替えたいとします。RegularForm.Show() または RegularForm.ShowDialog または RegularForm.BringToFront() を使用しようとすると、例外が発生します。frmRegularUse.Show() でフォームを呼び出そうとすると、フォームを呼び出すことができますが、別のスレッドで作成されていると思われるため、制御を失います (キーボードから何かを入力しようとすると、応答はありません)。

4

2 に答える 2

1

フォームが別のスレッドで作成されているとは思えませんが、停止している場合は、戻って修正してください。すべてのフォームは、メインの GUI スレッドから作成およびアクセスする必要があります。第二に、フォームを「新しくした」とは思いません。次のようなものが必要です。

StartupForm = New frmStartup 
RegularForm = New frmRegularUse 
LoginForm = New frmLogin 
PasswordForm = New frmPassword 
SettingsForm = New frmSettings 
于 2011-09-27T13:08:01.563 に答える
0

実際、私がしたことは次のとおりです。
それでも、メインモジュールには同じコードがあります。

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

私はそれを可能な限り単純な方法で機能するように管理しました。例-ログインフォームを実行し、次のコードを実行します(簡単に説明します)。

LoginForm = Me
frmRegularUse.ShowDialog()

frmRegularUseフォームにジャンプします。ここで、もう一度、次のコマンドを実行します。

RegularForm = Me
frmPasswordForm.ShowDialog()

など...
いくつかのテストを行いましたが、問題なく動作します。明日はもう少し洗練されたものにしようと思います。;-)

于 2011-09-27T18:51:06.397 に答える