PDA

View Full Version : سوال: بررسی اینکه کاربر در حال تایپ است یا نه !



imanx7
دوشنبه 20 بهمن 1393, 12:10 عصر
سلام ؛
دنباله کدی هستم که هنگامی کاربر در حال تایپ در Textbox ... خروجی بده کاربر در حال تایپه وقتی هم تایپ نکردن خروجی هیچی نده !
مثل وایبر...

ghasemloo
دوشنبه 20 بهمن 1393, 12:12 عصر
از رویداد textbox1_textchanged استفاده کن!!!

imanx7
دوشنبه 20 بهمن 1393, 12:22 عصر
از رویداد textbox1_textchanged استفاده کن!!!
:| دستت درد نکنه ...
نمیشه ؛
خودم یه متد نوشتم که زیاد جالب نیست دنبال یه دونه منطقی تر و بهتر میگردم !

Hadi-Hashemi
دوشنبه 20 بهمن 1393, 12:47 عصر
خب اگه Length متن Textbox مساوی 0 نباشه معلومه که داره تایپ میکنه. اشتباه میکنم؟

بیتا حکمت
دوشنبه 20 بهمن 1393, 12:49 عصر
خب اگه Length متن Textbox مساوی 0 نباشه معلومه که داره تایپ میکنه. اشتباه میکنم؟

خوب اگه کاربر چهار کاراکتر تایپ کرد و دیگه تایپ نکرد ، چی میشه ؟ در حال تایپه یا در حال تایپ نیست

Hadi-Hashemi
دوشنبه 20 بهمن 1393, 12:57 عصر
خوب اگه کاربر چهار کاراکتر تایپ کرد و دیگه تایپ نکرد ، چی میشه ؟ در حال تایپه یا در حال تایپ نیست

خب در حال تایپه دیگه. حتما که نباید تند تند تایپ کنه. در حال تایپ با الان داره تایپ میکنه فرق داره به نظر من. :لبخندساده:

imanx7
دوشنبه 20 بهمن 1393, 12:58 عصر
خب اگه Length متن Textbox مساوی 0 نباشه معلومه که داره تایپ میکنه. اشتباه میکنم؟
دقیقا همون چیزی که خانوم حکمت گفتن !

imanx7
دوشنبه 20 بهمن 1393, 13:00 عصر
خودم اومدم توو رویداد keypress دونه دونه کلید هارو چک کردم که اگه درحال فشرده شدن بود، کاربر در حال تایپ ... ولی به نظرم اصولی نیست !

Saman_12
دوشنبه 20 بهمن 1393, 13:24 عصر
به نظر من از وقتی که کاربر با عث فعال شدن TextBox میشه (GotFocus) داره ازش استفاده میکنه تا وقتی که کلید اینتر رو بزنه (تکست تک لاین) یا اینکه به نحوی غیر فعالش کنه (LostFocus).
حالا این فرایند میخواد چند ثانیه ای باشه یا بیشتر...

بیتا حکمت
دوشنبه 20 بهمن 1393, 13:28 عصر
خودم اومدم توو رویداد keypress دونه دونه کلید هارو چک کردم که اگه درحال فشرده شدن بود، کاربر در حال تایپ ... ولی به نظرم اصولی نیست !

یه تایمر بزارین ، بعد با استفاده از OnKeyPress (http://msdn.microsoft.com/en-us/library/system.windows.forms.control.onkeypress.aspx) آخرین کلید فشرده شده چی هست ، اگر بعد از فشرده شدن اخرین کلید ، کلید جدیدی فشرده شد کاربر در حال تایپ هست ، اگر بعد از اخرین
کلید کلیدی فشرده نشد کاربر در حال تایپ نیست . بعدش هم که پیاده سازی کردین کدشو بزارین منم استفاده کنم :لبخند:
فکر می کنم با تایمر و چک کردن طول Textbox هم بشه این کارو کرد ، مثلا" اگر در یک تاخیر میلی ثانیه ای اگر طول Text بیشتر نشد ، مشخص میشه که کاربر در حال تایپ نیست .

بیتا حکمت
دوشنبه 20 بهمن 1393, 13:31 عصر
به نظر من از وقتی که کاربر با عث فعال شدن TextBox میشه (GotFocus) داره ازش استفاده میکنه تا وقتی که کلید اینتر رو بزنه (تکست تک لاین) یا اینکه به نحوی غیر فعالش کنه (LostFocus).
حالا این فرایند میخواد چند ثانیه ای باشه یا بیشتر...

اما ممکنه کاربر روی TextBox کلیک کنه ، اما عملا" چیزی تایپ نکنه ، مثلا " قرار هست از روی یک عکس متنی رو تایپ کنه ، روی تکست کلیک کرده و عکس نگا می کنه ، اینجوری که شما میگین( با روش پیشنهادی شما ) ، اگه نشون داده بشه که شما در حال تایپ هستید چندان به نظر جالب نمیاد

imanx7
دوشنبه 20 بهمن 1393, 13:36 عصر
به نظر من از وقتی که کاربر با عث فعال شدن TextBox میشه (GotFocus) داره ازش استفاده میکنه تا وقتی که کلید اینتر رو بزنه (تکست تک لاین) یا اینکه به نحوی غیر فعالش کنه (LostFocus).
حالا این فرایند میخواد چند ثانیه ای باشه یا بیشتر...
اومدیم کاربر روش فوکس کرد ولی هیچی تایپ نکرد !

Saman_12
دوشنبه 20 بهمن 1393, 13:38 عصر
اما ممکنه کاربر روی TextBox کلیک کنه ، اما عملا" چیزی تایپ نکنه ، مثلا " قرار هست از روی یک عکس متنی رو تایپ کنه ، روی تکست کلیک کرده و عکس نگا می کنه ، اینجوری که شما میگین( با روش پیشنهادی شما ) ، اگه نشون داده بشه که شما در حال تایپ هستید چندان به نظر جالب نمیاد
به هر حال هدف کاربر تایپ کردن بوده اینکه در ذهن فرد چی میگذره غیر قابل فهم هست (حتی برای انسان).
باز هم همون حالت خوب هست اما اگر دوست داشتید میتونید ورود اولین کارکتر(یا متن) رو به عنوان شروع در نظر بگیرید.

بیتا حکمت
دوشنبه 20 بهمن 1393, 13:45 عصر
به هر حال هدف کاربر تایپ کردن بوده اینکه در ذهن فرد چی میگذره غیر قابل فهم هست (حتی برای انسان).
باز هم همون حالت خوب هست اما اگر دوست داشتید میتونید ورود اولین کارکتر(یا متن) رو به عنوان شروع در نظر بگیرید.

سلام . فکر کنم من و استارتر رو باهم اشتباه گرفتین :لبخند: ، در کل اگه پروژه خودم بود از روشی که شما گفتین استفاده می کردم اما " متن پیغام " رو تغییر می دادم مثلا" به جای اینکه بگم " شما در حال تایپ هستید " ، پیغام دیگری نشان می دادم( آماده تایپ ) :لبخند: ، اما برای کاری که استارتر خواسته مطلب پست شماره 10 رو مصلحت می دونم .

Saman_12
دوشنبه 20 بهمن 1393, 14:44 عصر
سلام . فکر کنم من و استارتر رو باهم اشتباه گرفتین :لبخند: ، در کل اگه پروژه خودم بود از روشی که شما گفتین استفاده می کردم اما " متن پیغام " رو تغییر می دادم مثلا" به جای اینکه بگم " شما در حال تایپ هستید " ، پیغام دیگری نشان می دادم( آماده تایپ ) :لبخند: ، اما برای کاری که استارتر خواسته مطلب پست شماره 10 رو مصلحت می دونم .
در هر دو قسمت مخاطب همه بودند.:بامزه:
حرف شما هم صحیح میشه یک فاصله زمانی حداکثر برای مد زمانی که کلیدی فشرده نشده یا متن تغییر نکرده در نظر گرفت :

using System;
using System.Threading;
using System.Windows.Forms;


public class Edit : TextBox
{


public Edit()
{


MaxDeActiveTime = 5000;
}


public event ActiveChangedEventHandler ActiveChanged;
public delegate void ActiveChangedEventHandler(bool isactive);


public Keys DeActiveKey {get;set;}
public Int32 MaxDeActiveTime { get; set; }
private bool _isactive = false;
public bool IsActive
{
get { return _isactive; }
}


protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);


if (e.KeyCode == DeActiveKey)
{
e.Handled = true;
_isactive = false;
if (ActiveChanged != null) { ActiveChanged(_isactive); }
}
else
{
if (IsActive == false)
{
_isactive = true;
if (ActiveChanged != null) { ActiveChanged(_isactive); }


Thread t_active = new Thread(CheckActive);
t_active.IsBackground = true;
t_active.Start();
}
}
}


protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);


_isactive = false;
if (ActiveChanged != null) { ActiveChanged(_isactive); }
}


private void CheckActive()
{
ManualResetEvent mre = new ManualResetEvent(false);
mre.WaitOne(MaxDeActiveTime);


if (_isactive == true)
{
_isactive = false;
if (ActiveChanged != null) { ActiveChanged(_isactive); }
}
}
}