1

このフォームのレンダリングの長い遅延を回避する方法について何か提案はありますか?

「お待ちください、ダウンロードしてください」というラベルの付いたユーザーフォームがあり、他のコントロールはありません。ユーザーがデータのダウンロードを要求すると(非同期API要求)、キーボード入力をオフにして、「お待ちください」フォームを表示します。データを処理するコールバックは、キーボード入力を再度有効にし、フォームを非表示にします。チャームのように機能します。

最初は空白の白い長方形としてポップアップし、その後ペイントに数秒(最大5秒)かかることを除いて。私の他のユーザーフォーム(モーダル、データ入力用)はすぐにペイントされ、白で始まることに気づきさえしませんでした。

非同期データリクエストを行う前にフォームを表示する方法は次のとおりです。

' Deactivate the keyboard.
Application.OnKey "^d", "KeyboardOn"
Application.DataEntryMode = True

' Display the splash form non-modally.
ssiWaitDialog.TaskDone = False
ssiWaitDialog.Show False

コールバックで削除される方法は次のとおりです。

' Close the splash form.
ssiWaitDialog.TaskDone = True
ssiWaitDialog.Hide

' Re-activate the keyboard.
Application.DataEntryMode = False

フォームコードは次のとおりです。

' Set true when the long task is done.
Public TaskDone As Boolean

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Cancel = Not TaskDone
End Sub

問題のあるフォームのプロパティ値は、他のフォームmodal = falseと大きく異なるだけで、カーソルを砂時計に設定しました。それほど重要ではない違いは、高さ/幅とラベルのフォントサイズです。

4

1 に答える 1

2

show メソッド呼び出しの後に「DoEvents」を追加すると、問題が修正されました。ショー フォームのコードがどのように読み取られるかを次に示します。

' Deactivate the keyboard.
Application.OnKey "^d", "KeyboardOn"
Application.DataEntryMode = True

' Display the splash form non-modally.
ssiWaitDialog.TaskDone = False
ssiWaitDialog.Show False
DoEvents
于 2012-09-24T19:27:15.667 に答える