Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Вывод текста в заданном формате (http://forum.oszone.net/showthread.php?t=139317)

san45 04-05-2009 23:47 1110821

Вывод текста в заданном формате
 
В общем надо чтобы при вводе текста в Input/edit введенный текст отображался в заданном формате в частности через _StringAddThousandsSep, т.е
я ввожу "123456789", а СРАЗУ выводится "123 456 789"("123,456,789"), или ввожу "абв" а выводится "АААБББВВВ" и т.п.

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg
Local $hWndFrom, $iIDFrom, $iCode
$hWndFrom = $ilParam
$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
Switch $iIDFrom
Case $input1
Switch $iCode
Case $EN_CHANGE
$a=GUICtrlRead($input1)
GUICtrlSetData($input1, _StringAddThousandsSep($a))
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND

Хелп плз.

Creat0R 05-05-2009 01:05 1110862

Цитата:

Цитата san45
надо чтобы при вводе текста в Input/edit введенный текст отображался в заданном формате »

Код:

#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <String.au3>

GUICreate("Input Changed Demo GUI", 300, 140)

$Input_1 = GUICtrlCreateInput("Input 1", 20, 20, 260, 20)

$Exit = GUICtrlCreateButton("Exit", 20, 110, 60, 20)

GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $Exit
            ExitLoop
    EndSwitch
WEnd

Func
WM_COMMAND($hWnd, $msg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0xFFFF)
    Local $hCtrl = $lParam

    Switch $nID
        Case $Input_1
            Switch $nNotifyCode
                Case $EN_CHANGE, $EN_UPDATE
                    Local $sInput_Read = GUICtrlRead($Input_1)

                    If $sInput_Read == "абв" Then
                        Local $aChars = StringSplit($sInput_Read, "")

                        $sInput_Read = ""

                        For $i = 1 To $aChars[0]
                            $sInput_Read &= $aChars[$i] & $aChars[$i] & $aChars[$i]
                        Next

                        GUICtrlSetData($Input_1, StringUpper($sInput_Read))
                    ElseIf StringRegExp($sInput_Read, "\d+") Then
                        GUICtrlSetData($Input_1, _StringAddThousandsSep($sInput_Read))
                    EndIf
            EndSwitch
    EndSwitch

    Return $GUI_RUNDEFMSG
EndFunc


beve 05-05-2009 02:54 1110916

Вот, пример:
Код:

#include <String.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hGui = GUICreate("Form", 320, 40, 192, 185)
$Input =
GUICtrlCreateInput("", 8, 8, 249, 21,$ES_UPPERCASE)
$Ok_Button =
GUICtrlCreateButton("Ok", 264, 7, 49, 23)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
While 1
$msg =
GUIGetMsg()
Select
Case
$msg = $GUI_EVENT_CLOSE
   
Exit
Case
$msg = $Ok_Button
    $R
=
GUICtrlRead($Input)
   
GUIDelete($hGui)
   
MsgBox(0,"Результат",$R)
   
Exit
EndSelect
WEnd

Func
WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg
Local $hWndFrom, $iIDFrom, $iCode
$hWndFrom
= $ilParam
$iIDFrom
= BitAND($iwParam, 0xFFFF)
; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
Switch $iIDFrom
Case $Input
Switch $iCode
Case $EN_CHANGE

$a
=
GUICtrlRead($Input)
if StringIsDigit(
StringRegExpReplace($a,"(.).*","\1")) then
$a1=
StringRegExpReplace($a,Chr(160),"")
GUICtrlSetData($input,_StringAddThousandsSep($a1))
else
$c=
StringRegExpReplace($a,"(.*)(.)","$1$2$2$2")
GUICtrlSetData($input,$c)
endif
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc
;==>WM_COMMAND


san45 05-05-2009 07:41 1110961

Большое спасибо за оперативные ответы.

Цитата:

Цитата Creat0R
Creat0R »

Вы по сути предложили то же, что я делал

GUICtrlSetData($Input_1, _StringAddThousandsSep($sInput_Read))

но это не работает: при вводе 123456789 он выдает 1,23456789

Спасибо beve, я понял в чем была обшибка. _StringAddThousandsSep не правильно обрабатывает строку с пробелами(которые сам и ставил), т.е "1 2345" превращались "1,2345". Надо было просто каждый раз убирать пробелы.

Цитата:

Цитата beve
Вот, в прикрепленном файле пример, а то как я не старался, при копировании на форум, скрипт стает, нерабочий... »

Спасибо.

beve 05-05-2009 12:23 1111147

Цитата:

Цитата san45
я понял в чем была обшибка. _StringAddThousandsSep не правильно обрабатывает строку с пробелами(которые сам и ставил), т.е "1 2345" превращались "1,2345". Надо было просто каждый раз убирать пробелы. »

Думаеш, причина в пробелах? Нет, там не пробел. Сам намучался, попробуй, набери число этак знаков 12, там где ты просто будеш заменять пробел, увидиш...
А там в моем примере StringRegExpReplase заменяет не пробел(хотя оно и выглядит как пробел)...
Там не пробел, а то что в параметре "sThousand", по адресу:[HKEY_CURRENT_USER\Control Panel\International] А что оно, пока не знаю...если бы кто объяснил...
P.S. или это только в меня этот глюк в системе, везде пишут, что там в реестре именно пробел, и выглядит оно как пробел, но если ставить пробел в функции $a1=StringRegExpReplace($a,"*","") - не работает, а если значение из реестра, то Гуд... :o Вот, значение из реестра, при копировании сюда на форум заменяется звездочкой почемуто...

SyDr 05-05-2009 15:36 1111273

Это символ с порядковым номером 160 (A0, 00A0)

У обычного пробела порядковый номер 32 (20, 0020)

beve 05-05-2009 16:21 1111313

Цитата:

Цитата Sylver Dragon
Это символ с порядковым номером 160 (A0, 00A0) »

Тогда подскажи как в этой функции: StringRegExpReplace($a,"*",""), чтоб можно было на форум вставить, вместо * вставить этот символ "A0", и чтоб функциональность функции не потерялась при копировании с форума и вставлении в Редактор.

SyDr 05-05-2009 19:54 1111472

$S = Chr(160)
StringRegExpReplace($a, $S,"")

Ну или сразу функцию на место вставить.

beve 05-05-2009 22:05 1111612

Цитата:

Цитата Sylver Dragon
Ну или сразу функцию на место вставить »

Все работает, пример свой исправил.

san45 06-05-2009 07:43 1111792

Да там не совсем пробел, вначале тоже поставило в тупик. Короче поставил тысячным разделителем ",". Мне нужен был input-калькулятор, вто что вышло

Код:

#include <String.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <array.au3>

$hGui = GUICreate("Form", 320, 40, 192, 185)
$Input = GUICtrlCreateInput("", 8, 8, 249, 21,BitOR($ES_RIGHT,$ES_AUTOHSCROLL))
$Ok_Button = GUICtrlCreateButton("Ok", 264, 7, 49, 23)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
        Exit
Case $msg = $Ok_Button
        $z=GUICtrlRead($Input)
        GUICtrlSetData($input,Execute(StringReplace($z,",","")))
EndSelect
WEnd

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
#forceref $hWnd, $iMsg
Local $hWndFrom, $iIDFrom, $iCode
$hWndFrom = $ilParam
$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
Switch $iIDFrom
        Case $Input
                Switch $iCode
                        Case $EN_CHANGE
                                $str=GUICtrlRead($Input)
                                If StringRegExp($str, ".*\.\z") Then ContinueCase ; если введена десятичная точка, не обрабатывать через _StringAddThousandsSep, иначе он ее уберет
                                $x=StringRegExp($str, "[0-9,.]+\z", 1)
                                If @error=0 Then
                                        $str=StringReplace($str, $x[0], _StringAddThousandsSep(StringReplace($x[0],",",""),",","."))
                                        GUICtrlSetData($input, $str)
                                EndIf
                EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND

Спасибо всем.

Creat0R 06-05-2009 11:30 1111920

Цитата:

Цитата san45
какой тэг надо ставить, чтобы оформлять код в сообщении? »

Тег code как ни странно :)


Время: 22:53.

Время: 22:53.
© OSzone.net 2001-