PDA

View Full Version : سوال: delegate



ghazal_mohammady
یک شنبه 21 اردیبهشت 1393, 14:04 عصر
عرض ادب
خواهش می کنم یکی راهنمایی کنه، خیلی کارم عقبه
من یه شبه paint دارم، که شیء هارو روی panel کشیده، میخوام با انتخاب شیء و استفاده از کلید های جهتی کیبورد این شیء حرکت کنه، باید یه delegate تعریف کنم ، یه کلاس shape دارم که دلیگیت رو اونجا تعریف کردم

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace PaintFillAndNotFill
{
abstract class Shape:IDrawabel
{
public Color Color { get; set; }
public List<Shape> Shapes { get; set; }
public int width { get; set; }
public int style { get; set; }
public int X {
get
{
return this.X;
}
set
{
X = value;
if (LocationChange != null)
LocationChange(this, EventArgs.Empty);
}
}
public int Y {
get
{
return this.Y;
}
set
{
X = value;
if (LocationChange != null)
LocationChange(this, EventArgs.Empty);
}
}
virtual public void Draw(Graphics graph){}
public enum Style { Dot, Dash,DashDotDot,Solid };
public event EventHandler LocationChange;
}
}


که زمان اجرا از Set هام ارور می گیره
بعد توی فرمم اومدم بر اساس انتخاب شیء میخوام اونو حرکت بدم


void Circle_LocationChange(object sender,EventArgs e)
{

if (shapeBindingSource.Current == c){

نمیدونم بنده شو چی بنویسم c اشاره داره به شیء از نوع دایره ام .
بعد یه جایی تو فرمم این دستورو نوشتم



Circle m = new Circle();
m.LocationChange += Circle_LocationChange;
اشکال کارم کجاست؟:گریه::گریه::گریه::گری ::گریه:

Davidd
یک شنبه 21 اردیبهشت 1393, 14:38 عصر
بد نيست وقتي ميگين ارور ميده، متن ارور هم بذارين.
خط آخر اصلاح كنيد
m.LocationChange += new System.EventHandler(Circle_LocationChange);

ghazal_mohammady
یک شنبه 21 اردیبهشت 1393, 14:40 عصر
سپاس گزارم ، ارور رو رفع کردم، یه سوال اینکه اشیاء داخل پنل رو وقتی میخوام جابجا کنم ، کد رو داخل رویداد کلیک فرمم بنویسم درسته ؟ بعد شیء رو رسم کنم ؟

ghazal_mohammady
یک شنبه 21 اردیبهشت 1393, 14:45 عصر
مثلا این کد باعث میشه دایره ای که رو پنل من کشیده شده جابجا شه؟



private void Form1_KeyDown(object sender, KeyEventArgs e)
{
panel1.Focus();
if (shapeBindingSource.Current == c)
{
switch (e.KeyCode)
{
case Keys.Up:
c.Y = c.Y - 5;
break;
case Keys.Right:
c.X = c.X + 5;
break;
case Keys.Down:
c.Y = c.Y + 5;
break;
case Keys.Left:
c.X = _x - 5;
break;
case Keys.Escape:
c.X = this.Width / 2;
c.X = this.Height / 2;
break;
}
Bitmap buffer = new Bitmap(this.Width, this.Height, this.CreateGraphics());
Graphics drow1 = panel1.CreateGraphics();
c.Draw(drow1);
}
}

ghazal_mohammady
یک شنبه 21 اردیبهشت 1393, 17:06 عصر
یعنی انقد نامفهومه :ناراحت::ناراحت::ناراحت:

ghazal_mohammady
یک شنبه 21 اردیبهشت 1393, 18:52 عصر
اصلا یه جور دیگه مطرح می کنم سوالامو
panel رویداد keydown نداره درسته؟ حالا میخوایم یه شی رو ازین طریق روی پنل حرکت بدیم باید از رویداد keydown فرم استفاده کنیم دیگه یا اینکه خودمون یه event بنویسیم ، حالا با این اوصاف اگه کار اولو انجام بدیم نمیدونم چرا وقتی اجرا می کنم، با حرکت کلیدهای جهتی کیبور، سایر چیزهایی که رو فرمند فوکوس می شن، بااین که تو فورم لود فوکیس رو گذاشتم رو پنل؟
میشه راهنماییم کنید:اشتباه::اشتباه:

Davidd
دوشنبه 22 اردیبهشت 1393, 08:00 صبح
خاصيت KeyPreview فرم را True كنيد تا event هاي صفحه كليد براي فرم فعال بشه و از KeyDown Event فرم براي حركت اشيا استفاده كنيد.
براي مشكل تغيير فوكوس هم، اين روش تست كنيد :تو همين KeyDown Event فرم، فوكوس روي پنل قرار بديد