Как синхронизировать прокрутку в TextBox и ListBox?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 155
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Как синхронизировать прокрутку в TextBox и ListBox?

Сообщение qwertyhp » 08.08.2018 (Ср) 23:41

Здравствуйте!
На форме есть ListBox и TextBox. TextBox служит для редактирования содержимого ListBox'а, и изменения в TextBox автоматически передаются в ListBox. А при отметке строки в ListBox производится операция с отмеченной строкой.
Вопрос такой:
Можно ли (и если ДА - то как) синхронизировать прокрутку (обе, и в т.ч. мышью) в обоих боксах?
Шрифт везде одинаковый, TextBox - ведущий при прокрутке.
Либо - можно ли добиться в ListBox'е редактирования строк (и отказаться от TextBox)?
Либо - возможно - есть третий вариант решения задачи?
ListBox с CHECK, ось WinXP.
Подскажите, пожалуйста.
Спасибо.
Пятачок Forever! :)

Teranas
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 133
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Как синхронизировать прокрутку в TextBox и ListBox?

Сообщение Teranas » 09.08.2018 (Чт) 4:27

Код: Выделить всё
Option Explicit

Private Const LB_GETITEMRECT As Long = &H198

Private Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type

Private iLst As Long, hLst As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageW" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long

Private Sub Text1_Vis(b As Boolean)
  Text1.Visible = b
  Text1.Enabled = b
End Sub

Private Sub Form_Load()
  Dim i As Long
  iLst = -1
  Text1_Vis False
  For i = 0 To 40
    List1.AddItem CStr(Fix(Rnd * 9000))
  Next
  Set Text1.Font = List1.Font
  hLst = List1.hWnd
End Sub

Private Sub Text1_SetPos()
  Dim RC As RECT
  SendMessage hLst, LB_GETITEMRECT, iLst, ByVal VarPtr(RC)
  Text1.Left = List1.Left
  Text1.Width = (RC.Right - RC.Left) * Screen.TwipsPerPixelY
  Text1.Height = (RC.Bottom - RC.Top) * Screen.TwipsPerPixelY
  Text1.Top = List1.Top + RC.Top * Screen.TwipsPerPixelY
  If Text1.Top < List1.Top Or (Text1.Top + 60) > (List1.Top + List1.Height) Then
    Text1_Vis False
  End If
End Sub

Private Sub List1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  iLst = List1.ListIndex
  If iLst < 0 Then Exit Sub
  Text1.ZOrder 0
  Text1_Vis True
  Text1.Text = List1.List(iLst)
  Text1_SetPos
  Text1.SetFocus
  Text1.SelStart = 32700
  Text1.SelLength = 0
End Sub

Private Sub List1_Scroll()
  If Text1.Visible Then Text1_SetPos
End Sub

Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
  If KeyCode = 27 Then Text1_Vis False
  If KeyCode = 13 Then
    Text1_Vis False
    If iLst >= 0 And iLst < List1.ListCount Then
      List1.List(iLst) = Text1.Text
    End If
  End If
End Sub

С уважением, Андрей.

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 155
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: Как синхронизировать прокрутку в TextBox и ListBox?

Сообщение qwertyhp » 03.09.2018 (Пн) 19:35

Андрей, спасибо огромное за помощь!
Пятачок Forever! :)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 8

    TopList