tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルリストボックスの中身を次回起動時に受け継ぐ方法を教えて下さい
記事No8588
投稿日: 2009/01/16(Fri) 10:34
投稿者大樹
OSの種類:Windous Vista 
VBのバージョン:VB2005
使用しているアプリケーション:Visual Studio 2005

初投稿になります。現在インターネットブラウザを作成しています。
そこでワードなどでよくある【定型文】の機能を作っています。
自分の作成したものはテキストボックスに文章を入力して
登録ButtonでListboxに追加する仕様にしています。
そしてその定型文のウィンドウを閉じて再度開いたときに
以前に登録した文章が残るようにしたいのですが方法が分かりません。

出来れば一度プログラムを終了させてもう一度起動したときにも残したいのですが
最低限ウィンドウを閉じて開いたときには残したいです。

ちなみに定型文のウィンドウは
ブラウザのウィンドウとは別で開いています。


一応コードを載せておきます。


Public Class template

    Private Sub _登録_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _登録.Click
  

        If _入力box.Text = "" Then

            MessageBox.Show("文章を入力して下さい", "通知")
        Else
            ListBox1.Items.Add(_入力box.Text)

        End If

        ListBox1.Sorted = True
        _入力box.Text = ""

    End Sub

ウィンドウを閉じるときはMe.Hide()を使っています。


過去ログで「リストボックス」で検索してみましたが
同じようなものはなかったと思いますので質問させていただきました。

みなさんよろしくお願いします。


※投稿内容に不足している部分などありましたら申し訳ございません。
ご指摘いただければ随時載せていきます。

[ツリー表示へ]
タイトルRe: リストボックスの中身を次回起動時に受け継ぐ方法を教えて下さい
記事No8589
投稿日: 2009/01/16(Fri) 13:13
投稿者YuO
> 登録ButtonでListboxに追加する仕様にしています。
> そしてその定型文のウィンドウを閉じて再度開いたときに
> 以前に登録した文章が残るようにしたいのですが方法が分かりません。

・FormClosedイベントあたりでListBox.Itemsの中身をファイルに保存
・Loadイベントあたりでファイルの中身を読み取ってListBox.Itemsに追加


> ウィンドウを閉じるときはMe.Hide()を使っています。

それは閉じていません。
隠しているだけです。

閉じるには,Closeメソッドを使います。

[ツリー表示へ]
タイトルRe^2: リストボックスの中身を次回起動時に受け継ぐ方法を教えて下さい
記事No8596
投稿日: 2009/01/17(Sat) 15:16
投稿者大樹
YuOさん回答ありがとうございます
一応やりたいことが出来るようなプログラムを完成させることが出来ました
意味あるものになるようにコードを載せておきます
更なる改善点などありましたらご指摘いただけると幸いです

'文章を登録する&テキストファイルに書き込み

   Private Sub _登録_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _登録.Click

        Dim i As Integer = ListBox1.Items.Count + 1

        Dim ken As Integer = ListBox1.FindStringExact(_入力box.Text)

        If _入力box.Text = "" Then

            MessageBox.Show("文章を入力して下さい", "通知")

        ElseIf ken = ListBox.NoMatches Then
            ListBox1.Items.Add(_入力box.Text)

            Dim sw As New System.IO.StreamWriter("templatecount.txt", False, System.Text.Encoding.GetEncoding(932))
            sw.WriteLine(i)
            sw.Close()
            Dim sw2 As New System.IO.StreamWriter("template.txt", False, System.Text.Encoding.GetEncoding(932))
            Dim k As Integer
            For k = 0 To i - 1
                sw2.WriteLine(ListBox1.Items(k).ToString)
            Next k
            sw2.Close()
        Else
            MsgBox("すでに登録されています")
        End If

        ListBox1.Sorted = True
        _入力box.Text = ""


    End Sub


'再度起動時にテキストファイルからの読み込み

Private Sub template_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim cou As Integer
        Dim sr2 As New System.IO.StreamReader("templatecount.txt", System.Text.Encoding.GetEncoding(932))
        cou = (sr2.ReadLine())
        sr2.Close()

        Dim sr As New System.IO.StreamReader("template.txt", System.Text.Encoding.GetEncoding(932))
        Dim j As Integer
        For j = 0 To cou - 1
            ListBox1.Items.Add(sr.ReadLine())
        Next j
        sr.Close()

    End Sub


> ・FormClosedイベントあたりでListBox.Itemsの中身をファイルに保存
> ・Loadイベントあたりでファイルの中身を読み取ってListBox.Itemsに追加

登録Buttonをクリックしたときに同時にテキストファイルに書き込むようにしてみました


> 閉じるには,Closeメソッドを使います。
そうでしたね^^;
Closeメソッドに変更しておきました。

ちなみにCloseとHideではどんな違いが起こるんでしょうか?
Closeして開いた場合とHideした場合で何か変わったりするのでしょうか?

[ツリー表示へ]
タイトルRe^3: リストボックスの中身を次回起動時に受け継ぐ方法を教えて下さい
記事No8597
投稿日: 2009/01/17(Sat) 15:36
投稿者るしぇ
> 更なる改善点などありましたらご指摘いただけると幸いです
上記の保存内容であれば templatecount.txt は必要ないです。
逆に template.txt を手作業で修正した時に不具合が出やすくなります。

また、個人で使用するなら問題ないでしょうが、管理者権限のないユーザが
インストールして使う場合、ファイルの作成場所も考慮すべきでしょう。

> ちなみにCloseとHideではどんな違いが起こるんでしょうか?
> Closeして開いた場合とHideした場合で何か変わったりするのでしょうか?
Hide で非表示にするだけだと、

コンストラクタや Load は実行されませんのでイベントは起こりません。
コントロールの設定は非表示にした時のままですから、TextBox に入力して
いた文字は再表示した際にも残っています。Load イベントで ListBox
を設定するようなプログラムの場合、実行されません。

Close が切っ掛けで実行される処理(Dispose など)が実行されません。
非表示なだけで、プログラム的には画面を表示しているのと変わりません。
全ての画面が非表示になれば、ユーザがプログラムを終了できなくなります。

[ツリー表示へ]
タイトルRe^4: リストボックスの中身を次回起動時に受け継ぐ方法を教えて下さい
記事No8598
投稿日: 2009/01/17(Sat) 15:56
投稿者大樹
るしぇさん回答ありがとうございます

> 上記の保存内容であれば templatecount.txt は必要ないね。
> 逆に template.txt を手作業で修正した時に不具合が出やすくなります。

なるほど。手作業で修正したときのことまでは考えていませんでした。

仮にtemplatecount.txtを削除した場合
どのようにしてListboxの個数の状況や
削除した場合にそれをtemplate.txtから削除すればいいのでしょうか?

またLoad時にtemplate.txtから読み込むときにも
templatecountで判断して1行ずつ読み込んでいるのですが
それをどのように改善したらいいのか教えて頂けたら幸いです。


> 全ての画面が非表示になれば、ユーザがプログラムを終了できなくなります。

そういえば以前この状況になってしまったことがありました。
他にもDioposeなど使えない処理もあるんですね。
勉強になりました。ありがとうございます。

[ツリー表示へ]
タイトルRe^5: リストボックスの中身を次回起動時に受け継ぐ方法を教えて下さい
記事No8599
投稿日: 2009/01/17(Sat) 16:17
投稿者るしぇ
色々と追記して申し訳ない^^;思いつきで書き込みしてるから。。。

> 削除した場合にそれをtemplate.txtから削除すればいいのでしょうか?
提示されたコードに、一部削除のコードなど書かれていないと思いますが?
ListBox1.Items 全部保存の処理に削除したかどうかなんて情報が必要です???
> Dim i As Integer = ListBox1.Items.Count + 1
> ・・・
> For k = 0 To i - 1
これって結局、追加後の
 For k = 0 To ListBox1.Items.Count - 1
でしょ?(変数 i も必要ありません。)
もともと、テキストファイルは全部消去・全部書き込みか、追記が基本です。
このままでいいと思います。ListBox1.Items を全部書き込むだけで、途中経過
(削除されたかどうか)を気にする必要はありません。

読み込み時もデータがあるだけ読み込めばいいのでしょう?
ヘルプ(MSDN)を確認してください。
[StreamReader.ReadLine メソッド]
http://msdn.microsoft.com/ja-jp/library/system.io.streamreader.readline(VS.80).aspx
Peek で終端(EOF)を判断するか、
[方法 : ファイルからテキストを読み取る]
http://msdn.microsoft.com/ja-jp/library/db5x7c0d(VS.80).aspx
読み込んだデータが Nothing であるかどうかで判断できるようです。

[ツリー表示へ]
タイトルRe^6: リストボックスの中身を次回起動時に受け継ぐ方法を教えて下さい
記事No8608
投稿日: 2009/01/19(Mon) 14:15
投稿者大樹
るしぇさん

回答ありがとうござます。
並びに返信が遅れてしまいましてすいません。

> 色々と追記して申し訳ない^^;思いつきで書き込みしてるから。。。

いえいえ、沢山の意見が頂けて光栄です^^

> 提示されたコードに、一部削除のコードなど書かれていないと思いますが?

すいません削除のプログラムは載せてませんでしたね^^;

Private Sub _削除_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _削除.Click

        If ListBox1.Items.Count = 0 Then

            MessageBox.Show("定型文が登録されていません", "通知")

        ElseIf ListBox1.SelectedItem = Nothing Then

            MessageBox.Show("定型文が選択されていません", "通知")

        Else

            ListBox1.Items.Remove(ListBox1.SelectedItem)
            Dim k As Integer = ListBox1.Items.Count
            Dim sw As New System.IO.StreamWriter("templatecount.txt", False, System.Text.Encoding.GetEncoding(932))
            sw.WriteLine(k)
            sw.Close()

            Dim sw2 As New System.IO.StreamWriter("template.txt", False, System.Text.Encoding.GetEncoding(932))
            Dim i As Integer
            For i = 0 To k - 1
                sw2.WriteLine(ListBox1.Items(i).ToString)
            Next i
            sw2.Close()

        End If

        _出力box.Text = ""

    End Sub



> これって結局、追加後の
>  For k = 0 To ListBox1.Items.Count - 1
> でしょ?(変数 i も必要ありません。)

そうだったんですか><
でゎその部分はiを削除してListbox1.Items.Countでやってみようと思います。

> もともと、テキストファイルは全部消去・全部書き込みか、追記が基本です。
> このままでいいと思います。ListBox1.Items を全部書き込むだけで、途中経過
> (削除されたかどうか)を気にする必要はありません。

すいません語弊があったようです><
削除されたかどうかの途中経過を求めていたのではないです^^;
templatecountの数字でfor文を回していたので
templatecountがなくなった場合にどのように
終わりを決めたらいいのかってことを伝えたかった訳です^^;

> 読み込み時もデータがあるだけ読み込めばいいのでしょう?
> ヘルプ(MSDN)を確認してください。

ありがとうございます。
ヘルプを参照させてもらいます^^

[ツリー表示へ]