Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Как программно убрать горизонтальную прокрутку?


Автор: korob2001 11.12.2004, 21:05
Привет!
Возникла такая проблема:
Есть многострочное текстовое поле txtField. Пераметр ScrollBars = Both.
После пользователь должен иметь возможность изменить его на Vertical.
Пытаюсь сделать так:
Код

Private Sub mnuRepl_Click()
       If mnuRepl.Checked Then
          txtField.ScrollBars = vbVertical
          mnuRepl.Checked = False
       Else
          txtField.ScrollBars = vbBoth
          mnuRepl.Checked = True
       End If
End Sub

Получаю ошибку. Что данный параметр доступен только для чтения. smile((
Как быть?

Автор: Naghual 12.12.2004, 10:41
Точно. При выполнении программы это свойство доступно только для чтения. Его можно изменять только в режиме разработки.
Но можно это ограничение обойти - при помощи АПИ.

Автор: korob2001 12.12.2004, 13:12
Цитата

Точно. При выполнении программы это свойство доступно только для чтения. Его можно изменять только в режиме разработки.
Но можно это ограничение обойти - при помощи АПИ.

Если можно, поточнее.

Вобщем посмотреть, то чего хочу я добиться, можно запустив Блокнот, затем нужно выбрать команду "Перенос по словам", меню "Формат".

Автор: Naghual 12.12.2004, 13:50
Извольте. (Авторство сохранено)
Код
'example by Matthew Gates ([email protected])
Private Declare Function ShowScrollBar Lib "user32" (ByVal hwnd As Long, ByVal wBar As Long, ByVal bShow As Long) As Long
Private Const SB_HORZ = 0
Private Const SB_VERT = 1
Private Const SB_BOTH = 3
Private Sub Form_Load()
   'preset the textbox to multiline
   'and since the ScrollBars property is
   'read-only during runtime, you can use this
   'API function to set the Scrollbars
   'This examples shows how to show both horizontal and
   'vertical scrollbars on a textbox during runtime
   ShowScrollBar Text1.hwnd, SB_BOTH, True
End Sub


Тебе необходимо только установить необходимую константу при вызове функции.

Автор: korob2001 12.12.2004, 14:17
Naghual - большое спасибо.

Автор: Naghual 12.12.2004, 14:19
Всегда пожалуйста. smile

Автор: korob2001 14.12.2004, 11:29
Всё работает, только вот переноса по словам так и нет. smile((((

Автор: Akina 14.12.2004, 11:47
Цитата(korob2001 @ 14.12.2004, 12:29)
Всё работает, только вот переноса по словам так и нет.

Попробуй Repaint/Refresh... должОн быть...

Автор: Naghual 14.12.2004, 11:55
Есть такое решение:
1. При разработке формы, установи ScrollBars в Horizontal.
2. В Form_Load, через АПИ, установи ScrollBars в Both.
Ну а потом уже по программе.


Автор: korob2001 15.12.2004, 04:39
Цитата

Попробуй Repaint/Refresh... должОн быть...

Не понял, где должен быть? Если не трудно, поясни.
Цитата

Есть такое решение:
1. При разработке формы, установи ScrollBars в Horizontal.
2. В Form_Load, через АПИ, установи ScrollBars в Both.
Ну а потом уже по программе.

ОК.
При разработке устанавливаю ScrollBars в Horizontal.
Затем в процедуре Form_Load устанавливаю ScrollBars в Both. Всё нормально проходит и в конечном итоге TextBox с двумя полосами прокрутки. Пробую напечатать текст в текстовом поле, текст как положено работает, т.е. не переносится на следующую строку когда достигает правого края текстового поля. Пока всё нормально, но когда я жму кнопку "Перенос по словам",
то горизонтальная полоса прокрутки исчезает, но переноса по словам так и нет, тоесть строка как была длинной, так и осталась.

Вот процедура обработчика события Click кнопки "Перенос по словам
Код

Private Sub mnuRepl_Click()
       If mnuRepl.Checked Then
          ShowScrollBar txtField.hwnd, myHz, True
          mnuRepl.Checked = False
       Else
          ShowScrollBar txtField.hwnd, myHz, False
          mnuRepl.Checked = True
       End If
End Sub

Где:
myHz - константа для горизонтальной полосы прокрутки.
Просто все контанты, которые не начинаются с vb, я делаю с начальными символами my.

Может я делаю что-то не так в обработчике Click?

Автор: Akina 15.12.2004, 11:07
Хочешь идиотское решение? Делаешь ДВА контрола - один с горизонтальной полосой прокрутки и переносом, второй - без. По мере необходимости копируешь контент, устанавливаешь куда надо курсор и переключаешь визибилити.

Автор: korob2001 15.12.2004, 14:39
Цитата

Хочешь идиотское решение?

smile
Да, решение не самое лучшее, но всё же.
На чём написан блокнот, не на VB?

Автор: Naghual 15.12.2004, 15:38
Код
Private Sub mnuRepl_Click()
   Dim strText as String
   
   strText = txtField.Text
   txtField.Text = ""
   If mnuRepl.Checked Then
       ShowScrollBar txtField.hwnd, myHz, True
       mnuRepl.Checked = False
   Else
       ShowScrollBar txtField.hwnd, myHz, False
       mnuRepl.Checked = True
   End If
   txtField.Text = strText
End Sub


Как тебе такой код?

ЗЫ: А у Akina отличное решение.

Автор: Naghual 16.12.2004, 15:52
korob2001 Ну как успехи?

Автор: korob2001 16.12.2004, 21:33
Результат тот же. smile(((

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)