گذاشتن عدد پشت هر سطرح EditText در B4A

با سلام خدمت تمامی دوستان عزیز

امروز تکه کدی کاربردی از آقای امیرحسین قاسمی براتون آماده کردیم که امیدواریم مفید و آموزنده باشه براتون

 

برای پیاده سازی قابلیت بالا باید به این شکل عمل کنیم:

ابتدا در دیزاینر یک ویو از نوع ادیت تکست می سازیم و طول و عرض آن را تنظیم می کنیم. (در برنامه بالا طول و عرض ادیت تکست که نام آن EditText1 است، به شکل زیر در دیزاینر تنظیم شده است) :

EditText1.SetLeftAndRight(0,100%x)
EditText1.SetTopAndBottom(0,100%y)

تیک دوتا کتابخونه JavaObject و EditTextPlus رو می زنیم.

دانلود کتابخونه EditTextPlus

حال یک سری متغیر نیاز داریم که در سرتاسر اکتویتی کار کند:

Sub Globals
	Private EditText1 As EditText
	Dim etplus As EditTextPlus
	Dim mylines As Int=0
	Dim temp As String
	Dim total As String=""
	Dim EnterClicked As Boolean=False
End Sub

بخش اکتویتی کریت:

به صورت پیشفرض هنگامی که کیبورد بالا می آید دکمه آن “انجام شد” است و ما برای اینکه بتوانیم خطوط جدیدی در ادیت تکست ایجاد کنیم (توی ادیت تکست اینتر بزنیم) باید یک سری کد در اکتویتی کریت قرار دهیم. و در خط آخر نیز گفته ایم که متن ها در کل ادیت تکست پخش شوند و ادیت تکست فقط یک خط نباشد.

Sub Activity_Create(FirstTime As Boolean)
	Activity.LoadLayout("Layout")
	Dim JO As JavaObject = EditText1
	JO.RunMethod("setImeOptions",Array As Object(KeyCodes.KEYCODE_ENTER))
	Dim O As Object = JO.CreateEvent("android.widget.TextView.OnEditorActionListener","Enter",Null)
	JO.RunMethod("setOnEditorActionListener",Array As Object(O))
	EditText1.SingleLine=False
End Sub

حال ساب های زیر را بین دو ساب دیگر قرار دهید:

Sub check(str As String)As Boolean
	If str.Contains(".") Then
		Try
		Dim before As Int=str.SubString2(0,str.IndexOf("."))
		temp=before&"."
		Return True
		Catch
		Return False
		End Try	
	End If
End Sub

Sub MySetSelection(position As Int)
	Dim jo As JavaObject= EditText1
	jo.RunMethod("setSelection",Array As Object(position))
End Sub

Sub MyGetSelectionStart As Object
	Dim jo As JavaObject=EditText1
	Return jo.RunMethod("getSelectionStart",Null)
End Sub

Sub Enter_Event(MethodName As String,Args() As Object) As Object
	If EnterClicked=False Then
	etplus.insertTextToCursorPosition(EditText1,CRLF&"‌")
	EnterClicked=True
	Return True
	Else
	EnterClicked=False
	Return True
	End If
End Sub

در بالا، ساب اول (check) بررسی می کنه که آیا قبلا متن یک خط شماره گذاری شده یا نه!

ساب دوم (MySetSelection) مکان Cursor یا همون خط چشمک زن توی ادیت تکست رو تنظیم می کنه.

ساب سوم (MyGetSelectionStart) مکان فعلی Cursor رو میگیره.

ساب چهارم (Enter_Event) هم رویداد کلیک روی دکمه اینتر توی کیبورد هست که توی این ساب گفتیم بیا برو خط بعدی. (این ساب دو بار پشت سر هم اجرا میشه و به همین دلیل با متغیر بولین کنترلش کردیم که فقط بار اول کدهای داخلش کار کنه و گرنه اگر این کار رو نمی کردیم با یک کلید دوتا اینتر می خورد!)

توجه کنید که نیازی به ساب های دوم و سوم نبود و می تونستیم با متدهای ادیت تکست که توی خود b4a هست نیز کارهای همین ساب ها رو انجام بدیم اما من ترجیح دادم خودم ساب هاشو بنویسم.

و اما مهمترین ساب این هست(این ساب رو هم مثل ساب های دیگه بین دوتا ساب قرار بدین) :

Private Sub EditText1_TextChanged (Old As String, new As String)
	Try
	If EditText1.Text<>total Then
		If EditText1.Text="" Then
			mylines=0
		End If
	If mylines<>etplus.getLineCount(EditText1) Then
		total=""
		mylines=etplus.getLineCount(EditText1)
		For i=1 To mylines
			Dim mylinestr As String=etplus.getTextOfALines(EditText1,i)
			If check(mylinestr) Then
				mylinestr=mylinestr.Replace(temp,"")
				Try
				mylinestr=mylinestr.Replace("‌","")
				Catch
				End Try
				mylinestr=i&"."&mylinestr
				If i<>mylines Then
					mylinestr=mylinestr&CRLF
				End If
				Else
					mylinestr=i&"."&mylinestr
				If i<>mylines Then
					mylinestr=mylinestr&CRLF
				End If
			End If
			total=total&mylinestr
		Next
		EditText1.Text=total
		MySetSelection(EditText1.Text.Length)
	End If
	End If
	Catch
	End Try	
End Sub

این ساب بالا زمانی اجرا میشه که متن داخل ادیت تکست تغییر کنه و شماره گذاری خطوط توی همین ساب انجام میشه. ممکنه کمی گیج کننده به نظر برسه اما اگه بشینید و تحلیلش کنید خیلی راحته.

-این قابلیت هم توی ادیت تکست های چپ چین و هم راست چین شده کار میکنه(هم برای متون فارسی و هم انگلیسی).

-توی این مثال نام ادیت تکست ما EditText1 بود اگه برای شما نامش فرق می کنه باید کل کلمات EditText1 توی کدها به نام ادیت تکست شما تغییر پیدا کنه.

هزینه استفاده از مطالب و کدهای این پست:  “۵ عدد صلوات بر محمد و آل محمد”

دیدگاهتان را بنویسید