PDA

View Full Version : مشکل با ایجاد داینامیک شی rectangleShape



NIMA_1981
شنبه 13 فروردین 1390, 17:26 عصر
سلام دوستان می دونم شاید بار ها در این مورد صحبت شده اما من مشکلم اینه وقتی از شی rectangleShape استفاده میکنم خطا میده یعنی این خط رو خطا میگیره


this.Controls.Add(vv);


اینم کل کد


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;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int x = 10;
int y = 30;

for (int i = 0; i < 4; i++)
{

// rectangleShape
Rectangle vv = new Rectangle();
vv.Location = new Point(x, y);
vv.Size = new Size(10, 10);
this.Controls.Add(vv);
y += 25;

}}}
}

ممنون اگه راهنمایی کنید

exlord
شنبه 13 فروردین 1390, 19:53 عصر
Rectangle کنترل نیست که بتونی به فرمت اضافه کنی ... اینو باید Draw کنی ... درباره Draw هم تو فروم هزاران بار بحث شده یه سرچ بکنی پیدا می کنی ...

m.soleimani
شنبه 13 فروردین 1390, 20:53 عصر
سلام دوستان می دونم شاید بار ها در این مورد صحبت شده اما من مشکلم اینه وقتی از شی rectangleShape استفاده میکنم خطا میده یعنی این خط رو خطا میگیره


this.Controls.Add(vv);


اینم کل کد


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;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int x = 10;
int y = 30;

for (int i = 0; i < 4; i++)
{

// rectangleShape
Rectangle vv = new Rectangle();
vv.Location = new Point(x, y);
vv.Size = new Size(10, 10);
this.Controls.Add(vv);
y += 25;

}}}
}

ممنون اگه راهنمایی کنید







Graphics g = this.CreateGraphics();
Pen p = newPen(Color.Red, 2.4f);
g.DrawRectangle(p, vv);

NIMA_1981
شنبه 13 فروردین 1390, 21:29 عصر
جناب m.soleimani ممنون ار پاسختون فقط نمیدونم چرا این قسمت کد رو که قرار دادید با کد های html ادقام شده خوب نشون نمدیه میشه دوباره قرار بدید

NIMA_1981
شنبه 13 فروردین 1390, 21:40 عصر
m.soleiman منی کد شما رو اضافه کردم شکل رومیکشه و خطا هم نمیده اگه این عکس رو نگاه کنید می می خوام چنین جدولی داشته باشم
68196
یعنی وقتی روی هر کدوم که کلیک می کنم بتونم روشن و خاموش کنم الان من تمام این ها رو دستی قرار دادم اما میهوام به صورت دینامیک ساخته بهشه و واسه اون دوستم که گفته این کنترول نیست این ابراز از کنترل های این برنامه هست خود نگاه کن فقط نیمدونم باید چی کار کنم که کار کنه
68197
با تشکر

ali-kh
یک شنبه 14 فروردین 1390, 00:28 صبح
اینم کد اصلاح شده با همون کنترل دلخواه شما

int x = 10;
int y = 30;
ShapeContainer k = new ShapeContainer();
k.Parent = this;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
RectangleShape vv = new RectangleShape();
vv.Parent = k;
vv.Location = new Point(x+12*j, y+12*i);
vv.Size = new Size(10, 10);

}

}


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

using Microsoft.VisualBasic.PowerPacks;


و برای اینکه موقع کلیک رنگشون عوض بشه برای رویداد کلیک اونا یک تابع نسبت بدید

به نظر من بهتره توی یک array این کنترل هارو نگه دارید تا بتونید state هر کدوم رو به راحتی به دست بیارید
یا حق

m.soleimani
یک شنبه 14 فروردین 1390, 00:58 صبح
m.soleiman منی کد شما رو اضافه کردم شکل رومیکشه و خطا هم نمیده اگه این عکس رو نگاه کنید می می خوام چنین جدولی داشته باشم
68196
یعنی وقتی روی هر کدوم که کلیک می کنم بتونم روشن و خاموش کنم الان من تمام این ها رو دستی قرار دادم اما میهوام به صورت دینامیک ساخته بهشه و واسه اون دوستم که گفته این کنترول نیست این ابراز از کنترل های این برنامه هست خود نگاه کن فقط نیمدونم باید چی کار کنم که کار کنه
68197
با تشکر

دوستمون درست گفتن شما نگفته بودین که دارین از یه کامپوننت جداگانه استفاده می‌کنید به هر حال کدی که برات نوشتم به صورت گرافیکی این کار رو انجام می‌ده اگر شما نیاز داری که یه چیزی بسازی که در زمان اجرا بشه مثل پیکسل خاموش روشن داشته باشی و بشه تغییرش داد به راحتی می‌تونی کل سطح فرمت رو به صورت یه ماتریس « آرایه دو بعدی » توسط Buttonهای هم اندازه بپوشونی و توی خاصیت کلیک هر کدوم داشته باشی که یه بار رنگ خاکستری بگیره یه بار قرمز به همین راحتی می‌تونی این پروژه رو انجام بدی بدون هیچ دردسر اضافه یکم خلاق باشی خیلی هم از طرح اولیه خودت بهتر در میاد موفق باشی./

NIMA_1981
یک شنبه 14 فروردین 1390, 11:34 صبح
جناب ali-kh واقعا ممنون دستت درد نکنه -اما میشه بگید کخ چطوری میتونم برای هر کدوم از اینها یک رویداد تعریف کنم وقتی که کلیک میکنه رنگش عوض بشه

ali-kh
یک شنبه 14 فروردین 1390, 16:08 عصر
با سلام
اینم اون چیزی که میخواهید
فقط اگر نیاز به داده های اون مستطیل ها دارید بهتره توی یک ارایه ذخیره بشه
نخواستم پیچیده بشه فقط چیزی که مد نظرتون بود رو انجام دادم اگر چیزایی رو که میخواهید بگید
شاید بشه بهتر کمک کرد


private void button1_Click(object sender, EventArgs e)
{
int x = 10;
int y = 30;
ShapeContainer k = new ShapeContainer();
k.Parent = this;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
RectangleShape vv = new RectangleShape();
vv.Click += new EventHandler(rectangleShape_Click);
vv.Parent = k;
vv.BackStyle = BackStyle.Opaque;
vv.BackColor = Color.White;
vv.Location = new Point(x+12*j, y+12*i);
vv.Size = new Size(10, 10);

}

}

}

private void rectangleShape_Click(object sender, EventArgs e)
{
RectangleShape r = (RectangleShape)sender;
r.BackColor = r.BackColor==Color.White?Color.Black:Color.White;

}

NIMA_1981
یک شنبه 14 فروردین 1390, 17:15 عصر
واقعا ارتون ممنونم -دقیقا همون چیزی بود که می خواستم -من قبلا این برنامه رو نوشته بودم اما نه به این شکل 256 از این شی واسه ماتریس 16*16 ساخته بودم و واسه هر کدام از این شی ها کلی برنامه نویسی کرده بودم که خودم اصلا به اون شکل برنامه نویسی رو قبول ندارم -این روش که شما نوشتید بهترین روشه
فقط 2 تا سوال دیگه

1- جطوری میتونم با فشار یک کلید همه این سی ها رو به رنگ سفید تغییر بدم مثلا rest کردن باشه
2- من می خوام که بعدا اطلاعات هر کدون از اینا رو داشته باشم یعنی بدونم کدوم خونه جه رنگی شده که بتونم به 0و1 تبدیل کنم - شما چه روشی را پیشنهاد میکنید

بازم از کمکتون متشکرم

ali-kh
یک شنبه 14 فروردین 1390, 17:26 عصر
با سلام
1- جواب سوال اولتون رو تو سوال دوم میدم :گیج: چی گفتم واقعا
2- به نظر من از array استفاده کنید خیلی راحت ترین به تمام اوئن ها دسترسی دارید و مقادیرشون رو میتونید بگیرید
یه array از نوع Rectangle..
ایجاد کنید بعد با for های تو در تو اونا رو بچینید الان به vs دسترسی ندارم وگر نع مینوشتم براتون

حالا میتونید به یه for کل array رو reset کنید
همین ....
موفق باشید

NIMA_1981
یک شنبه 14 فروردین 1390, 18:01 عصر
منطور از
یه array از نوع Rectangle رو متوجه نشدم میشه برام توضیح بدید

با تشکر

ali-kh
یک شنبه 14 فروردین 1390, 19:01 عصر
با سلام
اینو اول برنامتون به عنوان متغیر تعریف کنید


RectangleShape [,] vv = new RectangleShape[10,10];




توی همون باتن که کنترل هارو ایجاد میکنید
اینو بجای ایجاد کنترل ها بزارید






vv[i,j] = new RectangleShape();



حالا هر جا لازم باشه به ارایه vv و تمام عناصرش که مربع کوچولو ها هستند دسترسی دارید
بدون VS نوشتم این کد هارو اگر درست نبودند بگید کد درست رو بزارم
موفق باشید

NIMA_1981
یک شنبه 14 فروردین 1390, 19:37 عصر
من کد رو به این صورت تغییر داردم و همه جا که vv بود به vv[i,j] تغییر دادم اما برنامه خطا داد -بعد من میهوام شی ها ایجاد بشه و اطلاعاتشونم داخل ارایه باشه

مرسی

ali-kh
دوشنبه 15 فروردین 1390, 16:02 عصر
با سلام
شرمنده دیر شد
فقط به جای تعریف ارایه دقت کنید


namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{

RectangleShape[,] vv = new RectangleShape[10, 10];
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
int x = 10;
int y = 30;
ShapeContainer k = new ShapeContainer();
k.Parent = this;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
vv[i,j] = new RectangleShape();
vv[i, j].Click += new EventHandler(rectangleShape_Click);
vv[i, j].Parent = k;
vv[i, j].BackStyle = BackStyle.Opaque;
vv[i, j].BackColor = Color.White;
vv[i, j].Location = new Point(x + 12 * j, y + 12 * i);
vv[i, j].Size = new Size(10, 10);

}

}

}

private void rectangleShape_Click(object sender, EventArgs e)
{
RectangleShape r = (RectangleShape)sender;
r.BackColor = r.BackColor==Color.White?Color.Black:Color.White;

}

private void button2_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
vv[i, j].BackColor = Color.White;

}

}
}





}
}

NIMA_1981
دوشنبه 15 فروردین 1390, 19:26 عصر
اقا دستت درد نکنه دقیقا همونی بود که می خواستم-واقعا کمکم کردید -من این موصوع رو بیشتر از 5 یا 6 بار مطرح کردم اما کسی جواب نداده بود

مرسی