PDA

View Full Version : چطوری یک باتن را حرکت بدهیم



vahid_
سه شنبه 23 شهریور 1389, 12:29 عصر
چطوری می شه وقتی که کلید های جهتی کیبورد را می زنیم باتن ما حرکت کنه و جاش عوض بشه؟:متفکر::متفکر:

cheshm6k
سه شنبه 23 شهریور 1389, 12:43 عصر
سلام.


button1.Location = new Point(100,100);

موفق باشید.

rezamansori
سه شنبه 23 شهریور 1389, 18:37 عصر
اول باید KeyPrevew (اگه اشتباه نکرده باشم) را از خاصیت های فرم True کنی بعد تو رویداد KeyPress با یه Select Case بنویسیش.

hildar
دوشنبه 29 شهریور 1389, 07:13 صبح
سلام
من هم مشکل فوق رو دارم،کد زیر رو نوشتم اما دقیقاَ نمی دونم کجا باید استفاده بشه،
ممنون میشم اگه راهنماییم کنین.
if (e.KeyChar == (Char)Keys.Up)
{
button2.Top--;
e.Handled = true;
}
if (e.KeyChar == (Char)Keys.Down)
{
button2.Top++;
e.Handled = true;
}
if (e.KeyChar == (Char)Keys.Right)
{
button2.Left++;
e.Handled = true;
}
if (e.KeyChar == (Char)Keys.Left)
{
button2.Left--;
e.Handled = true;
}

iman_me
دوشنبه 29 شهریور 1389, 07:34 صبح
سلام
من هم مشکل فوق رو دارم،کد زیر رو نوشتم اما دقیقاَ نمی دونم کجا باید استفاده بشه،
ممنون میشم اگه راهنماییم کنین.
if (e.KeyChar == (Char)Keys.Up)
{
button2.Top--;
e.Handled = true;
}
if (e.KeyChar == (Char)Keys.Down)
{
button2.Top++;
e.Handled = true;
}
if (e.KeyChar == (Char)Keys.Right)
{
button2.Left++;
e.Handled = true;
}
if (e.KeyChar == (Char)Keys.Left)
{
button2.Left--;
e.Handled = true;
}

خوب این کد واسه حرکت به وسیله کلیدهای مکان نماست وباید در keydown نوشته بشه

hildar
دوشنبه 29 شهریور 1389, 10:22 صبح
ممنون از راهنماییتون
ولی در keydown این error رو می ده:
Error 4 'System.Windows.Forms.KeyEventArgs' does not contain a definition for 'KeyChar' and no extension method 'KeyChar' accepting a first argument of type 'System.Windows.Forms.KeyEventArgs' could be found (are you missing a using directive or an assembly reference?)

cheshm6k
دوشنبه 29 شهریور 1389, 11:24 صبح
ممنون از راهنماییتون
ولی در keydown این error رو می ده:
Error 4 'System.Windows.Forms.KeyEventArgs' does not contain a definition for 'KeyChar' and no extension method 'KeyChar' accepting a first argument of type 'System.Windows.Forms.KeyEventArgs' could be found (are you missing a using directive or an assembly reference?)
بجای KeyChar از keyCode استفاده کنید.

hildar
دوشنبه 29 شهریور 1389, 11:42 صبح
تغییر دادم ولی این error رو میده
Error 2 Operator '==' cannot be applied to operands of type 'System.Windows.Forms.Keys' and 'char'

hildar
دوشنبه 29 شهریور 1389, 11:47 صبح
خواهش می کنم اگه کسی کدینگ مربوط به حرکت button روی فرم با استفاده از arrowkeys رو می دونه اینجا بزاره خیلی فوریه.
ممنون

Roia_del
دوشنبه 29 شهریور 1389, 12:20 عصر
سلام ، می تونه KeyPreview ات هم false باشه فقط کد زیر رو تو کلاس فرمت بنویس:
من فقط کلید زده شده رو گذاشتم تو عنوان فرم.


protected override bool ProcessDialogKey(System.Windows.Forms.Keys keydata)
{

switch (keydata)
{
case Keys.Up:
case Keys.Left:
case Keys.Right:
case Keys.Down:
this.Text=keydata.ToString();
break;
}
return base.ProcessDialogKey(keydata);

}

cheshm6k
دوشنبه 29 شهریور 1389, 12:42 عصر
keyCode نوعش Keys هست . Type Casting به char نباید انجام بدی .
(char) رو بردار.

hildar
دوشنبه 29 شهریور 1389, 15:14 عصر
Roia_del ممنون از راهنماییتون کد شما جواب میده،اما اگه بخوام کد خودمو تو یکی از event های button بنویسم به طوریکه اونم کار کنه تو کدوم رویداد باید کد رو بنویسم؟
اصلاَ همچین چیزی ممکنه؟رویدادهای
keypress,keydown,keyup
چه کاری انجام می دن؟

hildar
دوشنبه 29 شهریور 1389, 15:21 عصر
در ضمن من یه اشکال دیگه تو برنامم دارم و اون اینه که می خوام با شروع بازی(کلیک روی یک buttom) یک تایمر فعال بشه و زمان بازی رو از صفر محاسبه کنه،کد زیر رو نوشتم:

private void timer1_Tick_1(object sender, EventArgs e)
{
int m = 0;
int s = 0;
for (m = DateTime.MinValue.Minute; m <= DateTime.MaxValue.Minute; m++)
{
for (s = DateTime.MinValue.Second; s <= DateTime.MaxValue.Second; s++)
label2.Text = m.ToString() + ":" + s.ToString();
}
}
اما به محض اجرا کردن برنامه تایمر به صورت 59:59 در می یاد و شمارشی دیده نمیشه،(interval=1000)هست
ممنون میشم اگه راهنمایی کنید.

Roia_del
شنبه 03 مهر 1389, 10:10 صبح
در ضمن من یه اشکال دیگه تو برنامم دارم و اون اینه که می خوام با شروع بازی(کلیک روی یک buttom) یک تایمر فعال بشه و زمان بازی رو از صفر محاسبه کنه،کد زیر رو نوشتم:

private

void timer1_Tick_1(object sender, EventArgs e)
{
int m = 0;
int s = 0;
for (m = DateTime.MinValue.Minute; m <= DateTime.MaxValue.Minute; m++)
{
for (s = DateTime.MinValue.Second; s <= DateTime.MaxValue.Second; s++)
label2.Text = m.ToString() + ":" + s.ToString();
}
}

اما به محض اجرا کردن برنامه تایمر به صورت 59:59 در می یاد و شمارشی دیده نمیشه،(interval=1000)هست
ممنون میشم اگه راهنمایی کنید.

private int a =0;
private void timer1_Tick(object sender, EventArgs e)
{
a += 1;
int h = a / 3600;
int m=0;
int s=0;

if (h > 0)
m = (a - (h * 3600)) / 60;
else
m = a / 60;

this.Text = h.ToString() + ":" + m.ToString() + ":" + s.ToString();
}


در ضمن هر جا خواستی تایمر 0 بشه متغیر a رو صفر کنی کافیه.تایمر هم Enabled باشه یا نباشه.

Roia_del
شنبه 03 مهر 1389, 10:13 صبح
Roia_del ممنون از راهنماییتون کد شما جواب میده،اما اگه بخوام کد خودمو تو یکی از event های button بنویسم به طوریکه اونم کار کنه تو کدوم رویداد باید کد رو بنویسم؟
اصلاَ همچین چیزی ممکنه؟رویدادهای
keypress,keydown,keyup
چه کاری انجام می دن؟
نه تو C#‎ خود فرم یک رویداد PreviewKeyDown داره که اگه KeyPreview برابر true باشه کار میکنه ولی نه وقتی که Button روی فرم باشه.که در اون صورت همه رویداد هایی که نوشتی کار می کنه. ولی اگه Button شما روی فرم باشه کلیه رویداد های KeyPreview فرم رو منتفی می کنه.(که البته مشکل از مایکروسافت فکر کنم باشه.تو دلفی جواب میده)

hildar
یک شنبه 04 مهر 1389, 11:40 صبح
از کد تایمر هم ممنون قبل از اینکه شما جاب اون پست رو بدید من کدشو نوشتم
یه کلاس استاتیک تعریف کردم که s و m (ثانیه و دقیقه) استاتیک هستن و بعد یک متد که از اینها استفاده می کنه و کار شمارشو انجام میده،متد رو تو timer tich صدا زدم

hildar
یک شنبه 04 مهر 1389, 11:50 صبح
الان دارم رو یه برنامه کار می کنم که محتویات یه ریچ باکس رو به صورت encript شده داخل یه فایل ذخیره می کنه،بعد برای باز یابی اطلاعات باید محتویات رو decript کنه و دوباره توی ریچ باکس نمایش بده، تابع encript رو به صورت زیر نوشتم:
اما فقط حرف آخر رشته رو encript می کنه،نمی دونم اشکالش چیه؟
private void button1_Click(object sender, EventArgs e)
{
string str2 = string.Empty;
str2 = textBox1.Text;
label1.Text=Encript(str2);

}
string Encript(string str)
{
string str1 = string.Empty;
str1=str;
int size = str1.Length;
int[] arrInt = new int[size];
char[] arrChar = new char[size];

foreach (char ch in str1)
{
for(int i=0;i<size;i++)
{
arrInt[i] = (int)ch;
}
}
for (int i = 0; i < size; i++)
{
if (arrInt[i] >= 32 || arrInt[i] <= 126)
{
arrChar[i]=((char)(arrInt[i]+3));
}
}
for (int i = 0; i < size; i++)
{
foreach (char ch in str1)
{
str1 = arrChar[i].ToString();
}
}
return str1;
}


*****************************************

ila_mata86
یک شنبه 04 مهر 1389, 12:18 عصر
چطوری می شه وقتی که کلید های جهتی کیبورد را می زنیم باتن ما حرکت کنه و جاش عوض بشه؟
این اون چیزی که می خوای نیست ولی می تونه کمکت کنه
موفق باشی

محسن شامحمدی
یک شنبه 04 مهر 1389, 12:22 عصر
دوست عزیز
لطفا هر سوال رو توی یک تاپیک مجزا بذارید.
تاپیک شما مربوط به حرکت باتون هستش و حالا لطف کنید و سوالتون رو تو یک تاپیک مجزا بپرسید.
الان من که اومدم اینجا. به این دلیل بود که می خواستم سوال مربوط به حرکت باتون شما رو جواب بدم وی می بینم که شما سوال مربوط به Encrypt کردن رشته ها رو پرسیدید و من الک اومدم چون بلد نیستم.

Roia_del
یک شنبه 04 مهر 1389, 12:57 عصر
الان دارم رو یه برنامه کار می کنم که محتویات یه ریچ باکس رو به صورت encript شده داخل یه فایل ذخیره می کنه،بعد برای باز یابی اطلاعات باید محتویات رو decript کنه و دوباره توی ریچ باکس نمایش بده، تابع encript رو به صورت زیر نوشتم:
اما فقط حرف آخر رشته رو encript می کنه،نمی دونم اشکالش چیه؟
شما تو این کد کاری که می کنید اینه :
یک رشته رو می گیرید و یک آرایه به طول اون رشته رو با حرف آخر رشته پر می کنید (البته با کدش).
در نهایت هم حرف آخری رو بر می گردونین.

میشه بیشتر توضیح بدین می خواین چیکار کنین؟

Roia_del
یک شنبه 04 مهر 1389, 13:02 عصر
این کد رو امتحان کنین :


private void button1_Click(object sender, EventArgs e)
{
string str2 = string.Empty;
str2 = textBox1.Text;
label1.Text = Encript(str2);

}
string Encript(string str)
{
string str1 = string.Empty;
str1 = str;
int size = str1.Length;
int[] arrInt = new int[size];
char[] arrChar = new char[size];

int i = 0;

foreach (char ch in str1)
{

arrInt[i] = (int)ch;
i++;
}
for (i = 0; i < size; i++)
{
if (arrInt[i] >= 32 || arrInt[i] <= 126)
{
arrChar[i] = ((char)(arrInt[i] + 3));
}
}
str1 = string.Empty;
for (i = 0; i < size; i++)
{
str1 += arrChar[i].ToString();
}
return str1;
}




این کد به roiadel رو گرفته و urldgho رو برمیگردونه.

hildar
یک شنبه 04 مهر 1389, 15:26 عصر
دوست عزیز 09111111111
ممنون از فایلایی که گذاشتین و ببخشید که برای این تاپیک به اشتباه افتادید

البته اون باتن حرکت کرد اما مشکل من پابرجاست چون از فرم بیرون میزنه

این که بقیه سوالامو اینجا مطرح می کنم به خاطر اینه که دوستایی که منو تو قسمتهای قبلی راهنمایی کردن در ادامه با من باشن برای حل مشکلات بعدیم
البته تو این مدتی که عضو شدم متوجه شدم که برای طرح سوالامون باید چیکار کرد،اما خوب شاید من بخوام دوباره از همون دوستا کمک بگیرم.

Roia_del
دوشنبه 05 مهر 1389, 11:34 صبح
البته اون باتن حرکت کرد اما مشکل من پابرجاست چون از فرم بیرون میزنه

خوب باید طول و عرض و چپ و راست رو تنظیم کنی که بیرون نزنه.(رو کد برای حرکت Button کنترل داشته باشی)

hildar
سه شنبه 06 مهر 1389, 07:58 صبح
خوب برای حرکت باتن با arrowkeys تابع زیر رو گذاشتم
توضیح:levelدر واقع لول بازیه برای حرکت چندتایی باتن که از 1 تا 4 و برای محسوس بودن حرکت باتن، من اونو در 5 ضرب کردم
protected override bool ProcessDialogKey(System.Windows.Forms.Keys keydata)
{
int ll = 5 * level;
switch (keydata)
{
case Keys.Up: if (button2.Top-ll >= groupBox1.Height) { button2.Top -= ll; }
break;
case Keys.Left: if (button2.Left-ll >= -1) { button2.Left -= ll; }
break;
case Keys.Right: if (button2.Left+ll <= (this.Width - button2.Width)) { button2.Left += ll; }
break;
case Keys.Down: if (button2.Top+ll < (this.Height - button2.Height)) { button2.Top += ll; }
break;
}
return base.ProcessDialogKey(keydata);

Roia_del
سه شنبه 06 مهر 1389, 11:06 صبح
فرض شده است که Button درون GroupBox می باشد.


int level = 3;
protected override bool ProcessDialogKey(System.Windows.Forms.Keys keydata)
{
int ll = 5 * level;
switch (keydata)
{
case Keys.Up:
if (button2.Top - ll > 7)
{ button2.Top -= ll; }
else { button2.Top = 7; }
break;
case Keys.Left: if (button2.Left - ll >= 0) { button2.Left -= ll; }
else
{ button2.Left = 0; }
break;
case Keys.Right: if (button2.Left+button2.Width + ll <= (groupBox1.Width)) { button2.Left += ll; }

else
{ button2.Left = groupBox1.Width-button2.Width ; }
break;
case Keys.Down:
if (button2.Top + ll < (groupBox1.Height - button2.Height))
{ button2.Top += ll; }
else { button2.Top = groupBox1.Height - button2.Height; }
break;
}
return base.ProcessDialogKey(keydata);
}
}

hildar
سه شنبه 06 مهر 1389, 11:44 صبح
اینکه نوشتید فرض شده button در groupBox می باشد یعنی چی؟:گیج:
من یک groupBox گذاشتم که توی اون اطلاعات player رو در یک تکس باکس میگیره و یه button که مربوط به start هست و button ی که باید حرکت کنه باید تا زیر groupBox بیاد،کد بالا up رو محقق نمی کنه(تا زیر groupBox میره)و down هم که button از پایین فرم خارج میشه و در بالا ظاهر میشه،که این هم Down رو مححقق نمی کنه.

Roia_del
سه شنبه 06 مهر 1389, 11:55 صبح
یعنی شما یک groupBox روی فرم دارین که یک Button هم به داخل groupBox انداختین.(چون تو کد بالا یک جا شما از this و جای دیگه از groupBox استفاده کرده بودین، فکر کردم که Button شما توی یک groupbox قرارداره.
غیر از این هست بگین؟:متفکر:

شما زیر اون groupBox که اطلاعات Player رو می گیرین. یک دونه GroupBox دیگه اضافه کنین.(پایین فرم) و Button رو داخل اون اضافه کنین. اسم این دکمه Button2 و اسم GroupBox اضافه شده تو کد من groupBox1 هست.(دقت کنین که اشتباه نشه).

Roia_del
سه شنبه 06 مهر 1389, 12:07 عصر
یک Solution براتون فرستادم یک نگاه بهشون بکن.
البته تو VS 2010 هست که می تونین فایل های Form1 رو تو پروژه دیگه بندازین.(اگه VS2010 ندارین)

hildar
سه شنبه 06 مهر 1389, 13:54 عصر
من از VS2010 استفاده می کنم،اما باتن باید تو فرم بچرخه
کل پروژه رو براتون میزارم ببینید

Roia_del
سه شنبه 06 مهر 1389, 14:10 عصر
براتون کد تون رو فقط تو قسمت کنترل Button تغییر دادم، الان درست کار می کنه ، یک تست بکنین.:چشمک:

hildar
چهارشنبه 07 مهر 1389, 08:52 صبح
ممنون،عالی کار می کنه
ولی this.ClientSize.Height و this.cliensize.Width چی هستن؟

Roia_del
چهارشنبه 07 مهر 1389, 09:09 صبح
ClientSize.Widthو ClientSize.Height یه چیزی تو مایه های Height,Width معمولی است . با این تفاوت که فقط مساحت داخلی فرم رو در نظر می گیره و کاری به نوارهای کناری فرم که ظاهر می شوند نداره.(و همچنین نوار عنوان رو هم در بر نمی گیره)