چگونه بصورت خودکار زبان کیبورد را در ویژوال بیسیک تغییر دهیم ؟ اگر طراحی برنامه ای را در دست دارید و تمایل دارید مقادیری که کاربران در برنامه وارد میکنند به دلخواه شما یا به عبارتی دیگر راحتی کار را برای کاربران بخواهید یکی از این راه ها استفاده از تغییرات اتوماتیک مقادیر در Text Box ها هست یعنی اگر میخواهید کاربر نام فارسی را در Text Box تایپ کند باید اتوماتیک زبان کیبورد تغییر کند برای این منظور شما از ابزار های واژوال استادیو نمیتوانید استفاده کنید و فقط باید از کد نویسی بهره ببرید در ادامه بنده دو Text Box روی فرم قرار میدهم که با کد های زیر میتوانم بگویم text Box اول فارسی تایپ شود و Text Box دوم زبان دیگری مثل انگلیسی. ضمناً شما میتوانید با تکنیک های RequiredFieldValidator ورود داده های کاربران رو کنترل کنید.در قدم اول قطعه کد زیر را در بالای کلاس اصلی یعنی General قرار دهید:
Imports System.Globalization
سپس نوع زبان های مورد نظر را در پایین نام کلاس بنویسید در این مثال ما دو زبان انتخاب کرده ایم
Public Class Form1
Private PersianInput As InputLanguage
Private EnglishInput As InputLanguage
End Class
در Form Load برنامه تکه کد زیر را قرار میدهیم به این صورت که در ابتدا یک مقدار اولیه به PersianInput و EnglishInput میدهیم.
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
PersianInput = InputLanguage.CurrentInputLanguage
EnglishInput = InputLanguage.CurrentInputLanguage
Dim count As Integer
count = InputLanguage.InstalledInputLanguages.Count
For i As Integer = 1 To (count - 1)
If InputLanguage.InstalledInputLanguages(i).LayoutName.Contains("Persian") = True Then
PersianInput = InputLanguage.InstalledInputLanguages(i)
Else
If InputLanguage.InstalledInputLanguages(i).LayoutName.Contains("English") = True Then
EnglishInput = InputLanguage.InstalledInputLanguages(i)
End If
End If
Next i
End Sub
قدم بعدی کمی سلیقه ای هست و شما میتوانید نسبت به سلیقه تون بگید که پس از کدام رویداد این اتفاق بیوفتد در این مثال بنده پس از رویداد Mouse Enter این اقدام رو انجام دادم شما میتوانید هر رویدادی رو برای برنامه تون انتخاب کنید یا تمام رویداد ها مثل mouse Down ,Text change و ... که در این صورت کاربر به هر روشی به Text Box بعدی رفت اتوماتیک این اتفاق برای کیبوردش بیوفتد و نخواهد هر بار زبان کیبورد را تغییر دهد
کد های زیر به ترتیب برای Text Box های فارسی و انگلیسی هستند که در ادامه خواهید دید
Private Sub FaTextBox_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FaTextBox.MouseEnter
InputLanguage.CurrentInputLanguage = PersianInput
End Sub
Private Sub EnTextBox_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EnTextBox.MouseEnter
InputLanguage.CurrentInputLanguage = EnglishInput
End Sub
تصویر زیر نمونه ای کامل از این کد هست :
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
PersianInput = InputLanguage.CurrentInputLanguage
EnglishInput = InputLanguage.CurrentInputLanguage
Dim count As Integer
count = InputLanguage.InstalledInputLanguages.Count
For i As Integer = 1 To (count - 1)
If InputLanguage.InstalledInputLanguages(i).LayoutName.Contains("Persian") = True Then
PersianInput = InputLanguage.InstalledInputLanguages(i)
Else
If InputLanguage.InstalledInputLanguages(i).LayoutName.Contains("English") = True Then
EnglishInput = InputLanguage.InstalledInputLanguages(i)
End If
End If
Next i
End Sub
Private Sub FaTextBox_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FaTextBox.MouseEnter
InputLanguage.CurrentInputLanguage = PersianInput
End Sub
Private Sub EnTextBox_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EnTextBox.MouseEnter
InputLanguage.CurrentInputLanguage = EnglishInput
End Sub
End Class
من با اين كد تونستم جواب بگيرم :
Private Sub txt_name_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles txt_name.MouseClick Dim myCulture As New Globalization.CultureInfo("fa-IR") InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(myCulture) End Subكه كلا زبان سيستم فارسي شد .
بعدش براي اينكه تكست باكس ايميل ،انگلسي تايپ بشه اين كارو كردم :
اين متغير رو تعريف كردم :
و در رويداد enter نوشتم :
Private Sub txt_address_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_address.Enter InputLanguage.CurrentInputLanguage = englishinput End Subبه خاطر رویداد Key Down یا Key Press هست اگر فقط روی Mouse Enter تنظیم کنید این مشکل براتون رفع میشه.
يه چيزي كه الان ديدم :
وقتي ازش اجرا ميگيرم كه همون انگليسي تايپ ميشه . بعد وقتي خودم زبان رو فارسي مي كنم ، فقط يك حرف رو فارسي مي نويسه و دوباره خودكار انگليسي اش مي كنه .
ببینید این برنامه 100% روی سیستم من کار میکنه . هیچ ایرادی هم توش نیست شما برنامه رو روی سیستم دیگه هم چک کنید ممکنه ایراد از زبان سیستم باشه.
اين PersianInput كلمه كليديه ؟
من هنوز جواب نگرفتم . ممكنه مربوط به زبان سيستمم باشه ؟
کمی تغییرات داشت ، انجام شد ، براتون ارسال کردم ، مخصوصاً زمانی که شما روی دکمه جدید ، ویرایش،جذف،جست و جو کلیک میکنید باید اون خطی که مربوط به تغییر کیبورد میشه رو در ابتدا داشته باشید.
كل كدهاي نوشته شده را گذاشتم .
كجاش اشتباست ؟
Imports System.Globalization Public Class Form1 Private jadid As Boolean = False Private virayesh As Boolean = False Private phoneid As Integer Private hazf As Boolean = False Private persianinput As InputLanguage Private englishinput As InputLanguage Private Sub frm_telbook_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Tb_phoneTableAdapter1.Fill(PhonebookDataSet1.tb_phone) persianinput = InputLanguage.CurrentInputLanguage englishinput = InputLanguage.CurrentInputLanguage Dim count As Integer count = InputLanguage.InstalledInputLanguages.Count For i As Integer = 1 To (count - 1) If InputLanguage.InstalledInputLanguages(i).LayoutName.Contains("farsi") = True Then persianinput = InputLanguage.InstalledInputLanguages(i) Else If InputLanguage.InstalledInputLanguages(i).LayoutName.Contains("english") = True Then englishinput = InputLanguage.InstalledInputLanguages(i) End If End If Next i End Sub Private Sub btn_new_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_new.Click txt_name.Clear() txt_family.Clear() txt_company.Clear() txt_mobile.Clear() txt_tel.Clear() txt_address.Clear() groupBox1.Enabled = True DataGridView1.Enabled = True txt_name.Focus() jadid = True btn_edit.Enabled = False btn_del.Enabled = False btn_save.Enabled = True btn_save.Text = "جديد " End Sub Private Sub btn_edit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_edit.Click groupBox1.Enabled = True DataGridView1.Enabled = True txt_name.Focus() virayesh = True btn_new.Enabled = False btn_del.Enabled = False btn_save.Enabled = True btn_save.Text = "ويرايش" txt_name.Clear() txt_family.Clear() txt_company.Clear() txt_mobile.Clear() txt_tel.Clear() txt_address.Clear() End Sub Private Sub DataGridView1_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGridView1.DoubleClick If DataGridView1.Rows.Count > 0 Then txt_name.Text = DataGridView1.CurrentRow.Cells("tname").Value.ToString txt_family.Text = DataGridView1.CurrentRow.Cells("tfamily").Value.ToString txt_company.Text = DataGridView1.CurrentRow.Cells("tcompany").Value.ToString txt_mobile.Text = DataGridView1.CurrentRow.Cells("tmobile").Value.ToString txt_tel.Text = DataGridView1.CurrentRow.Cells("ttel").Value.ToString txt_address.Text = DataGridView1.CurrentRow.Cells("temail").Value.ToString ph End If End Sub Private Sub btn_del_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_del.Click groupBox1.Enabled = True DataGridView1.Enabled = True btn_save.Enabled = True btn_save.Text = "حذف" hazf = True btn_edit.Enabled = False btn_new.Enabled = False txt_name.Clear() txt_family.Clear() txt_company.Clear() txt_mobile.Clear() txt_tel.Clear() txt_address.Clear() End Sub Private Sub btn_save_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_save.Click If jadid Or virayesh Then If (String.IsNullOrEmpty(txt_name.Text.Trim())) Or (String.IsNullOrEmpty(txt_family.Text())) Then MessageBox.Show("لطفا اطلاعات را كامل كنيد . ") ElseIf jadid Then Tb_phoneTableAdapter1.Insert(txt_name.Text, txt_family.Text, txt_company.Text, txt_mobile.Text, txt_tel.Text, txt_address.Text) MessageBox.Show("اطلاعات وارد شد ") Tb_phoneTableAdapter1.Fill(PhonebookDataSet1.tb_phone) groupBox1.Enabled = False DataGridView1.Enabled = False jadid = False btn_save.Enabled = False btn_edit.Enabled = True btn_del.Enabled = True btn_save.Text = "ذخيره تغييرات " Else Tb_phoneTableAdapter1.UpdateQuery(txt_name.Text, txt_family.Text, txt_company.Text, txt_mobile.Text, txt_tel.Text, txt_address.Text, phoneid) MessageBox.Show("اطلاعات ويرايش شد .") virayesh = False Tb_phoneTableAdapter1.Fill(PhonebookDataSet1.tb_phone) groupBox1.Enabled = False DataGridView1.Enabled = False btn_save.Enabled = False btn_new.Enabled = True btn_del.Enabled = True btn_save.Text = "ذخيره تغييرات " End If ElseIf hazf Then If DataGridView1.Rows.Count > 0 Then If MessageBox.Show("آيا براي حذف مطمئن هستيد ؟", "حذف اطلاعات", MessageBoxButtons.YesNo) = DialogResult.Yes Then ph Tb_phoneTableAdapter1.DeleteQuery(phoneid) Tb_phoneTableAdapter1.Fill(PhonebookDataSet1.tb_phone) btn_new.Enabled = True btn_edit.Enabled = True btn_save.Enabled = True groupBox1.Enabled = False DataGridView1.Enabled = False txt_name.Clear() txt_family.Clear() txt_company.Clear() txt_mobile.Clear() txt_tel.Clear() txt_address.Clear() End If End If End If End Sub Private Sub btn_serch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_serch.Click btn_del.Enabled = False btn_new.Enabled = False btn_edit.Enabled = False groupBox1.Enabled = True txt_name.Focus() End Sub Private Sub txt_family_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_family.TextChanged Tb_phoneTableAdapter1.FillBy(PhonebookDataSet1.tb_phone, txt_family.Text + "%") End Sub Private Sub txt_name_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_name.TextChanged Tb_phoneTableAdapter1.FillBy1(PhonebookDataSet1.tb_phone, txt_name.Text + "%") End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Close() End Sub Private Sub btn_cancell_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_cancell.Click btn_new.Enabled = True btn_edit.Enabled = True btn_del.Enabled = True jadid = False virayesh = False hazf = False txt_name.Clear() txt_family.Clear() txt_company.Clear() txt_mobile.Clear() txt_tel.Clear() txt_address.Clear() End Sub Private Sub txt_name_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_name.MouseEnter InputLanguage.CurrentInputLanguage = persianinput End Sub Private Sub txt_address_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txt_address.TextChanged InputLanguage.CurrentInputLanguage = englishinput End Sub Private Sub txt_name_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txt_name.KeyDown InputLanguage.CurrentInputLanguage = persianinput End Sub End Classشک نکنید که یه جای کد شما میلنگه وگرنه همه چیز درسته چون من دارم خروجی میگیرم ازش یه جای دیگه آپلود کردم از لینک زیر اقدام به دانلود کنید.
دانلود فایل
منم براي همين رويداد بررسي كردم . ارور نميده . ولي تكست باكسي كه مي خوام فارسي بنويسه رو بدون هيچ تغييري ،همون انگليسي مي نويسه .
لينك دانلود هم باز نميشه به علت ترافيك سنگين .
ولي من بازم چك كردم ،همه چي رو سر جاي خودش نوشتم .