الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

هل يمكن إنشاء عناصر من الصفر

مغلق
بدأه electronics في 19 مايو 2006 · 3 رد · 568 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

أريد كتابة برنامج يحتوي تقريبا على 300 عنصر صورة مرتبين بشكل مصفوفة من أسطر وأعمدة وهنا لدي الأسئلة التالية :

أولاً:

هل توجد طريقة بحيث أقوم بكتابة كود يقوم هو برسم هذه العناصر بدلاً من أن أرسم 300 عنصر، أي أن الخوارزمية قد تكون مشابهة للتالي:

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

	PictureBox PBox = new PictureBox();
	PBox.Name = “p” + i.ToString();
	PBox.Position = ( i , i );
}

حيث يكون هنا قد أنشأ الصور ووضعها في موضعها.

ثانياً: عند النقر على أي صورة من هذه الصور يجب أن يتغير محتواها فهل يوجد طريق بحيث أكتشف أن النقر تم على واحدة من الصور ال 300 وتحديد أي صورة ومن ثم تغيير صورة هذا العنصر.

أرجو ممن لديه أية معلومة في هذا الخصوص مساعدتي حتى ولو برابط أو اسم كتاب

وجزاكم الله خيرا

#2

اضافة 300 PictureBox مره واحده في loop وتسميتهم ووضع صور بهم , أمر مهلك للذاكره ! استخدم Graphics لرسم الصور على الفورم بدلا من اضافة 300 أداه , فسيكون هذا أفضل , بالاضافه الى أن المستخدم بالتأكيد لن يستطيع مشاهدة الـ 300 صوره مره واحده الا اذا كانت صور صغيره فاخبرنا قليلا عن طبيعة البرنامج حتى نجد حلا أفضل.

عموما اذا كنت قررت البقاء على ما أنت عليه الآن لسبب ما , فيمكنك أن تجعل هناك EventHandler واحد فقط ليـ Handle أو ليتعامل مع كل الضغطات التي تحدث على الـ PictureBoxes ويمكنك تمييزهم من خلال تحويل الـ sender الى PictureBox وعمل switch case على اسمه Name أو أى شئ آخر تحدده. واذا استخدمت Graphics بدلا من الـ PictureBoxes يمكنك التمييز من خلال احداثيات الماوس مثلا.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#3

أشكرك أخ معتز في الحقيقة كنت أنتظر مرورك

بالنسبة للبرنامج يقوم فيه المستخدم برسم لوحة من نقاط ثم يتم إرسالها لدارة خارجية متصلة بالكمبيوتر فأريد من المستخدم أن ينقر على كل عنصر حتى يتم نقله للدارة أي أن كل صورة تمثل led وعند النقر أول مرة تتم إضائة الـ led والنقرة الأخرى تطفئه ولهذا لا بد أن يتعامل مع 300 عنصر منفصل لأن الدارة تتعامل مع 300 led

ولك جزيل الشكر

#4

يمكنك استخدام عدة ToolBar ويحتوي كل واحد على مجموعه من الصور.

مثلا :

ImageList yourList = new ImageList();
// حط الصور فيها بلوب مثلا

ToolBar yourTBar = new ToolBar();
yourTBar.ImageList = yourList;
yourTBar.ButtonClick+=new ToolBarButtonClickEventHandler(yourTBar_ButtonClick);
ToolBarButton yourButton;

for(int i=0;i<=50;i++)
{
yourButton = new ToolBarButton(i.ToString());
yourButton.ImageIndex=i;
yourButton.Tag = 0;
yourTBar.Buttons.Add(yourButton);
}

this.Controls.Add(yourTBar);

The Handler :

private void yourTBar_ButtonClick(object sender, ToolBarButtonClickEventArgs e)
{
//e.Button.Text
}

وقم بعمل أكثر من ToolBar لوضع بقية الصور فيهم ويمكنك ان تجعل الـ Buttons كـ ToggleButton من خلال تغيير الـ Style. وفي الـ Handler يمكنك استخدام Button.Text والـ Tag لتعرف الـ Button الذي تم الضغط عليه. ويمكنك استخدام Pushed اذا كنت تستخدم ToggleButtons حتى تعرف حالته.

ممكن أيضا ان تستخدم Graphics كما ذكرت لك سابقا ... مثلا :

Graphics myG;
string yourFolder = "C:\\YourFolder\\";
Image theImage;

// ......

myG = this.CreateGraphics();
int x=0;
int y=0;

for(int i=1;i<=300;i++)
{
theImage = Image.FromFile(yourFolder+"P"+i.ToString()+"0.JPG");
myG.DrawImage(theImage,x,y,theImage.Width,theImage.Height);
if(x<this.Width-theImage.Width)
x+=theImage.Width;
else
{
x =0;
y +=theImage.Height;
}
}

وبعد ذلك يمكنك معرفة متى وأين يضغط المستخدم من خلال أحداث الماوس الخاصه بالـ Form.

وبالاضافه الى السابق يمكنك أيضا استخدام PictureBoxes بالشكل التالي ولكن لا أنصح بذلك :

int x=0;
int y=0;
PictureBox myBox = new PictureBox();
EventHandler myHandler = new EventHandler(myBox_Click);
Image theImage;

for(int i=1;i<11;i++)
{
myBox = new PictureBox();
myBox.Name = i.ToString();
myBox.Tag = 0;
myBox.Click+= myHandler;
myBox.Location = new Point(x,y);
theImage = Image.FromFile(yourFolder+"P"+i.ToString()+"0.JPG");
myBox.Image = theImage;
myBox.Width = theImage.Width;
myBox.Height = theImage.Height;
this.Controls.Add(myBox);

if(x<this.Width-theImage.Width)
{
x+=theImage.Width;
}
else
{
x = 0;
y +=theImage.Height;
}

}

و myBox_Click يمكنك أن تجعلها كالتالي حتى تعكس الصوره الموجوده :

void myBox_Click(object sender, EventArgs e)
{

PictureBox clickedBox = (PictureBox)sender;

if(clickedBox.Tag.ToString()=="0")
{
clickedBox.Image = Image.FromFile(yourFolder+"P"+clickedBox.Name+"1.JPG");
clickedBox.Tag = 1;
}
else
{
clickedBox.Image = Image.FromFile(yourFolder+"P"+clickedBox.Name+"0.JPG");
clickedBox.Tag = 0;
}

}

وانتبه أنني أفترض أن الصور بيكون اسمها P ثم رقمها ثم صفر اذا كانت تعبر عن الغلق أو واحد لو كانت تعبر عن الفتح . مثلا P10 تدل أنها الصوره التي تعبر عن الـ Led الأول وهو مغلق. و P11 مثلها وتعبر عنه وهو مفتوح.

أرجوا أن تكون وصلتك الفكره.

تم تعديل هذه المشاركة بواسطة معتز شمس في 25 مايو 2006 في 12:20

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

هذا الموضوع مغلق.

مواضيع مشابهة