度々の投稿お許しください。
win2000/vb6.0で開発を行っております。
formにテキストボックスをマルチラインで二つつけてあります。
text1 text2
------ -------
| | | |
| | | |
------ -------
この二つのtextboxのうち一方をスクロール(スクロールバーは縦)するともう一方も連動して動くようにしたいのですが、どのようにすればよいのでしょうか?
理由としては左側のテキストに項目が、右側のテキストに値が表示されている為同時スクロールがしたいのですが、調べてもなかなか行き着かず・・・
どうかよろしくお願い致します
暇だったのでサンプルを作ってみました。
以下にサンプルを書いておきます。
適当に改造して使用してください。
1)フォームに2つのテキストボックス(Text1及びText2)を貼り付けます。
2)フォームのロード及びアンロードイベントプロシージャに下記コード(フォーム(Form1.frm)のコード)を書き込みます。
3)標準モジュールを追加し下記コード(標準モジュール(Module1.bas)のコード)を書き込みます。
4)実行してText1をスクロールするとText2も連動してスクロールします。
'-------------------------------------------------------------------------------
'
' フォーム(Form1.frm)のコード
'
'-------------------------------------------------------------------------------
Option Explicit
Private Sub Form_Load()
Dim i As Long
Text1.Text = ""
For i = 1 To 100
Text1.Text = Text1.Text & "Line=" & Format(i) & vbCrLf
Next
Text2.Text = Text1.Text
lngOldWnd = SetWindowLong(Text1.hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim lngWnd As Long
If lngOldWnd Then
lngWnd = SetWindowLong(Text1.hWnd, GWL_WNDPROC, lngOldWnd)
End If
End Sub
'-------------------------------------------------------------------------------
'
' 標準モジュール(Module1.bas)のコード
'
'-------------------------------------------------------------------------------
Option Explicit
Public Const GWL_WNDPROC = -4
Public Const GCL_WNDPROC = -24
Public Const EM_GETFIRSTVISIBLELINE = &HCE
Public Const WM_PAINT = &HF
Public Const EM_LINESCROLL = &HB6
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public lngOldWnd As Long
Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lngSrcIdx As Long
Dim lngDstIdx As Long
Dim lngCnt As Long
Select Case uMsg
Case WM_PAINT
lngSrcIdx = SendMessage(Form1.Text1.hWnd, EM_GETFIRSTVISIBLELINE, 0&, 0&)
lngDstIdx = SendMessage(Form1.Text2.hWnd, EM_GETFIRSTVISIBLELINE, 0&, 0&)
lngCnt = lngSrcIdx - lngDstIdx
If lngCnt Then
PostMessage Form1.Text2.hWnd, EM_LINESCROLL, 0&, lngCnt
End If
End Select
WindowProc = CallWindowProc(lngOldWnd, hWnd, uMsg, wParam, lParam)
End Function
書き忘れました
Text1、Text2ともMultiLineプロパティはTrueにセットしておいてください。
あとText1,Text2ともScrollBarプロパティを3=両方にしておいた方がいいです。
折り返しが異なると悲しいことになるかもしれません。
VBer様、レスありがとうございます。
お礼の返事が遅れてしまい大変失礼いたしました。
VBer様様が提示してくださったソースを元に今試しているところです。
ソースまで提示していただき、困っていたのでとても助かります。
ありがとうございました
片方には項目名等
片方にはそれに対応する値
仮にその両者が1項目一行とか仕様がきまっていて
テキストじゃなくても良いとするなら
両者リストボックスに収めてしまって
スクロールさせる方が楽じゃないでしょうかねぇ
そもそもテキストでって質問なんだからリストボックスとかじゃだめな理由があるんだろうけど
駄レススマソ
ツイート | ![]() |