アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在独学でhttp://www4.plala.or.jp/tamo/vb/vb99.htmlの問題の10番を解いてるのですが、どうしてもうまくいきません。
左のリストボックスから右のリストボックスへの1つ1つのアイテム移動はできたのですが、アイテムを複数同時に選択すると違うアイテムが移動したりすべてのアイテムが移動してしまいます。
今のコードは
Private Sub Command1_Click()

For i = List1.ListCount To 1 Step -1
If List1.Selected(i - 1) = True Then
List2.AddItem List1.Text
List1.RemoveItem List1.ListIndex
End If
Next

End Sub

Private Sub Form_Load()

With List1
.AddItem "FreeBSD"
.AddItem "Linux"
.AddItem "Macintosh"
.AddItem "MS-DOS"
.AddItem "Slaris"
.AddItem "Windows 95"
.AddItem "Windows CE"
.AddItem "Windows NT"
End With

End Sub
このように指定しています。
解決法がありましたら教えてください。

A 回答 (2件)

VB6で開発なのでしょうか?


# 開発環境の情報も質問に盛り込みましょう
であるなら リストボックスのItemDataを使って順序の制御をすることになりそうです

登録時に
Private Sub Form_Load()
With List1
  .AddItem "FreeBSD"
  .AddItem "Linux"
  .AddItem "Macintosh"
  .AddItem "MS-DOS"
  .AddItem "Slaris"
  .AddItem "Windows 95"
  .AddItem "Windows CE"
  .AddItem "Windows NT"
  for n = 0 to .ListCount-1
    .ItemData(n) = n
  next
End With
としておきます

リストの移動時に
Private Sub Command1_Click()
  dim m as Integer
  m = 0
  For i = List1.ListCount - 1 to 0 step - 1
    If List1.Selected(i) = True Then
      if list2.ListCount > 0 then
        for m = 0 to List2.ListCount-1
          ' ここで ItemData比較する
          if list2.itemData(m) > list1.ItemData(i) then
            exit for
          end if
        next
      end if
      ' 挿入位置が mに求められている
      list2.additem List1.List(i), m
      list2.ItemData(m) = List1.ItemData(i)
      List1.RemoveItem i
    End If
  next
End Sub
といった具合でしょう
VB.NET2002以降の場合は別途対応が必要です
    • good
    • 1
この回答へのお礼

失礼しました
開発環境はVB6.0になります
redfox63さんのおかげで無事動作しました
本当にありがとうございました

お礼日時:2009/04/25 10:51

ListBoxのListコレクションは0ベースになります


つまり
"FreeBSD"   ... 0
"Linux"    ... 1
"Macintosh"  ... 2
"MS-DOS"   ... 3
"Slaris"   ... 4
"Windows 95" ... 5
"Windows CE" ... 6
"Windows NT" ... 7
といった具合になります

List1からList2へ移すのは
List2.AddItem List1.List( i - 1 )

List1から移動した項目を削除するのは
List1.RemoveItem i - 1
といった具合です

毎回 i-1 を引数に与えるより

for i = List1.ListCount - 1 to 0 Step -1
  if List1.Selected( i ) then
    List2.AddItem List1.List(i)
    List1.RemoveItem i
  end if
next
とすることもあります
    • good
    • 1
この回答へのお礼

なるほど。
おかげでうまく動作させることができました!
しかし右のリストにアイテムが移動した時に左のリストの並びとの上下が逆になってしまうのですが、これはどう対応したらよろしいのでしょうか・・・

お礼日時:2009/04/24 23:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!