Показать сообщение отдельно
Старый 24.07.2009, 02:32   #8
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Подсчет и ограничение символов в Input()

Global ImperCoolInput_LastUpdTime%=0
Global ImperCoolInput_Cur%=0

Type ImperCoolInput
	Field S$
	Field Focus%
	Field x%
	Field y%
	Field H%
	Field W%
	Field MLen%
End Type

Function ImperCoolInput_Create.ImperCoolInput(x%,y%,L%,H%)
	ICI.ImperCoolInput=New ImperCoolInput
	ICI\x=x
	ICI\y=y
	ICI\MLen=L
	ICI\H=H
	ICI\W=ICI\MLen*StringWidth("W")
	ICI\S=""
	ICI\Focus=False
	Return ICI
End Function

Function ImperCoolInput_Delete(ICI.ImperCoolInput)
	If ICI=Null Return
	Delete ICI
End Function

Function ImperCoolInput_Draw(ICI.ImperCoolInput,Cur%)
	If ICI=Null Return
	Color 224,223,227
	Rect ICI\x,ICI\y,ICI\W+1,ICI\H
	If ICI\Focus
		If Cur
			Color 0,0,0
			Rect ICI\x+StringWidth(ICI\S)+1,ICI\y+1,4,ICI\H-2
		EndIf
	EndIf
	Color 0,0,0
	Text ICI\x,ICI\y,ICI\S
End Function

Function ImperCoolInput_INPUT(ICI.ImperCoolInput)
	If ICI=Null Return
	Local c%=GetKey()
	If Not c Return
	Select c
		Case 8
			If Len(ICI\S)
				ICI\S=Left(ICI\S,Len(ICI\S)-1)
			EndIf
		Default
			If Len(ICI\S)<ICI\MLen
				ICI\S=ICI\S+Chr(c)
			EndIf
	End Select
End Function

Function ImperCoolInput_GetText$(ICI.ImperCoolInput)
	Return ICI\S
End Function

Function ImperCoolInput_SetFocus(ICI.ImperCoolInput,FL=True)
	If ICI=Null Return
	If FL
		ImperCoolInput_SetFocus(ImperCoolInput_GetFocus(),False)
	EndIf
	ICI\Focus=FL
End Function

Function ImperCoolInput_GetFocus.ImperCoolInput()
	For ICI.ImperCoolInput=Each ImperCoolInput
		If ICI\Focus
			Return ICI
		EndIf
	Next	
End Function

Function ImperCoolInput_GetCoordSel.ImperCoolInput(x%,y%)
	For ICI.ImperCoolInput=Each ImperCoolInput
		If x>ICI\x And x<=ICI\x+ICI\W And y>ICI\y And y<ICI\y+ICI\H
			Return ICI
		EndIf
	Next	
End Function

Function ImperCoolInput_DrawAll()
	If MilliSecs()-ImperCoolInput_LastUpdTime>=500
		ImperCoolInput_LastUpdTime=MilliSecs()
		ImperCoolInput_Cur=Not ImperCoolInput_Cur
	EndIf
	For ICI.ImperCoolInput=Each ImperCoolInput
		ImperCoolInput_Draw(ICI,ImperCoolInput_Cur)
	Next
End Function

Function ImperCoolInput_UpdateAll()
	For ICI.ImperCoolInput=Each ImperCoolInput
		If ICI\Focus
			ImperCoolInput_INPUT(ICI)
		EndIf
	Next
End Function

Function ImperCoolInput_DeleteAll()
	For ICI.ImperCoolInput=Each ImperCoolInput
		ImperCoolInput_Delete(ICI)
	Next
End Function
;==================
;DEMO CODE

Graphics 800,600,32
SetBuffer BackBuffer()
Local Font=LoadFont("Arial cyr",30)
SetFont Font
Local A.ImperCoolInput
A=ImperCoolInput_Create(10,10,5,FontHeight())
A=ImperCoolInput_Create(10,10+FontHeight()*2,6,FontHeight())
A=ImperCoolInput_Create(10,10+FontHeight()*4,10,FontHeight())
A=ImperCoolInput_Create(10,10+FontHeight()*6,15,FontHeight())
ImperCoolInput_SetFocus(A)

While Not KeyHit(1)
	Cls
	If MouseHit(1)
		ImperCoolInput_SetFocus(ImperCoolInput_GetCoordSel(MouseX(),MouseY()))
		A=ImperCoolInput_GetFocus()
	EndIf
	ImperCoolInput_UpdateAll()
	ImperCoolInput_DrawAll()
	AppTitle "current Text= "+ImperCoolInput_GetText(A)
	Flip
Wend
ImperCoolInput_DeleteAll()
End
БЛИН! Пишу ГовноКод только потому, что убивает - элементарная задача,а решения до сих пор не видать!
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 6 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
ABTOMAT (24.07.2009), ArtemkA (24.07.2009), Nex (24.07.2009), NitE (24.07.2009), Randomize (13.08.2009), tormoz (24.07.2009)