PDA

View Full Version : KeyPress یکی برای همه



Navid Asadi
شنبه 14 شهریور 1388, 13:29 عصر
سلام دوستان
من تو برنامه ام میخوام اگه کاربر به مدت X دقیقه با برنامه کار نکرد برنامه پسورد بخواد...
خوب من بیش از 10 تا فرم و کلی تکست باکس و... دارم...
حالا اگه بخوام تو Key Down یا Key press همشون تایم رو صفر کنم کار خیلی سخت میشه...
من یجا دیده بودم که تو یکی از خاصیت های فرم یه کد نوشته بودن و این کد برای key Down تمام کنترل های روی فرم کار می کرد...
حالا من چطور میتونم این کار رو بکنم؟

ALI TT
شنبه 14 شهریور 1388, 13:38 عصر
می تونی یه رویداد بسازی و با همه رو بش وصل کنی .

اگه برنامت طوری هستش که کاربر مدام از این تکس باکس میره اون تکس باکس .. می تونی تایمر رو طوری تنظیم کنی که مثلا هر x دقیقه فکوس بودن (فعال بودن) کنترل رو ذخیره و بعد از همون x دقیقه با فکوس فعلی مقایسه کنه و اگه فرق کرده بود یعنی کاربر با برنامه کاری انجام داده . اینطوری کدی خیلی سبک تری استفاده کردی

bastakboys
شنبه 14 شهریور 1388, 18:38 عصر
سلام دوستان
من تو برنامه ام میخوام اگه کاربر به مدت X دقیقه با برنامه کار نکرد برنامه پسورد بخواد...
خوب من بیش از 10 تا فرم و کلی تکست باکس و... دارم...
حالا اگه بخوام تو Key Down یا Key press همشون تایم رو صفر کنم کار خیلی سخت میشه...
من یجا دیده بودم که تو یکی از خاصیت های فرم یه کد نوشته بودن و این کد برای key Down تمام کنترل های روی فرم کار می کرد...
حالا من چطور میتونم این کار رو بکنم؟
به این مثال توجه کن
من با این مثال تمام تکست باکسها را فقط عددی کردم


Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress, TextBox6.KeyPress, TextBox7.KeyPress, TextBox8.KeyPress, TextBox9.KeyPress, TextBox10.KeyPress
If Not Char.IsNumber(e.KeyChar) Then
e.Handled = True
End If
End Sub

mlf_mlv
شنبه 14 شهریور 1388, 18:53 عصر
نمی دونم شاید من سوالتون رو متوجه نشدم ولی می تونی 1 تایمر تو فرم اصلیت که هیچ وقت بسته نمی شه بندازی بعد تو keypress فرمت(همشون) بگی که اگه هر کلیدی فشار داده شد تایمرت 0 بشه. برای این کار هم می تونی از یه متغیر استفاده کنی. اگه من منظورت رو متوجه نشدم یا تو منظورم رو متوجه نشدی بگو.

Navid Asadi
شنبه 14 شهریور 1388, 23:35 عصر
bastakboys (http://barnamenevis.org/forum/member.php?u=62961)
کار خیلی جالبی هستش هنوز امتحانش نکردم اما فکر کنم همون چیزی که میخوام البته من خیلی کنترل رو فرمم دارم...
mlf_mlv (http://barnamenevis.org/forum/member.php?u=66417)
دوست عزیز من همه کار هایی رو که گفتی انجام داده بودم و اگه متن پست اولم رو خوب می خوندی متوجه میشدی... مشکل من اینه که نمی خوام تو رویداد بیش از 100 تا کنترل یک چیز رو بنویسم...

ALI TT (http://barnamenevis.org/forum/member.php?u=63303)
کار شما هم جالب و کوتاه تر از بقیه به نظر میرسه به هر حال متشکرم...


دوستان هیچ کدوم از این راه ها به اندازه ی اونی که من به طور اتفاقی دیدم کوتاه و سریع نیست به هر حال متشکرم و منتظر پاسخ های کامل ترم...

Navid Asadi
شنبه 14 شهریور 1388, 23:53 عصر
ALI TT (http://barnamenevis.org/forum/member.php?u=63303)

راستی یادم رفت بپرسم چطور اسم کنترلی رو که فکوس روشه بدست بیارم؟

ALI TT
یک شنبه 15 شهریور 1388, 01:37 صبح
با کد زیر می تونی :

For Each i As Control In Me.Controls

If i.Focus Then



End If

Next

اما اگه تکس باکس ها رو روی یک Panel یا هر چیزی که اونا رو ازبقیه آیتمها (مثل لیبلها و ...) جدا کنه قرار بدی ... کار زودتر و دقیق تر انجام میشه . بعد اون وقت می تونی از کد زیر استفاده کنی :

For Each i As TextBox In Panel1.Controls

If i.Focus Then

End If

Next

که Me به Panel و Control به TextBox تغییر کرده

Navid Asadi
یک شنبه 15 شهریور 1388, 10:07 صبح
ALI TT (http://barnamenevis.org/forum/member.php?u=63303)

متشکرم
اون چیزی که دیده بودم این شکلی بود فقط نمیدونم این دستور رو در کدوم رویداد بنویسم؟

mlf_mlv
یک شنبه 15 شهریور 1388, 12:26 عصر
bastakboys (http://barnamenevis.org/forum/member.php?u=62961)
کار خیلی جالبی هستش هنوز امتحانش نکردم اما فکر کنم همون چیزی که میخوام البته من خیلی کنترل رو فرمم دارم...
mlf_mlv (http://barnamenevis.org/forum/member.php?u=66417)
دوست عزیز من همه کار هایی رو که گفتی انجام داده بودم و اگه متن پست اولم رو خوب می خوندی متوجه میشدی... مشکل من اینه که نمی خوام تو رویداد بیش از 100 تا کنترل یک چیز رو بنویسم...

ALI TT (http://barnamenevis.org/forum/member.php?u=63303)
کار شما هم جالب و کوتاه تر از بقیه به نظر میرسه به هر حال متشکرم...


دوستان هیچ کدوم از این راه ها به اندازه ی اونی که من به طور اتفاقی دیدم کوتاه و سریع نیست به هر حال متشکرم و منتظر پاسخ های کامل ترم...
منظورم رو متوجه نشودی. فقط تو keypress فرمت باید این کد رو وارد کنی.

milad.biroonvand
یک شنبه 15 شهریور 1388, 12:50 عصر
به این مثال توجه کن
من با این مثال تمام تکست باکسها را فقط عددی کردم


Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress, TextBox6.KeyPress, TextBox7.KeyPress, TextBox8.KeyPress, TextBox9.KeyPress, TextBox10.KeyPress
If Not Char.IsNumber(e.KeyChar) Then
e.Handled = True
End If
End Sub




همین طور که این دوستومن گفته درسته


Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress, TextBox6.KeyPress, TextBox7.KeyPress, TextBox8.KeyPress, TextBox9.KeyPress, TextBox10.KeyPress
If Not Char.IsNumber(e.KeyChar) Then
e.Handled = True
End If
End Sub

Navid Asadi
یک شنبه 15 شهریور 1388, 14:57 عصر
نمی دونم شاید من سوالتون رو متوجه نشدم ولی می تونی 1 تایمر تو فرم اصلیت که هیچ وقت بسته نمی شه بندازی بعد تو keypress فرمت(همشون) بگی که اگه هر کلیدی فشار داده شد تایمرت 0 بشه. برای این کار هم می تونی از یه متغیر استفاده کنی. اگه من منظورت رو متوجه نشدم یا تو منظورم رو متوجه نشدی بگو.
خوب من این کار رو انجام دادم ام یک مشکل بزرگ اونم اینه که هر بار تایمر میاد چک کنه کنترلم فکوسش رو از دست میده...

ALI TT
یک شنبه 15 شهریور 1388, 15:33 عصر
تمام روشهایی که دوستان میگن درسته ، ولی اگر ما 20 تا یا بیشتر TextBox داشته باشیم تعداد فراخوانی دستور مربوط به رویداد زیاد میشه و برنامه پردازش الکی میکنه . ما فقط می خوایم ببینیم بعد x دقیقه آیا اتفاقی افتاده ، یا نه .
مثلا اگه 20 تا تکس باکس وجود داشته باشه و کاربر توی هر کدوم یک کلمه ی 15 حرفی بنویسه 300 با دستور زیر اجرا میشه !!!!!!

Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress, TextBox6.KeyPress, TextBox7.KeyPress, TextBox8.KeyPress, TextBox9.KeyPress, TextBox10.KeyPress

Time = 0

End Sub
ALI TT (http://barnamenevis.org/forum/member.php?u=63303)

متشکرم
اون چیزی که دیده بودم این شکلی بود فقط نمیدونم این دستور رو در کدوم رویداد بنویسم؟

در رویداد Tick تایمر دیگه . نام کنترلی که فوکس قبلا روش بوده رو می تونی این طوری بررسی کنی :

Dim NameFocus As String = TextBox1.Name
For Each i As TextBox In Panel1.Controls

If i.Focus Then

If NameFocus = i.Name Then
Timer1.Stop()
'Open Password Dialog
End If
NameFocus = i.Name

End If

Nextتایمر رو Stop کردم ... وقتی پسورد را وارد کرد می تونی Timer رو Start کنی