0

私のアプリケーションには、独自のカスタムファイルタイプがあります。エクスプローラーで開いているファイルからアプリケーションを起動したのか、アセンブリから開いたばかりなのかを検出するように設定しました。ファイルの1つをアプリケーションの外部から開くと、アプリケーションが正常に開き、ファイルがアプリケーションのテキストエディタに読み込まれることを除けば、すべてが正常に機能しています。唯一の問題を除いて、ファイルをテキストエディタに2回ロードします。理由がわかりません。誰かが光を当てることができますか?

コードは、フォームの読み込みとして機能するオーバーライドで呼び出されています。これは、スタートアップフォームが起動時に表示されないためです。ただし、通知アイコンが表示されているため、処理を実行したり、フォームを表示したりできます。このコードの一部を使用する他の唯一のスポットは、コンテキストメニューでメニュー項目をクリックしたときですが、openfiledialogが開き、ダイアログでファイルが開きます。

編集:サブに残りのコードを追加しました。

私は自分の問題の解決策を見つけました、私は修正で自分の質問に答えました。助けてくれた人には感謝しません。また、Hans Passantは、ここに表示されているオーバーライドコードの作成者であるため、感謝したいと思います。これにより、通知アイコンを表示したまま、スタートアップフォームを非表示のままにすることができます。

     Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)

    If Not Me.IsHandleCreated Then
        Me.CreateHandle()
        value = False
    End If
    MyBase.SetVisibleCore(value)
    If (Environment.GetCommandLineArgs.Length > 1) Then

        Dim s As String = Environment.GetCommandLineArgs(1)

        Using sr As New StreamReader(s)
            While Not sr.EndOfStream
                Dim item As New ListViewItem
                item.SubItems.Add(sr.ReadLine())
                ListView3.Items.Add(item)
            End While
        End Using
        For I = 0 To ListView3.Items.Count - 1
            ListView3.Items(I).Text = CStr(I)
        Next
    End If

答えは以下に見ることができます。

4

2 に答える 2

0

それはあなたの問題には役立ちませんが、少しリファクタリングし、2番目のループを回避することができます:

With ListView3.Items.Add(ListView3.Items.Count)
  .Subitems.Add(sr.ReadLine())
End With
于 2012-09-13T21:18:49.933 に答える
0

私は自分の問題の解決策を見つけました。私はそれが確かに2回発火したコードであることがわかりました。ほとんどの場合、オーバーライドを使用します。それでも100%確実ではありません。コードを1回だけ起動できるようにブール値を作成しました。今ではうまく機能しています。助けてくれた皆さん、ありがとうございました。

     Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
    Static blnExecuted As Boolean
    If Not Me.IsHandleCreated Then
        Me.CreateHandle()
        value = False
    End If
    MyBase.SetVisibleCore(value)
    If (Environment.GetCommandLineArgs.Length > 1) Then

        Dim s As String = Environment.GetCommandLineArgs(1)
        If blnExecuted = False Then
            blnExecuted = True
            Using sr As New StreamReader(s)
                While Not sr.EndOfStream
                    Dim item As New ListViewItem
                    item.SubItems.Add(sr.ReadLine())
                    ListView3.Items.Add(item)
                End While
            End Using
            For I = 0 To ListView3.Items.Count - 1
                ListView3.Items(I).Text = CStr(I)
            Next
        End If

    Else
        openscriptfunc()
    End If
于 2012-09-14T17:04:24.747 に答える