Скрол child-форм степами

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

Скрол child-форм степами

Сообщение giaber » 26.07.2012 (Чт) 12:37

В MDI-приложении открыто несколько child-форм. Height у всех в полную высоту экрана, Top у всех =0, Width каждой - пол-экрана, то есть одновременно видно 2 формы, Left-ы установлены так, что все формы расположены одна за другой подряд. Требуется как бы пролистывать child-формы, чтоб HScrollBar MDI-родителя делал прокрутку на ширину child-формы. Как это можно сделать?
Установка
Код: Выделить всё
frmMDIMain.HScroll1.LargeChange = frmChild(1).Width
frmMDIMain.HScroll1.SmallChange =  frmChild(1).Width

даёт нулевой результат. Где я туплю?
Спасибо

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Скрол child-форм степами

Сообщение Хакер » 26.07.2012 (Чт) 14:22

Вообще, скачкообразный скролл это по-моему один из худших дизайн-приёмов, которые могут касаться скроллбаров. Хуже только когда скроллбар реагирует только на отпускание ползунка, а не на процесс его перемещения. Так что я настоятельно рекомендую отказаться от подобной идеи.

Что касается проблемы.

Во-первых, откуда взялся HScroll1, когда у контейнер-зон MDI-окон есть свои собственные скроллбары, в том числе и горизонтальеные. Их и надо использовать.

Во-вторых, на будущее: нет смысла писать «результат нулевой». Есть смысл в случае проблем и в сообщениях о багах писать две вещи: какой результат ожидался автором текста, и какой результат был получен автором текста.

Можно предположить, что ты ожидаешь, что свойства LargeChange и SmallChange будут влиять на дискретность изменения свойства Value в процессе прокрутки мышкой. Это заблуждение.
Свойство SmallChange влияет на величину изменения свойства Value при нажатии на кнопки ^ и v или клавиатурные клавиши Вверх/Вниз, если скролл обладает сейчас фокусом.
Свойства LargeChange влияет на величину изменения свойства Value при кликах над/под ползунком или на нажатие клавиш PageUp/PageDown, если скролл обладает сейчас фокусом. В добавок свойство LargeChange определяет соотношение размера ползунка к размеру всего скролла.

Ни свойство SmallChange, ни свойство LargeChange не влияют на дискретность изменения свойства Value при скроллинге ползунка непосредственно зажатой мышкой. При скроллинге мышкой значение Value изменяется на единичку. И дело программиста — в событие Scroll и событии Change округлять вверх или вниз или в ближайшую сторону значение свойства Value, чтобы оно принадлежало какому-то ряду чисел с большим шагом.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Скрол child-форм степами

Сообщение iGrok » 26.07.2012 (Чт) 14:42

А не лучше вместо скролла использовать что-то другое? Например, кнопки со стрелками "туда - сюда", как в заголовке TabStrip, когда табов слишком много?
По-моему это будет, скажем так, очевиднее.
label:
cli
jmp label

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Скрол child-форм степами

Сообщение giaber » 27.07.2012 (Пт) 12:04

Хакер, во-первых, приношу глубочайшие извинения за полнейшую путаницу в мозгах и, соответственно, в посте! Во-вторых, спасибо за объяснения, я на удивление криво всё это понимал, хотя эти вопросы человек должен усваивать с первых же шагов в VB (хотя я знаю, почему это случилось).
С учётом того, что вы объяснили, вопрос теперь ставлю так:
1. как отслеживать события Scroll, Change и MouseUp собственного скроллбара контейнер-зоны MDI-окна? Видимо, с использованием API? Как?
2.
округлять … значение свойства Value, чтобы оно принадлежало … ряду чисел с большим шагом

что-то в этом роде? Попробовал, вроде работает:
VScroll1.Value = STEP * (Fix(VScroll1.Value / STEP))
=====================
скачкообразный скролл это по-моему один из худших дизайн-приёмов

«Нет, серьезно. Я очень уважаю Остапа Ибрагимовича: это такой человек!»(с).
Несмотря на моё к вам ЧУДОВИЩНОЕ уважение, всё-таки позволю себе в этом с вами не согласиться. В данном случае, мне кажется, это наоборот, диктуется идеей того приложения, которое я ваяю. Суть в том, что каждая процедура, функция, декларации, которые пишутся при создании какой-нибудь VB-программы отображаются в отдельном RichTextBox-е (с синтакс-хайлайтингом), и эти процедуры (RichTextBox-ы) можно группировать для удобства и отображать на отдельной форме(child), порядок следования как RTB-box-ов на форме, так и форм можно устанавливать как удобно, и, соответственно, легко ставить на экране рядом самые разные процедуры, имеющие какое-либо отношение к друг-другу . Исходя из такой концепции промежуточные положения, когда на экране видны части форм (части текста процедур по горизонтали) теряют смысл и даже неудобны.
Может такая концепция среды и спорна, но мне так удобно, делаю-то для личного пользования.

Что касается
А не лучше вместо скролла использовать что-то другое? Например, кнопки со стрелками "туда - сюда"

То сейчас так и сделано, но мне казалось что перерисовывание форм встроенным механизмом будет быстрее чем, моим кодом. Это единственная причина моего интереса к собственному скролу MDI-родителя.
Вложения
VBeditor.jpg
Вот иллюстрация того, о чём я говорил:
VBeditor.jpg (219.01 Кб) Просмотров: 892

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Скрол child-форм степами

Сообщение VBTerminator » 28.07.2012 (Сб) 12:44

Сделай тогда вместо окон вкладки (как в Notepad++) что-ли.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Скрол child-форм степами

Сообщение giaber » 28.07.2012 (Сб) 13:30

Весь смысл в том чтоб разные участки кода (разные процедуры) можно было ставить рядом по горизонтали, чтоб видеть их одновременно и работать с ними. Терпеть не могу прыгать по листингу и искать нужную процедуру, даже CodeSmart не удовлетворяет. Вкладки не позволяют такого, так ведь? Да и вообще - разобраться хотелось бы. Вот посылать сообщение скроллбарам MDI-родителя научился:
Код: Выделить всё
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_HSCROLL = &H114
Private Const WM_VSCROLL = &H115
Private Const SB_LINEDOWN = 1
Private Const SB_LINEUP = 0
Dim hWndClient As Long
Private frmChild(4) As Form1

Private Sub MDIForm_Load()
    hWndClient = FindWindowEx(Me.hwnd, 0, "MDIClient", "")
    For i = 1 To 4
        Set frmChild(i) = New Form1
        With frmChild(i)
            .Top = 0
            .Height = 13440
            .Width = Screen.Width - 60
            .Left = frmChild(i).Width * i - frmChild(i).Width
            .Tag = i
            .Caption = i & "  " & frmChild(i).Left
            .Show
        End With
    Next i
End Sub

Private Sub cmdScrollLeft_Click()
    SendMessage hWndClient, WM_HSCROLL, SB_LINEUP, 0
End Sub

Private Sub cmdScrollRight_Click()
    SendMessage hWndClient, WM_HSCROLL, SB_LINEDOWN, 0
End Sub

но это не то что надо - скролится опять таки маленькими порциями. Даже не знаю что делать - четвёртый день рою инет, обидно - никто даже намёк не даёт в какую сторону рыть...

Вообще куча вопросов - вот, например при посылке сообщения в вышеприведённом коде скролится порциями, и размер этой порции как-то зависит от того сколько места по горизонтали занимают все дочерние формы. По какому принципу определяется единичный степ скроллинга? Вообще, вот в обычном скролбаре можно установить Value скролбара, нет ли какого-нибудь аналога на API, ну не буквального, но по сути? Хакер, где вы? Ругайте за тупость, но показывайте путь к выходу из тёмного царства незнания! :) Указывайте хотя бы направления! (хотя готовый код - как портал - сразу телепортирует на нужный уровень знания!)


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

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

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 91

    TopList