עבור לתוכן

פוקוס C#

Featured Replies

פורסם

יש לי תוכנית שכתובה ב-WINFORM ואני רוצה שהיא תעשה פעולה מסויימת איך שהעכבר עוזב את התיבה ועובר לתיבה אחרת, אני יודע שיש אפשרות כזו אבל אני לא מוצא אותה.

פורסם

בתיבה אתה צריך להרשם ל-event בשם MouseLeave ולהכניס שם את הפעולה שאתה רוצה שתבוצע.

פורסם
  • מחבר

אפשר בבקשה דוגמא על מה בדיוק להירשם ?

זו המתודה שלי שעובדת בעקבות הלחיצה:


private void button1_Click(object sender, EventArgs e)
{
long number = long.Parse(tbNumber.Text);
Task<bool> CheckNumberTask = new Task<bool>(CheckIfPrime, number);
CheckNumberTask.Start();
bool result = CheckNumberTask.Result;
lbResult.Text += " " + result;
}

פורסם

תלחץ על התיבה ואז בצד ימין אמור להיות לך חלונית PROPERTIES

בחלק העליון יש אייקון של EVENTS - תלחץ עליו ויוצגו בחלונית כל ה-EVENTS שזמינים עבור התיבה

תמצא את MOUSELEAVE ודבל קליק עליו ייצור לך את הפונקציה

פורסם
  • מחבר

אז בעיקרון אני אמור לקחת את כל מה שרשום בקליק שרשמתי ולהעביר אותו לפונקציה החדשה ?

פורסם

חיובי :)

פורסם
  • מחבר

יש לי בעיה קטנה, בעיקרון התוכנית מוצאת האם המספר בתיבה הוא ראשוני או לא ועכשיו אחרי כל הכנסה של מספר אני מקבל את התוצאה ולא רק אחרי שהסמן עובד לתיבה אחרת ככה שאם אני רוצה לבדוק מספר בן 5 ספרות אחרי כל לחיצה של ספרה הוא מתחיל לעבוד.

פורסם

לא הגיוני אם השתמשת באוונט שרשמתי.

תעלה לפה את הקוד (כל האוונטים ) ונראה מה הבעיה

פורסם
  • מחבר


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading.Tasks;


namespace T1124
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private void button1_Click(object sender, EventArgs e)
{
//long number = long.Parse(tbNumber.Text);
//Task<bool> CheckNumberTask = new Task<bool>(CheckIfPrime, number);
//CheckNumberTask.Start();
//bool result = CheckNumberTask.Result;
//lbResult.Text += " " + result;
}


public bool CheckIfPrime(object oNumber)
{
long number = (long)oNumber;
bool isPrime = true;


for (int i = 2; i < number; i++)
{
if (number % i == 0)
{
return false;
}
}


return isPrime;
}


private void tbNumber_TextChanged(object sender, EventArgs e)
{
long number = long.Parse(tbNumber.Text);
Task<bool> CheckNumberTask = new Task<bool>(CheckIfPrime, number);
CheckNumberTask.Start();
bool result = CheckNumberTask.Result;
lbResult.Text += " " + result;
}


private void tbName_TextChanged(object sender, EventArgs e)
{


}


private void tbDate_TextChanged(object sender, EventArgs e)
{


}
}
}

צירפתי גם בקובץ המצורף את כל ה-solution

[attachment deleted by admin]

פורסם

הוא אמר לך לשים את זה על MOUSELEAVE ואתה (לפחות לפי שם הפונקציה) שמת את זה תחת text changed. ברור שהוא יופעל כל פעם שאתה מכניס ספרה חדשה, הטקסט בתיבה השתנה.

event מתאים יותר מ-Mouse leave למה שתיארת הוא lose focus או משהו בסגנון. זה שסמן העכבר לא מעל התיבה, לא אומר שהמשתמש סיים להכניס קלט לתוכה...

פורסם

אתה משתמש באוונט TextChanged ואז ברור שכל שינוי בטקסט שבתיבה מפעיל את הפונק'

למה אתה לא משתמש באוונט שרשמתי לך ?

פורסם
  • מחבר

אוקיי הבנתי מה הבעיה שלי ועכשיו הצלחתי, פשוט מקודם במקום ללחוץ על הפונק' דבל קליק פשוט שיניתי בתיבה בתוכה לשם של הכפתור שלי

התרגיל הוא תרגיל עם מולטי threading ככה שאני אמור להכניס בתיבה של המספר מספר שהוא גדול ככה שזה יקח למחשב זמן לחשב ובנתיים להכניס ב-2 התיבות מתחת שם ותאריך ובלי לחכות שהמחשב יסיים לחשב כי בנתיים התוכנית קופאת ואת זה אני לא מצליח למרות שהגדרתי לו TASK

פורסם

אתה לא משתמש ב-TASK נכון, שם הבעיה.

פורסם
  • מחבר

אפשר בבקשה הסבר למה ? (ראיתי בדוגמא וחשבתי שכך עושים)

פורסם

זה כבר נושא יותר מסובך להסביר אם אתה לא מכיר אותו בכלל.

עם TASK אתה צריך להשתמש ב-delegate שזו מחלקה מיוחדת שיודעת להחזיק הפנייה למתודה שלך (מעין פוינטר לפונק')

אז אתה צריך ליצור אובייקט delegate ולתת לו את שם הפונק' שלך (זו שאמורה לרוץ בת'רד אחר)

ואז כשאתה יוצר את ה-TASK אתה נותן לו את ה-delegate שיצרת והוא מפעיל אותו (בעצם מפעיל את הפונק' שלך)

החלק היותר בעייתי הוא איפה לחכות לתוצאה של הפונק' - CheckNumberTask.Result

אתה לא יכול לבקש אותה באותה פונק' שמפעילה את הת'רד.

יש כמה שיטות - הפשוטה לדעתי היא ליצור טיימר (קונטרול של WINFORM) שנקרא כל 50ms נגיד.

הטיימר בעיקרון מפעיל אוונט כל פרק זמן כזה ושם אתה יכול לבדוק אם התקבלה כבר תשובה, אם לא התקבלה אז אתה יוצא מהאוונט.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים