0

ここで私の間違いを見た人はいますか?

アプリでフォームがダイアログとして表示されているかどうかを認識できません。

Public Class Form1

  Private m As Form2

  Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
    Me.Text = DateTime.Now.ToLongTimeString & " " & IsAnyDialogShown()
  End Sub

  Public Function IsAnyDialogShown() As Boolean
    For Each f As Form In Me.OwnedForms
       If f.Owner Is Me Then
         Return True
       End If
    Next
  End Function

  Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    m = New Form2
    m.ShowDialog()
  End Sub

End Class
4

3 に答える 3

1

あなたが探しているのは、プロパティモーダルです。

フォームのモーダル プロパティが true かどうかを確認します (つまり、フォームが ShowDialog で表示されることを意味します)。

For Each f As Form In Me.OwnedForms 
   If  f.Modal=True Then 
     'your code here
   End If
Next

あなたの間違いのために(私は今それを試すビジュアルスタジオを持っていません)、あなたの IsAnyDialogShown() は常に true を返すようです:

For Each f As Form In Me.OwnedForms ' (So f belongs to Me)
   If f.Owner Is Me Then 'f.Owner is always me because you are seaching in forms that have as owner the Me form
     Return True
   End If
Next

少しお役に立てば幸いです。もっと何かできることがあれば教えて

だからあなたのコメントの後に。
これを試して:

        For Each frm as Form In Application.OpenForms
            If frm.Modal=True Then
            'do something 
            'Actually you should have only one form because only one can be in modal state
            end if
        Next
于 2012-11-12T14:10:45.837 に答える
0

ブール値であるフォームの Visible プロパティを確認する必要があります。true の場合はフォームが表示され、それ以外の場合は非表示になります。

于 2012-11-12T13:26:34.087 に答える
0

それは私が所有するフォームを実行しているだけです。ダイアログフォームかどうかは関係ありません。つまり、通常のフォームを取得します。

また、これを期待どおりに動作させたい場合は、所有者を渡す場所でオーバーロードを使用する必要があります。

のようにm.ShowDialog(Me);

私が今までにやったことではありませんが、所有者が Me.OwnedForms の私ではない場合、私はお金を取り戻したいです。

于 2012-11-12T13:32:09.440 に答える