テキストボックスのスクロール制御方法は?


VBがんばってます  2004-10-08 17:33:01  No: 116853  IP: [192.*.*.*]

度々の投稿お許しください。
win2000/vb6.0で開発を行っております。

formにテキストボックスをマルチラインで二つつけてあります。
text1         text2
------        -------
|    |        |     |
|    |        |     |
------        -------

この二つのtextboxのうち一方をスクロール(スクロールバーは縦)するともう一方も連動して動くようにしたいのですが、どのようにすればよいのでしょうか?

理由としては左側のテキストに項目が、右側のテキストに値が表示されている為同時スクロールがしたいのですが、調べてもなかなか行き着かず・・・

どうかよろしくお願い致します

編集 削除
VBer  2004-10-09 02:07:07  No: 116854  IP: [192.*.*.*]

暇だったのでサンプルを作ってみました。
以下にサンプルを書いておきます。
適当に改造して使用してください。

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

編集 削除
VBer  2004-10-09 02:10:24  No: 116855  IP: [192.*.*.*]

書き忘れました
Text1、Text2ともMultiLineプロパティはTrueにセットしておいてください。

編集 削除
VBer  2004-10-09 02:13:39  No: 116856  IP: [192.*.*.*]

あとText1,Text2ともScrollBarプロパティを3=両方にしておいた方がいいです。
折り返しが異なると悲しいことになるかもしれません。

編集 削除
VBがんばってます  2004-10-27 14:13:18  No: 116857  IP: [192.*.*.*]

VBer様、レスありがとうございます。
お礼の返事が遅れてしまい大変失礼いたしました。

VBer様様が提示してくださったソースを元に今試しているところです。
ソースまで提示していただき、困っていたのでとても助かります。
ありがとうございました

編集 削除
葉月  2004-10-27 16:25:16  No: 116858  IP: [192.*.*.*]

片方には項目名等
片方にはそれに対応する値

仮にその両者が1項目一行とか仕様がきまっていて
テキストじゃなくても良いとするなら

両者リストボックスに収めてしまって
スクロールさせる方が楽じゃないでしょうかねぇ

そもそもテキストでって質問なんだからリストボックスとかじゃだめな理由があるんだろうけど
駄レススマソ

編集 削除