質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

2回答

3243閲覧

テキストボックスを自動でスクロールさせたい

heart_crimson

総合スコア15

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/04/03 10:31

編集2019/04/08 07:41

前提・実現したいこと

VB.NET、Windows Formを使用しています。
スクロールバーつきのテキストボックスを自動でスクロールさせたいです。
(一番上からゆっくり下へスクロールさせ、一番下まで行ったら一番上に戻ってほしい)

発生している問題・エラーメッセージ

実装方法が分からないです。

現状としましては、

 1秒ごとにタイマー回す(実装済み)
テキストボックスに縦スクロールバーが無かったらメソッド抜ける(未実装)
→現在のアクティブなコントロールを取得(実装済み)
→動かしたいテキストボックスをアクティブにする(実装済み)
→テキストボックスのキャレットのある行数を取得(実装済み)
こちらの「物理的に行を数える」を参考
キャレットを動かす(現在の行+1の行へキャレットを動かす。一番下の行だったら一番上の行へ移動)(未実装)
→キャレットの場所へスクロールを移動させる(実装済み)
→元々アクティブだったコントロールへアクティブを移す(実装済み)

という流れを実装しようとしたのですが、太字の部分が分からない状態です。
ヒントや参考になるサイトはございませんでしょうか?

そもそも、もっと簡単に要件が実装できるのであればご教授いただけますと幸いです。

※要件

  • 文字を表示する
  • 文字がフォームサイズに収まらなかったら縦スクロールバーが表示される
  • スクロールバーがあれば、ゆっくりとスクロールバーが下へ動く
  • 一番下までスクロールされたら一番上に戻る

該当のソースコード

VB

1 <System.Runtime.InteropServices.DllImport("User32.Dll")> 2 Private Shared Function SendMessage( 3 ByVal hWnd As IntPtr, 4 ByVal Msg As Integer, 5 ByVal wParam As Integer, 6 ByVal lParam As Integer) As Integer 7 End Function 8 9 Private Sub tmrTest_Tick(sender As Object, e As EventArgs) Handles tmrTest.Tick 10 'テキストボックスに縦スクロールバーが無かったらメソッド抜ける 11 12 '現在のアクティブなコントロールを取得 13 Dim control As Control = Me.ActiveControl 14 15 '動かしたいテキストボックスをアクティブにする 16 Me.ActiveControl = txtTest 17 18 '現在キャレットがある行数を取得 19 Const EM_LINEFROMCHAR As Integer = &HC9 20 Dim row As Integer = SendMessage( 21 txtTest.Handle, EM_LINEFROMCHAR, -1, 0) + 1 22 23 'ここで現在の行+1の行・もしくは先頭行へキャレットを動かしたい 24 'txtTest.Select() 25 26 'キャレットの場所へスクロールを移動させる 27 txtPreparationMethod.ScrollToCaret() 28 29 '元々アクティブだったコントロールへアクティブを移す 30 Me.ActiveControl = control 31 32 End Sub 33

試したこと

上記が全てです。

補足情報(FW/ツールのバージョンなど)

.NET Framework 4.0 Client Profile

情報が不足していたらご指摘いただけますと幸いです。

###追記

以下、修正した内容です。

VB

1 <System.Runtime.InteropServices.DllImport("User32.Dll")> 2 Private Shared Function SendMessage( 3 ByVal hWnd As IntPtr, 4 ByVal Msg As Integer, 5 ByVal wParam As Integer, 6 ByVal lParam As Integer) As Integer 7 End Function 8 9 <System.Runtime.InteropServices.DllImport("User32.Dll")> 10 Private Shared Function MakeWParam( 11 ByVal download As Integer, 12 ByVal hiWord As Integer) As Integer 13 End Function 14 15 Private Sub tmrTest_Tick(sender As Object, e As EventArgs) Handles tmrTest.Tick 16 Dim control As Control = Me.ActiveControl 17 18 Me.ActiveControl = txtTest 19 20 Const EM_LINEFROMCHAR As Integer = &HC9 21 Const EM_SCROLL As Integer = &HB5 22 Const SB_THUMBPOSITION As Integer = 4 23 24 Dim row As Integer = SendMessage(txtTest.Handle, EM_LINEFROMCHAR, -1, 0) + 1 25 26 SendMessage(txtTest.Handle, EM_SCROLL, MakeWParam(SB_THUMBPOSITION, row), 0)'ここで例外が出る 27 28 txtTest.Select() 29 30 txtTest.ScrollToCaret() 31 32 Me.ActiveControl = control 33 End Sub

以下、例外の内容です。

VB

1System.EntryPointNotFoundException: 'DLL 'User32.Dll' の 'MakeWParam' というエントリ ポイントが見つかりません。'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

SendMessage(Edit.Handle,EM_SCROLL,MakeWParam(SB_THUMBPOSITION,pos),0);

で、pos行へのスクロールができたようなできなかったよーな。。

投稿2019/04/03 13:23

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

heart_crimson

2019/04/08 07:34

回答ありがとうございます。ご教授いただいた内容で調べプログラムに記述してみたのですが、例外が出てしまいます。理解が乏しいのだろうとは思うのですが、質問に追記いたしましたので、大変お手数おかけいたしますが、お目通しいただけますと幸いです。
y_waiwai

2019/04/08 07:48

ああ、MakeWparamってAPIじゃなく単なるマクロです SendMessage(Edit.Handle, SB_THUMBPOSITION | (pos<<16),0); # C#のコードです
guest

0

スクロールバーは、表示する設定になっていれば、全行が表示されていても(スクロールバーが不要でも)
非表示にはならないのではないかと思います。

とりあえずやってみました。

VB.NET

1Imports System.Runtime.InteropServices 2 3Public Class Form1 4 5 <DllImport("User32.Dll")> 6 Private Shared Function SendMessage( 7 ByVal hWnd As IntPtr, 8 ByVal Msg As Integer, 9 ByVal wParam As Integer, 10 ByVal lParam As Integer) As Integer 11 End Function 12 13 Private Const EM_GETLINECOUNT As Integer = &HBA 14 Private Const EM_LINEFROMCHAR As Integer = &HC9 15 16 Private Sub tmrTest_Tick(sender As Object, e As EventArgs) Handles tmrTest.Tick 17 18 '現在のアクティブなコントロールを取得 19 Dim control As Control = Me.ActiveControl 20 21 '動かしたいテキストボックスをアクティブにする 22 Me.ActiveControl = txtTest 23 24 Dim lines As Integer = SendMessage(txtTest.Handle, EM_GETLINECOUNT, 0, 0) 25 26 '現在キャレットがある行数を取得 27 Dim row As Integer = SendMessage(txtTest.Handle, EM_LINEFROMCHAR, -1, 0) + 1 28 29 If row < lines Then 30 SendKeys.Send("{DOWN}") 31 Else 32 txtTest.Select(0, 0) 33 End If 34 35 txtTest.ScrollToCaret() 36 37 '元々アクティブだったコントロールへアクティブを移す 38 Me.ActiveControl = control 39 40 End Sub 41 42 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 43 tmrTest.Start() 44 End Sub 45End Class

投稿2019/04/03 12:50

Nyaf

総合スコア108

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

heart_crimson

2019/04/08 07:32

回答ありがとうございます。自動でカーソルが動くことを確認いたしました、ご教授いただき誠にありがとうございました。参考にさせていただきます。自分のプログラムに組み込んで調整してみますので、ベストアンサーはしばらくお待ちください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問