DOBON.NET DOBON.NETプログラミング掲示板過去ログ

リストボックスの自動スクロール

環境/言語:[Windowsxp]
分類:[.NET]

リストボックスの自動スクロールについて

リストボックスに処理結果を表示しているのですが最下位の行が一々スクロールさせないと見えませんが、これを自動的に上にスクロールさせる方法はないでしょうか?。
どなたかお分かりの方、よろしくご教授お願いします。
SelectedIndex を変更したらスクロールしませんか?
■No7635に返信(深山さんの記事)
>  SelectedIndex を変更したらスクロールしませんか?

深山 様
ご返事有難うございます。
SelectedIndex を変更と云うことですが、HELPでも調べてみましたがよく意味が分かりません、どのようなコードを記述すればいいのでしょうか。
リストボックスのプロパティにもありませんし・・・
まだまだ初心者で申し訳ありませんが、もう少し詳しく教えていただけませんか?
プロパティにないって‥‥もしかしてデザイン画面しかご覧になってません?(^_^;)
#でもヘルプを見たというのは謎かも。プロパティと書いてありませんでした?


> まだまだ初心者で申し訳ありませんが、もう少し詳しく教えていただけませんか?

 こういう言い方をするとさぞ意地が悪いと思われることでしょうが‥‥

 もう少し詳しくというのはどの程度でしょうか?
#もしヘルプに記載されている以上の説明を期待されているなら、それには応えられないでしょう。<少なくとも私は

 開発言語も判りませんし、『初心者』という一言だけでは貴方のスキルを推し量ることもままなりません。
> よく意味が分かりません
などと仰られても、一体何がどう解らなかったのか判断しかねます。

 『実際に○○というコードを書いてみたけど××というエラーになった』とか
 『△△という動作を期待してたけど□□という結果になった』とか
いうことでしたら、アドバイスのしようもあるかも知れませんが。



 取り敢えず−無駄になるかも知れませんけど−簡単なサンプルを下記します。
# VB.NET 新規 Windows アプリ、デザイン画面で ListBox コントロールと Timer コントロールを配置しておきます。

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.ListBox1.Items.Clear()
        Dim i As Integer
        For i = 0 To 99
            Me.ListBox1.Items.Add(i.ToString("00"))
        Next
        Me.Timer1.Interval = 50
        Me.Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim nextIndex As Integer = Me.ListBox1.SelectedIndex + 1
        If nextIndex = Me.ListBox1.Items.Count Then nextIndex = 0
        Me.ListBox1.SelectedIndex = nextIndex
    End Sub
■No7652に返信(深山さんの記事)
>  プロパティにないって‥‥もしかしてデザイン画面しかご覧になってません?(^_^;)
> #でもヘルプを見たというのは謎かも。プロパティと書いてありませんでした?
>
>
>>まだまだ初心者で申し訳ありませんが、もう少し詳しく教えていただけませんか?
>
>  こういう言い方をするとさぞ意地が悪いと思われることでしょうが‥‥
>
>  もう少し詳しくというのはどの程度でしょうか?
> #もしヘルプに記載されている以上の説明を期待されているなら、それには応えられないでしょう。<少なくとも私は
>
>  開発言語も判りませんし、『初心者』という一言だけでは貴方のスキルを推し量ることもままなりません。
>>よく意味が分かりません
> などと仰られても、一体何がどう解らなかったのか判断しかねます。
>
>  『実際に○○というコードを書いてみたけど××というエラーになった』とか
>  『△△という動作を期待してたけど□□という結果になった』とか
> いうことでしたら、アドバイスのしようもあるかも知れませんが。
>
>
>
>  取り敢えず−無駄になるかも知れませんけど−簡単なサンプルを下記します。
> # VB.NET 新規 Windows アプリ、デザイン画面で ListBox コントロールと Timer コントロールを配置しておきます。
>
> Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
> Me.ListBox1.Items.Clear()
> Dim i As Integer
> For i = 0 To 99
> Me.ListBox1.Items.Add(i.ToString("00"))
> Next
> Me.Timer1.Interval = 50
> Me.Timer1.Start()
> End Sub
>
> Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
> Dim nextIndex As Integer = Me.ListBox1.SelectedIndex + 1
> If nextIndex = Me.ListBox1.Items.Count Then nextIndex = 0
> Me.ListBox1.SelectedIndex = nextIndex
> End Sub
>

ありがとうございます。
大変参考になり突破口が開きました
何とかロジックが少し分かりかけました。

'--- 自動スクロール-----------------

ListBox1.Items.Add(data)
nextIndex = ListBox1.SelectedIndex + 1
' If nextIndex = ListBox1.Items.Count Then nextIndex = 0
If nextIndex = 200 Then
' ListBox1.Items.Clear() ----ERR !! ----
nextIndex = 0

End If
ListBox1.SelectedIndex = nextIndex

ここまではできたのですが、TOP行への折り返しでリストボックスを一旦クリアしたいのですが ListBox1.Items.Clear() を実行すると
指定された引数は有効な値の範囲内にありません。
パラメータ名:0は Vaiueに有効な値ではありません。
とのエラーがでます。
エラーが出ても表示は正常に行われているのですが・・・
度々恐縮ですがアドバイスお願いします。
> ここまではできたのですが、TOP行への折り返しでリストボックスを一旦クリアしたいのですが ListBox1.Items.Clear() を実行すると
> 指定された引数は有効な値の範囲内にありません。
> パラメータ名:0は Vaiueに有効な値ではありません。
> とのエラーがでます。

 少し誤解されているような気がします。
 エラーの直接の原因は Clear ではなく、その後に SelectedIndex = 0 としてしまっていることです。

 一番上の項目を選択するときは SelectedIndex プロパティに 0 を設定します(二番目の項目を選択するときは 1 です)。けれども Clear すると項目自体がなくなりますよね?
 だから『 0 は有効な値ではない』と言われてしまうわけです。

‥‥って、ここまで書いて気付いたのですけど、デバッグされてないのでは?(汗)
 プログラムを修正してすぐに(実行ファイルから)実行してたら、不具合の原因特定が困難になりますよ。
#それでも例外発生時に表示されるダイアログで『詳細』を見て頂ければ set_SelectedIndex でエラーとなっているのが確認できると思いますが。



 以下余談です。
 Items.Add した後に 200 になっていたら Clear としてますけど、これだと最後に追加したものは直に消えてしまいませんか? エラーの件と併せて処理手順の見直しをされた方がよろしいかと。
#ものごっつ余計なお世話でしょうけど(^_^;)


 更に余談です。
 追加した項目を即選択したいのでしたら、次のように記述することもできます。
# Add メソッドは項目のインデックス番号を返します。

ListBox1.SelectedIndex = ListBox1.Items.Add(data)

ListBox.ObjectCollection.Add メソッド
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformslistboxobjectcollectionclassaddtopic.asp
■No7664に返信(深山さんの記事)
>>ここまではできたのですが、TOP行への折り返しでリストボックスを一旦クリアしたいのですが ListBox1.Items.Clear() を実行すると
>>指定された引数は有効な値の範囲内にありません。
>>パラメータ名:0は Vaiueに有効な値ではありません。
>>とのエラーがでます。
>
>  少し誤解されているような気がします。
>  エラーの直接の原因は Clear ではなく、その後に SelectedIndex = 0 としてしまっていることです。
>
>  一番上の項目を選択するときは SelectedIndex プロパティに 0 を設定します(二番目の項目を選択するときは 1 です)。けれども Clear すると項目自体がなくなりますよね?
>  だから『 0 は有効な値ではない』と言われてしまうわけです。
>
> ‥‥って、ここまで書いて気付いたのですけど、デバッグされてないのでは?(汗)
>  プログラムを修正してすぐに(実行ファイルから)実行してたら、不具合の原因特定が困難になりますよ。
> #それでも例外発生時に表示されるダイアログで『詳細』を見て頂ければ set_SelectedIndex でエラーとなっているのが確認できると思いますが。
>
>
>
>  以下余談です。
>  Items.Add した後に 200 になっていたら Clear としてますけど、これだと最後に追加したものは直に消えてしまいませんか? エラーの件と併せて処理手順の見直しをされた方がよろしいかと。
> #ものごっつ余計なお世話でしょうけど(^_^;)
>
>
>  更に余談です。
>  追加した項目を即選択したいのでしたら、次のように記述することもできます。
> # Add メソッドは項目のインデックス番号を返します。
>
> ListBox1.SelectedIndex = ListBox1.Items.Add(data)
>
> ListBox.ObjectCollection.Add メソッド
> http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformslistboxobjectcollectionclassaddtopic.asp

深山様
度々のご指導ありがとうございます。
まだまだ論理的におかしいとところあると思いますが
これである一定以上スクロールさせクリア→TOPより表示
ができました。
nextIndex = ListBox1.SelectedIndex + 1 だけでも
スクロールとしては出来てたのですが、
用途がセキュリティシステムの検知レヴェルを経過的に見るためのもので
PCがつけっぱなしになりますので、適当にクリアしてやらないと、何か
スタック?がどんどんたまってはと思いクリアしたかつたのです。

'--- 自動スクロール---(カメラの動体検知レベルメータ)----
ListBox1.Items.Add(StrDup(SabnRGB, "-"))
nextIndex = ListBox1.SelectedIndex + 1

If Sclor = 300 Then
ListBox1.Items.Clear()
Sclor = 1
ListBox1.Items.Add(StrDup(SabnRGB, "-"))
nextIndex = 0

End If
ListBox1.SelectedIndex = nextIndex
Sclor = Sclor + 1

なんか大そうなプログラムを作っている割には8ビット時代のBASICの知識
程度で苦労しています、しかしここで色々ご指導いただきほぼ完成しました。
今やっているのは、カメラ(C-MOS)の特性上暗くなるとRGBの検出が不能に
なるため、動体検知ができなくなりますそこでその変化の挙動をとらえ
ライトUPできないかなと思い試行錯誤しているところせす。
ありがとうございました。 何とか一つコマを進めたようです。
こんごともよろしくお願いします。
■No7697に返信(ふろふろさんの記事)
> ■No7664に返信(深山さんの記事)
> >>ここまではできたのですが、TOP行への折り返しでリストボックスを一旦クリアしたいのですが ListBox1.Items.Clear() を実行すると
> >>指定された引数は有効な値の範囲内にありません。
> >>パラメータ名:0は Vaiueに有効な値ではありません。
> >>とのエラーがでます。
>>
>> 少し誤解されているような気がします。
>> エラーの直接の原因は Clear ではなく、その後に SelectedIndex = 0 としてしまっていることです。
>>
>> 一番上の項目を選択するときは SelectedIndex プロパティに 0 を設定します(二番目の項目を選択するときは 1 です)。けれども Clear すると項目自体がなくなりますよね?
>> だから『 0 は有効な値ではない』と言われてしまうわけです。
>>
>>‥‥って、ここまで書いて気付いたのですけど、デバッグされてないのでは?(汗)
>> プログラムを修正してすぐに(実行ファイルから)実行してたら、不具合の原因特定が困難になりますよ。
>>#それでも例外発生時に表示されるダイアログで『詳細』を見て頂ければ set_SelectedIndex でエラーとなっているのが確認できると思いますが。
>>
>>
>>
>> 以下余談です。
>> Items.Add した後に 200 になっていたら Clear としてますけど、これだと最後に追加したものは直に消えてしまいませんか? エラーの件と併せて処理手順の見直しをされた方がよろしいかと。
>>#ものごっつ余計なお世話でしょうけど(^_^;)
>>
>>
>> 更に余談です。
>> 追加した項目を即選択したいのでしたら、次のように記述することもできます。
>># Add メソッドは項目のインデックス番号を返します。
>>
>>ListBox1.SelectedIndex = ListBox1.Items.Add(data)
>>
>>ListBox.ObjectCollection.Add メソッド
>>http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformslistboxobjectcollectionclassaddtopic.asp
>
> 深山様
> 度々のご指導ありがとうございます。
> まだまだ論理的におかしいとところあると思いますが
> これである一定以上スクロールさせクリア→TOPより表示
> ができました。
> nextIndex = ListBox1.SelectedIndex + 1 だけでも
> スクロールとしては出来てたのですが、
> 用途がセキュリティシステムの検知レヴェルを経過的に見るためのもので
> PCがつけっぱなしになりますので、適当にクリアしてやらないと、何か
> スタック?がどんどんたまってはと思いクリアしたかつたのです。
>
> '--- 自動スクロール---(カメラの動体検知レベルメータ)----
> ListBox1.Items.Add(StrDup(SabnRGB, "-"))
> nextIndex = ListBox1.SelectedIndex + 1
>
> If Sclor = 300 Then
> ListBox1.Items.Clear()
> Sclor = 1
> ListBox1.Items.Add(StrDup(SabnRGB, "-"))
> nextIndex = 0
>
> End If
> ListBox1.SelectedIndex = nextIndex
> Sclor = Sclor + 1
>
> なんか大そうなプログラムを作っている割には8ビット時代のBASICの知識
> 程度で苦労しています、しかしここで色々ご指導いただきほぼ完成しました。
> 今やっているのは、カメラ(C-MOS)の特性上暗くなるとRGBの検出が不能に
> なるため、動体検知ができなくなりますそこでその変化の挙動をとらえ
> ライトUPできないかなと思い試行錯誤しているところせす。
> ありがとうございました。 何とか一つコマを進めたようです。
> こんごともよろしくお願いします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板