VB2005で2個のリストボックスから共通するテキストを削除するにはどうしたらいいのでしょうか?
Aのリストボックス Bのリストボックス
あいうえお たちつてと
さしすせそ はひふへほ
なにぬねの らりるれろ
かきくけこ あいうえお
まみむめも
このように入力されているとします
そしてAのリストボックスから「あいうえお」を選択して削除すると
Bのリストボックスからも「あいうえお」が削除されるようにしたいのですが
方法が分かりません
ちなみに自分が今作ってエラーになってしまうプログラムは
If ListBox1.Items.Count = 0 Then
MessageBox.Show("クリップボードの中身がありません", "通知")
ElseIf ListBox1.SelectedItem = Nothing Then
MessageBox.Show("文章が選択されていません", "通知")
Else
Dim c As Integer = 0
While ListBox2.Items.Count <> 0
If ListBox1.SelectedItem = ListBox2.Items(c) Then
ListBox2.Items.Remove(ListBox2.Items(c))
ListBox1.Items.Remove(ListBox1.SelectedItem)
i -= 1
Else
c += 1
End If
End While
End If
End Sub
このようになっています
自分がやっているつもりとしては
①Aのリストボックス1の選択しているテキストとBのリストボックスのc番目のテキストを比較
②同じだったらBのリストボックスのc番目のテキストとAのリストボックスの選択されているテキストを削除
③見つかったらiを-1
④見つからなかったらcを+1してBのリストボックス2の中身を再度比較
iはテキストをコピーまたは切り取りした時にAのテキストボックスにテキストを追加して+1しています
Aのリストボックスの要素数のつもりで使用しています
これで実行するとリストボックスに追加したテキストが1個の場合は両方から削除されますが2個以上テキストを追加するとエラーでプログラムが停止してしまいます
その際に
If ListBox1.SelectedItem = ListBox2.Items(c) Then
この部分でエラーが発生します
エラー詳細は
'2' の InvalidArgument=Value は 'index' に対して有効ではありません。
パラメータ名: index
となります
'2' の数字はリストボックスに追加したテキストの数によって変わります
どうにもお手上げの状態なのでどなたか分かる方はお願いしますm(_ _)m
ステップ実行すればエラー原因は簡単に見つかると思いますが……。
ループから抜ける条件を満たすのはどういうときか,考えてみてください。
YuOさん回答ありがとうございます
ループ条件は
Aのリストボックスの選択されているテキストとBのリストボックスの
テキストが同じじゃない間
又は
Aのリストボックスの要素数をBのリストボックスが越えない間
だと思いますが
ListBox1.SelectedItem <> ListBox2.Items(c) Or c <= i
このようにしてみましたがダメでした
どうしたらいいのでしょうか?
上記のプログラムに" i -= 1"とありますが、プログラムを見た限り
何処にも"i"という変数が使われてませんよね。
なのに何故" i -= 1"という式がでてきたのかよくわからないのですが・・・。
> Aのリストボックスの選択されているテキストとBのリストボックスの
> テキストが同じじゃない間
> 又は
> Aのリストボックスの要素数をBのリストボックスが越えない間
これは最初に提示されたソースコード上のどこに記述されているのですか?
> どうしたらいいのでしょうか?
上記の「条件」を,正しく記述してください。
Riverさん
回答ありがとうございます
iはグローバル関数?ではじめに定義していて
コピー又は切り取りをしたときに+1するようにしています
定義した部分はこのソースには載せてませんでした^^;
Yu0さん
回答ありがとうございました
最初に提示されたソースコード上には記述していません
>ListBox1.SelectedItem <> ListBox2.Items(c) Or c <= i
>このようにしてみましたがダメでした
この部分でYu0さんのコメントを見てから
訂正したと伝えたつもりだったのですが^^;
>上記の「条件」を,正しく記述してください。
上にも記述したとおり
ListBox1.SelectedItem <> ListBox2.Items(c) Or c <= i
だと思って試してみましたが分からなかったので再度お聞きしたのです^^;
>伝えたつもりだったのですが^^;
つもりがあっても実際に伝わってなきゃ意味が無いのですが^^;
>ダメでした
どう「ダメ」だったのか書いてもらえますか^^;
ところでWhileでループ回してるのには何か意味あるの?
指定した値消したいならIndexOfとか使えばよいのでは?
まろさん
回答ありがとうございます
>つもりがあっても実際に伝わってなきゃ意味が無いのですが^^;
そうですね^^;
次回からもう少し鮮明に書くように心がけます^^;
>どう「ダメ」だったのか書いてもらえますか^^;
はじめと同じように'2' の InvalidArgument=Value は 'index' に対して有効ではありません。
パラメータ名: index
というエラーが出ます
>ところでWhileでループ回してるのには何か意味あるの?
>指定した値消したいならIndexOfとか使えばよいのでは?
自分のイメージとしてBのリストボックスを先頭から比較していって
見つけて削除するというものを最初に思いついたので
要素数を+1していってWhileで回してみようかなと^^;
そもそもIndexOfという関数すら知らなかったもので^^;
ちょっと調べてみてやってみます^^
調べてみたんですが分からなかったので教えて下さいm(_ _)m
書式
★.indexOf(◆,◇)
★=検索される文字
◆=検索文字
◇=検索開始位置
文例
pointer = "MacWinUNIX".indexOf("Mac",0)
pointer = document.title.indexOf("MZ",3)
上位オブジェクト
String
このような内容が記述されているサイトを見つけたんですが
これの★◆◇の部分をそれぞれどのように変えたらいいのか分かりません
適当に自分なりに考えて
Dim c As Integer = 0
Dim pointer As Integer
pointer = ListBox2.Items(c).IndexOf(ListBox1.SelectedItem)
If pointer = -1 Then
While pointer = -1 And c <= i
c += 1
pointer = ListBox2.Items(c).IndexOf(ListBox1.SelectedItem)
End While
End If
TextBox1.Text = pointer
このようなものを作ってみました
このプログラムではまだ削除はしていませんが
今何番目を選択しているのかを確認するために最後に
pointerをTextBox1にいれてるんですが
何個テキストを登録して確かめても
全部要素が0番目になってしまいます
お助けお願いします><
> このような内容が記述されているサイトを見つけたんですが
それは,
System.String.IndexOf
http://msdn.microsoft.com/ja-jp/library/system.string.indexof.aspx
の説明であって,今回問題になっている,
System.Windows.Forms.ComboBox.ObjectCollection.IndexOf
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.combobox.objectcollection.indexof.aspx
の説明ではありません。今回利用すべきは後者です。
ComboBox.ItemsのIndexOfメソッドを使ってください。
あと,プロジェクトオプションで
Option Explicit On
Option Strict On
を設定するようにしてください。
# 新規プロジェクトのデフォルト変更は,ツール - オプション - プロジェクトおよびソリューション - Visual Basic の既定値
YuOさん回答ありがとうございます
おそらく上級者のかたにしれみるとすばらしいアドバイスだと思うのですが
今の自分ではアドバイスしていただけてる内容の意味が理解できません><
少しだけソースを公開してもらえませんか?