Войти

Показать полную графическую версию : [решено] Вывод текста в заданном формате


san45
04-05-2009, 23:47
В общем надо чтобы при вводе текста в 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
надо чтобы при вводе текста в 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
Вот, пример:#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
Большое спасибо за оперативные ответы.

Creat0R »

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

GUICtrlSetData($Input_1, _StringAddThousandsSep($sInput_Read))

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

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

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

Спасибо.

beve
05-05-2009, 12:23
я понял в чем была обшибка. _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
Это символ с порядковым номером 160 (A0, 00A0)

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

beve
05-05-2009, 16:21
Это символ с порядковым номером 160 (A0, 00A0) »
Тогда подскажи как в этой функции: StringRegExpReplace($a,"*",""), чтоб можно было на форум вставить, вместо * вставить этот символ "A0", и чтоб функциональность функции не потерялась при копировании с форума и вставлении в Редактор.

SyDr
05-05-2009, 19:54
$S = Chr(160)
StringRegExpReplace($a, $S,"")

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

beve
05-05-2009, 22:05
Ну или сразу функцию на место вставить »
Все работает, пример свой исправил.

san45
06-05-2009, 07:43
Да там не совсем пробел, вначале тоже поставило в тупик. Короче поставил тысячным разделителем ",". Мне нужен был 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
какой тэг надо ставить, чтобы оформлять код в сообщении? »
Тег code как ни странно :)




© OSzone.net 2001-2012