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


VBがんばってます  2004-10-09 02:33:01  No: 116853

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

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

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

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

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


VBer  2004-10-09 11:07:07  No: 116854

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

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 11:10:24  No: 116855

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


VBer  2004-10-09 11:13:39  No: 116856

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


VBがんばってます  2004-10-27 23:13:18  No: 116857

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

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


葉月  2004-10-28 01:25:16  No: 116858

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

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加