ブログ主が仕事や個人的に学んだPC系・プログラミング系(VBAとかHTML)について書いていく備忘録ブログ。
※ここで記載する内容はあくまで「個人的に」上手くいく内容です。ご使用には十分注意してください
Posted by 若槻風亜 - 2019.10.20,Sun
(対象)VS2017(Visual Studio/VB.NET)
ネットで探しても中々ズバリこれ、というのが
出てこなかったのでまとめてみます。
タイトル通り、VS/VBでリッチテキストボックスの
指定行に移動するソースサンプル。
実際の動作はこちらのファイルを参照
――――――――――――――――――――――――――――――――
'■リッチテキストボックスのスクロール用
Public Declare Function SendMessage Lib "USER32.dll" Alias "SendMessageA" (
ByVal hWnd As System.IntPtr, ByVal Msg As Int32,
ByVal wParam As Int32, ByRef lParam As Point) As IntPtr
Public Declare Function SendMessage2 Lib "USER32.dll" Alias "SendMessageA" (
ByVal hWnd As IntPtr, ByVal msg As UInteger, ByVal wParam As Integer,
ByVal lParam As Integer) As Integer
Public EM_GETFIRSTVISIBLELINE As UInteger = 206
Public EM_LINEINDEX As UInteger = 0
Public Pos As Point
Public I As Long
Public J As Long
Public K As Long
Public Dbl1 As Double
'===========================================================
' 移動押下時
'===========================================================
Private Sub Bt_移動_Click(sender As Object, e As EventArgs) Handles Bt_移動.Click
'■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
' 右端で折り返してもしなくても移動可
' (RT_データ.WordWrap = False/True)
'■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
'■テキストの中身が数字じゃない場合は処理を抜ける
If Not IsNumeric(Text_移動先.Text) Then
MsgBox("移動先番号は数字で入力してください", vbExclamation, "【注意】")
Text_移動先.Select()
Text_移動先.SelectAll()
Exit Sub
End If '---入力値が数字かどうかの判断
'■設定した数字を取得
I = CLng(Text_移動先.Text) '---Integerでもいい
'■対象行があるかないかを判断
J = RT_データ.Lines.Length
If I > J Then _
MsgBox("指定行が最大行よりも大きい値です", vbExclamation, "【注意】") : _
Exit Sub
'■行の高さを取得
' 参照 : https://dobon.net/vb/bbs/log3-52/30480.html
With RT_データ
Dbl1 = .GetPositionFromCharIndex(
.GetFirstCharIndexFromLine(2)).Y -
.GetPositionFromCharIndex(.GetFirstCharIndexFromLine(1)).Y
End With
'■対象行にジャンプ
' http://pineplanter.moo.jp/non-it-salaryman/2017/11/23/csharp-scroll-control/
' C#→VB変換 :http://www.carlosag.net/Tools/CodeTranslator/
' 変数の対応表:http://www.webtropy.com/articles/dll-api.aspx?dll=crypt32
Pos = New Point(0, CInt((I - 1) * Dbl1))
SendMessage(RT_データ.Handle, 1246, 0, Pos)
'■対象行を選択
' https://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8248&forum=7
'-----先頭行を取得
J = SendMessage2(RT_データ.Handle, EM_GETFIRSTVISIBLELINE, 0, CInt((I - 1) * Dbl1))
'-----対象行を選択
K = 0
For cnt = 0 To J - 1
K += Len(RT_データ.Lines(cnt).ToString) '---指定行の文字列を取得
K += 1 '---改行分を追加で加算
'Debug.Print("K:String = " & K & ":" & RT1.Lines(cnt).ToString)
Next
RT_データ.SelectionStart = K
RT_データ.Select()
End Sub
――――――――――――――――――――――――――――――――
VS2017と2019でしか試してませんが、
恐らくVBの方でも使用可能かと。
PR
Comments
Post a Comment
プロフィール
HN:
若槻風亜
性別:
女性
職業:
会社員
趣味:
創作、プログラミング
自己紹介:
仕事や個人で学んだことをまとめておきたかったがために備忘録ブログを立ち上げました。
あくまで自分が学んだこと・自分が出来たことなので、ご覧くださる場合は参照レベルでお願いします。
あくまで自分が学んだこと・自分が出来たことなので、ご覧くださる場合は参照レベルでお願いします。
ブログ内検索
カレンダー
最新記事
(12/31)
(12/30)
(03/27)
(11/09)
(10/07)
P R
最新トラックバック
コガネモチ
フリーエリア
Template by mavericyard*
Powered by "Samurai Factory"
Powered by "Samurai Factory"