Что нового

Изменение позиции slider при вводе новых данных

nu3dell

Осваивающий
Сообщения
139
Репутация
24
Как сделать так, что при изменении числа в input, то slider менял позицию? Только менял сразу по ходу дела...

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <SliderConstants.au3>
;

$Gui = GUICreate("Slider Update Demo", 300, 200)

GUIRegisterMsg($WM_HSCROLL, "WM_HVSCROLL")


$Horizontal_Slider = GUICtrlCreateSlider(10, 40, 250, 30)
GUICtrlSetLimit(-1, 500, 0)
GUICtrlSetData(-1, 250)
$Horizontal_Label = GUICtrlCreateInput(GUICtrlRead($Horizontal_Slider) , 10, 120, 200)
GUISetState()

While 1
    $nMsg = GUIGetMsg()
    
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func WM_HVSCROLL($hWndGUI, $MsgID, $WParam, $LParam)
    Switch $LParam
                Case GUICtrlGetHandle($Horizontal_Slider)
            GUICtrlSetData($Horizontal_Label, GUICtrlRead($Horizontal_Slider))
    EndSwitch
EndFunc
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <SliderConstants.au3>
;

$Gui = GUICreate("Slider Update Demo", 300, 200)

GUIRegisterMsg($WM_HSCROLL, "WM_HVSCROLL")


$Horizontal_Slider = GUICtrlCreateSlider(10, 40, 250, 30)
GUICtrlSetLimit(-1, 500, 0)
GUICtrlSetData(-1, 250)
$Horizontal_Label = GUICtrlCreateInput(GUICtrlRead($Horizontal_Slider) , 10, 120, 200)
GUISetState()

While 1
	GUICtrlSetData($Horizontal_Slider, GUICtrlRead($Horizontal_Label))

    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func WM_HVSCROLL($hWndGUI, $MsgID, $WParam, $LParam)
    Switch $LParam
                Case GUICtrlGetHandle($Horizontal_Slider)
            GUICtrlSetData($Horizontal_Label, GUICtrlRead($Horizontal_Slider))
    EndSwitch
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
nu3dell

Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Администратор.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
nu3dell,
Мой вариант.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>


$hGui = GUICreate('Slider', 300, 200)
$nSlider = GUICtrlCreateSlider(10, 40, 250, 30)
GUICtrlSetLimit(-1, 500, 0)
GUICtrlSetData(-1, 250)
$iValue = GUICtrlRead($nSlider)
$nInput = GUICtrlCreateInput($iValue, 60, 120, 60, 20, $ES_NUMBER)
$nLabel = GUICtrlCreateInput($iValue, 180, 120, 60, 20, $ES_READONLY)
GUISetState()
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nSlider
			$iValue = GUICtrlRead($nSlider)
			GUICtrlSetData($nInput, $iValue)
			GUICtrlSetData($nLabel, $iValue)
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
	Local $iIDFrom, $iCode, $i_Read
	$iIDFrom = BitAND($iwParam, 0xFFFF)
	$iCode = BitShift($iwParam, 16)
	;Switch $hWnd
	;	Case $hGui
	Switch $iIDFrom
		Case $nInput
			Switch $iCode
				Case $EN_UPDATE
					$i_Read = Number(StringRegExpReplace(GUICtrlRead($nInput), '[^\d]', ''))
					If $i_Read < 0 Then $i_Read = 0
					If $i_Read > 500 Then $i_Read = 500
					GUICtrlSetData($nInput, $i_Read)
					GUICtrlSetData($nSlider, $i_Read)
					GUICtrlSetData($nLabel, $i_Read)
			EndSwitch
	EndSwitch
	;EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Автор
nu3dell

nu3dell

Осваивающий
Сообщения
139
Репутация
24
Вот смотрите мне нужно в Input перед значением добавит 0.**

Если делать так то
Код:
GUICtrlSetData($Horizontal_Label, GUICtrlRead($Horizontal_Slider)&'0.')

А когда делаешь так:
Код:
GUICtrlSetData($Horizontal_Label, '0.'&GUICtrlRead($Horizontal_Slider))


То начинает глючить:

Вот посмотрите:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <SliderConstants.au3>
;

$Gui = GUICreate("Slider Update Demo", 300, 200)

GUIRegisterMsg($WM_HSCROLL, "WM_HVSCROLL")


$Horizontal_Slider = GUICtrlCreateSlider(10, 40, 250, 30)
GUICtrlSetLimit(-1, 500, 0)
GUICtrlSetData(-1, 250)
$Horizontal_Label = GUICtrlCreateInput('0.'&GUICtrlRead($Horizontal_Slider) , 10, 120, 200)
GUISetState()

While 1
    GUICtrlSetData($Horizontal_Slider, GUICtrlRead($Horizontal_Label))

    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func WM_HVSCROLL($hWndGUI, $MsgID, $WParam, $LParam)
    Switch $LParam
                Case GUICtrlGetHandle($Horizontal_Slider)
            GUICtrlSetData($Horizontal_Label, '0.'&GUICtrlRead($Horizontal_Slider))
    EndSwitch
EndFunc
 
Автор
nu3dell

nu3dell

Осваивающий
Сообщения
139
Репутация
24
madmasles 0.**** фиксированное значение, там где **** тут меняются числа зависит от slider.

Посмотрите пример который я дал под спойлером, там стоит так ****.0, а мне нужно 0.*** вывести вперед.... а кода вывожу слайдер начинает "колбасить" . НО "0." точка должна быть обязательно
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
nu3dell,
Я не уверен, что понял Вас правильно.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>

$iMin = 0
$iMax = 999

$hGui = GUICreate('Slider', 300, 200)
$nSlider = GUICtrlCreateSlider(10, 40, 250, 30)
GUICtrlSetLimit(-1, $iMax, $iMin)
$nInput = GUICtrlCreateInput('', 60, 120, 60, 20)
$nLabel = GUICtrlCreateInput('', 180, 120, 60, 20, $ES_READONLY)
GUISetState()
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nSlider
			$iValue = GUICtrlRead($nSlider)
			GUICtrlSetData($nInput, StringFormat('0.%d', $iValue))
			GUICtrlSetData($nLabel, $iValue)
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
	Local $iIDFrom, $iCode, $i_Read
	$iIDFrom = BitAND($iwParam, 0xFFFF)
	$iCode = BitShift($iwParam, 16)
	;Switch $hWnd
	;   Case $hGui
	Switch $iIDFrom
		Case $nInput
			Switch $iCode
				Case $EN_UPDATE
					$i_Read = Number(StringRegExpReplace(GUICtrlRead($nInput), '[^\d]', ''))
					If $i_Read < $iMin Then $i_Read = $iMin
					If $i_Read > $iMax Then $i_Read = $iMax
					If $i_Read Then
						GUICtrlSetData($nInput, StringFormat('0.%d', $i_Read))
					Else
						GUICtrlSetData($nInput, '')
					EndIf
					GUICtrlSetData($nSlider, $i_Read)
					GUICtrlSetData($nLabel, GUICtrlRead($nSlider))
			EndSwitch
	EndSwitch
	;EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Автор
nu3dell

nu3dell

Осваивающий
Сообщения
139
Репутация
24
madmasles да так, только можно в вариант котрый Zaramot присылал, мне больше нравиться, там код поменьше и еще там числа в input меняются сразу как только я начал двигать, а у вас меняться число когда только отпустил ползунок
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
там числа в input меняются сразу как только я начал двигать, а у вас меняться число когда только отпустил ползунок
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>

$iMin = 0
$iMax = 999

$hGui = GUICreate('Slider', 300, 200)
$nSlider = GUICtrlCreateSlider(10, 40, 250, 30)
GUICtrlSetLimit(-1, $iMax, $iMin)
$nInput = GUICtrlCreateInput('', 60, 120, 60, 20)
$nLabel = GUICtrlCreateInput('', 180, 120, 60, 20, $ES_READONLY)
GUISetState()

GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')

While 1
	$iValue = GUICtrlRead($nSlider)
	GUICtrlSetData($nInput, StringFormat('0.%d', $iValue))
    GUICtrlSetData($nLabel, $iValue)

    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $iIDFrom, $iCode, $i_Read
    $iIDFrom = BitAND($iwParam, 0xFFFF)
    $iCode = BitShift($iwParam, 16)
    ;Switch $hWnd
    ;   Case $hGui
    Switch $iIDFrom
        Case $nInput
            Switch $iCode
                Case $EN_UPDATE
                    $i_Read = Number(StringRegExpReplace(GUICtrlRead($nInput), '[^\d]', ''))
                    If $i_Read < $iMin Then $i_Read = $iMin
                    If $i_Read > $iMax Then $i_Read = $iMax
                    If $i_Read Then
                        GUICtrlSetData($nInput, StringFormat('0.%d', $i_Read))
                    Else
                        GUICtrlSetData($nInput, '')
                    EndIf
                    GUICtrlSetData($nSlider, $i_Read)
                    GUICtrlSetData($nLabel, GUICtrlRead($nSlider))
            EndSwitch
    EndSwitch
    ;EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
 
Верх