■ 登録した情報をMenuStripに追加するには?

[Visual Basic 初心者掲示板] [過去ログの一覧]


ぺんぺん 2008/02/03(日) 21:30:06 <初心者>
VB2008で作成しています。

IDとPASSを管理する『ロボフォーム』のようなものを製作しようとしています。

登録した情報をMenuStripに追加していきたいのですが、理由は階層になっているのでTreeViewより見やすいとおもったからです。

仕様はURLやID/PASSを登録しておいて、MenuStripより選びIEが立ち上がりといった感じです。

データーを読み込んでMenuStripに追加していきたいのですが
どのような保存形式にしたらよいですか?
もともとPHPなどをしていましたので、CSVやDAT形式のファイルを追加していってデーター蓄積を使用かとおもっています。

それともMenuStripを仕様することは間違っていますか?

我龍院 2008/02/04(月) 11:50:04
MenuStripの良いところはショートカットキーが簡単に使える
ところですが、件数が多くなると動作が遅くなったり、不安定に
なる気がします。あくまでも「気」ですが。
あまりトリッキーなことは止めて、やはりここはTreeViewerでは。
保存方法は迷わず、XMLによるシリアライズでしょう。

ぺんぺん 2008/02/04(月) 12:34:05 <初心者>
なるほどぉ〜。
From自体はデスクトップのアイコンくらいの大きさでマウスを持ってった時にMenuStripだとFormの外に飛び出してくれるので邪魔にならないアプリが出来ると考えていました。


MenuStripのToolStripMenuItemをCSVから読み込んで表示するようなことはできませんでしょうか?

保存形式はXMLでもCSVでも良いのですが、CSVの方がファイルが軽くてすむので読み込みもCSVの方が早いと思ってたのですが・・・チガウノカナ。。。

我龍院 2008/02/04(月) 14:01:19
>MenuStripのToolStripMenuItemをCSVから読み込んで表示するようなことはできませんでしょうか?
出来んことは無いでしょう、ただCSV形式には階層という概念がありませんから、自分で
ゴリゴリ作ることになりますね。

>CSVの方がファイルが軽くてすむので読み込みもCSVの方が早いと思ってたのですが...
完全に誤差の範囲ですね。

データーが大量にある場合は、固定長が早いと思いますが、かなり非力なマシンでも
数十メガバイト以上無いと差が出ないでしょう。

ぺんぺん 2008/02/04(月) 15:08:00
確かにCSV形式には階層という概念がないためゴリゴリになるかもですねぇ〜

例えばれすが。
test.csv
名前,年齢,都道府県,
penko,22,osaka,
penta,23,tokyo,
penpen,21,kyoto,

この名前だけをToolStripMenuItemに入れていってクリックした場合
例えばtextboxにpenko,22,osaka,と表示するようなスクリプトいただけませんか?

我龍院  2008/02/04(月) 16:46:22
スクリプトと言ったって.....(^^;   

    public partial class Form1 : Form
    {
        ArrayList myAL = new ArrayList();
        public Form1()
        {
            InitializeComponent();

            using (StreamReader sr = new StreamReader("C:\\Test.csv"))
            {
                String line;
                int i = 0 ;
                while ((line = sr.ReadLine()) != null)
                {
                    if (i != 0) //一行目パス
                    {
                        myAL.Add (line);
                        string[] sData = line.Split(',');
                        menuStrip1.Items.Add(sData[0]);
                    }
                    i++;
                }
            }
        }

        private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            for (int i = 0; i < myAL.Count ; i++)
            {
                string[] sData = ((string)myAL[i]).Split(',');
                if (sData[0] == e.ClickedItem.ToString())
                {
                    textBox1.Text = (string)myAL[i];
                    return;
                }
            }
        }
    }

ぺんぺん 2008/02/04(月) 17:01:04
↑VC#じゃないですか?

VB2008なんですけども・・・

我龍院 2008/02/04(月) 17:17:52
あああ・・・ 間違った!
Imports System.io
Public Class Form1
    Dim myAl As New ArrayList
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim sr As StreamReader = New StreamReader("c:\Test.csv")
        Dim line As String
        Dim i As Integer = 0
        Do
            line = sr.ReadLine()
            If i <> 0 And line <> "" Then  '一行目パス
                myAl.Add(line)

                Dim sData() As String = line.Split(",")
                MenuStrip1.Items.Add(sData(0))
            End If
            i += 1
        Loop Until (line Is Nothing)
        sr.Close()
    End Sub

    Private Sub MenuStrip1_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles MenuStrip1.ItemClicked
        For i As Integer = 0 To myAL.Count - 1
            Dim sData() As String = myAl(i).Split(",")
            If sData(0) = e.ClickedItem.ToString() Then
                TextBox1.Text = DirectCast(myAl(i), String)
                Return
            End If
        Next
    End Sub
End Class

多分これで。

ぺんぺん 2008/02/04(月) 17:55:32
e.ClickedItem.

でエラが・・・・

我龍院 2008/02/04(月) 18:11:10
どんなエラーが出るの?
VB2005しか無いんで、VB2008って正式発売は2月8日だったっけ。

Split(",")はSplit(CChar(",")これの方が良いかも。

ぺんぺん 2008/02/04(月) 18:26:23
e.ClickedItemはSystemEventArgeのメンバーではありません。

と青い波下線が表示されます。

g他流院 2008/02/04(月) 18:34:29
MenuStripは貼り付けてるよね。

我龍院 2008/02/04(月) 18:36:09
今度は自分のHN間違った。

ぺんぺん 2008/02/04(月) 18:43:39
埋め込むところ間違ってましたw
動いたのですが・・・・

まず、文字化けと。

横一列に表示されるのと・・・

『希望』
[penpen]
[penko]
[penta]

『現状』
[penpenpenkopenta]←文字化け。


何度もすいませんw

我龍院 2008/02/05(火) 08:48:21
昨日は最悪でした、雪は降るし、頭は痛いし...(^^;
この件早く済ましてしまいましょう。

文字化けはあなたがtextファイルをUnicodeで保存していないからです。
メモ帳で保存するとき、「文字コード」でUnicodeを指定してください。

フォームにMenuStripとTextBoxを貼り付けて、MenuStripの一番上のレベルに
「Name」と入れて下さい。
一応ArryListはジェネリクスにしました。
ファイルの処理はUsingを使いました。
何か問題が有ったら後はご自分で....

Option Strict On
Imports System.io
Public Class Form1
    Dim myAl As New System.Collections.Generic.List(Of String)
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                          Handles MyBase.Load
        Using sr As StreamReader = New StreamReader("c:\Test.csv")
            Dim line As String
            Dim i As Integer = 0
            Do
                line = sr.ReadLine()
                If line = "" Then
                    Exit Do
                End If
                Dim sData() As String = line.Split(CChar(","))
                If i = 0 Then
                    Me.NameToolStripMenuItem.Text = sData(0)
                Else
                    myAl.Add(line)
                    Me.NameToolStripMenuItem.DropDownItems.Add(sData(0))
                End If
                i += 1
            Loop Until (line Is Nothing)
        End Using
    End Sub
    Private Sub NameToolStripMenuItem_DropDownItemClicked _
                (ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) _
                Handles NameToolStripMenuItem.DropDownItemClicked
        For i As Integer = 0 To myAl.Count - 1
            Dim sData() As String = myAl(i).Split(CChar(","))
            If sData(0) = e.ClickedItem.ToString() Then
                TextBox1.Text = DirectCast(myAl(i), String)
                Return
            End If
        Next
    End Sub
End Class

我龍院  2008/02/05(火) 08:58:12
ジェネリクスにしたんで、キャストな必要ないですね。
× TextBox1.Text = DirectCast(myAl(i), String)
○  TextBox1.Text = myAl(i)

Meが付いたり付かなかったりしてるけど無視してね。

ぺんぺん 2008/02/05(火) 16:07:41 <初心者>
ほんとに沢山ありがとうございましたw
我龍院 様には感謝感激でございます。

これからもよろしくお願いします。

ぺんぺん(ダメナ子) 2008/02/05(火) 18:36:29 <初心者>
あぁぁぁぁぁ、だめだぁ。
私、ダメな子です。。。

ループで追加されたToolStripMenuItemをクリックして、データーTEXTBOXに表示したいんですが、MenuStrip1はPrivate SubあるからプログラムかけますがToolStripMenuItemのPrivate Subがないのでどうやってかいたらいのでしょう???

ちなみにこのテの事は市販されている辞書に書いてないです、みなさん、どこでしらべてるんですか?

さるべーじ [E-Mail] [HomePage] 2008/02/05(火) 19:26:22
このへんが参考になるかと思います。

方法 : ToolStrip の項目を動的に追加する
http://msdn2.microsoft.com/ja-jp/library/ms229625.aspx

ポイントは AddHandler 、AddressOf のあたりです。

> みなさん、どこでしらべてるんですか?

例えば今回のケースであれば、「ToolStripMenuItem 動的追加」で検索すると、
割と簡単に出てきます。

ですので、この状況を「動的追加」と呼ぶということを知っているかどうかが
ポイントになるんですね。

プログラミングに使う専門用語を多く、正確に知れば知るほど探しやすくなりますし、
どんなことができそうで何が無理そうかの勘も働くようになってきます。

そのためには、とにかく多く「読む」ことをお勧めします。

まずはVBに付属しているヘルプや、上記リンク先のmsdnオンラインから。
目次を全部開いておもしろそうなところは全部読むくらいな勢いで。

これだけでもノウハウの宝庫ですよ。

ぺんぺん(ダメナ子×2) 2008/02/05(火) 21:56:18 <初心者>
さるべーじ様ありがとうございます、いろいろ見てました。
むずかしですねぇ、順番に紐解いていくしかないようです・・・

oolStripMenuItemを選択してTEXTBOXに内容表示するにはどこに動書けば良いのかまだ、わかりません・・・

さるべーじ [E-Mail] [HomePage] 2008/02/05(火) 23:17:06
あれ、我龍院さんのコードをよく見ると、

「ToolStripMenuItemをクリックして、データをTextBoxに表示させる」

ところまでちゃんと書いてありますね。

NameToolStripMenuItem_DropDownItemClickedイベントの中で、

  (1) クリックされた項目を「e.ClickedItem.ToString」で特定し、
  (2) 同じ頭を持つデータをmyAlから探し出して、
  (3) TextBox1.Textに格納しています。

これなら無理にToolStripMenuItemそのもののイベントは要りませんよ。

一度、提示いただいたコードをそのまま実行して、動作を確認してみてはいかがでしょうか。

さるべーじ [E-Mail] [HomePage] 2008/02/05(火) 23:28:43
あれ、なんかまだおかしいな。

> ToolStripMenuItemのPrivate Subがない

という部分で行き詰っているんでしょうか。

> フォームにMenuStripとTextBoxを貼り付けて、
> MenuStripの一番上のレベルに「Name」と入れて下さい。

ということですので、Formはこんな感じになるはずです。

http://salv.miscnotes.com/2008/02/20080205_01.png

コードを書く前にMenuStripに「Name」と入力しておくと、
NameToolStripMenuItemができますので、
「Private Sub NameToolStripMenuItem_DropDownItemClicked」が
記述できるようになると思うんですが。

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library