PDA

View Full Version : سوال: چگونگي ساخت يك دكمه به صورت ايندكسي



EbiPenMan
دوشنبه 11 آذر 1387, 15:20 عصر
سلام
جواب سوال ( صفحه 2 پست 2)
من مي خوام بدونم چطور مي شه يك دكمه يا هر آبجكت ديگه اي رو به صورت ايندكسي ساخت و در حلقه ها ازش استفاده كرد.

مانند كاري كه vb6 مي كرد وقتي يك آبجكت رو كپي مي كردي و پيست مي پرسيد كه مي خواي ايندكسي بشه .

البته مي شه به صورت دو بعدي بشه مثلا در موقع استفاده بنويسم :

btn(i,j).text="dsds"

h.jaza
دوشنبه 11 آذر 1387, 18:42 عصر
یعنی چی به صورت ایندکسی ساخت؟

بیشتر توضیح بدین.

majid325
دوشنبه 11 آذر 1387, 19:39 عصر
در دات نت اين موضوع ديگه وجود نداره ولي دات نت راههاي ديگه اي براي اين كار داره مثلا اگر ميخواهيد در داخل اشيا يك فرم loop بزنيد ميتونيد ازاين كد :

foreach (Control c in this.Controls)

{

if (c.GetType().ToString() == "System.Windows.Form.Textbox")

{

//your code goes here

}

}



و يا ميتونيد براي اشيا خاص يه نيم نگاهي به كد زير داشته باشيد :

TextBox[] txts = new TextBox[5];
و همچنين ميتونيد كليد واژه "collection" رو به صورت تركيبي با شي مورد نظر جستجو كنيد و باور كنيد همين الان كه اين پست رو ميفرستم شايد بيش از 7 و 8 نوع كار تركيبي در ذهنم هست ، اگه جستجو كنيد راههاي مناسب تري هم پيدا ميكنيد.

majid325
دوشنبه 11 آذر 1387, 19:49 عصر
یعنی چی به صورت ایندکسی ساخت؟

بیشتر توضیح بدین.

در vb6 ميشه چند آبجكت رو در يك گروه و حتي با يك اسم (اگه درست يادم باشه) ساخت كه به وسيله index از هم تمايز داده ميشن مثل control Arry در دات نت تقريبا.

EbiPenMan
دوشنبه 11 آذر 1387, 21:04 عصر
در دات نت اين موضوع ديگه وجود نداره ولي دات نت راههاي ديگه اي براي اين كار داره مثلا اگر ميخواهيد در داخل اشيا يك فرم loop بزنيد ميتونيد ازاين كد :

foreach (Control c in this.Controls)

{

if (c.GetType().ToString() == "System.Windows.Form.Textbox")

{

//your code goes here

}

}



و يا ميتونيد براي اشيا خاص يه نيم نگاهي به كد زير داشته باشيد :

TextBox[] txts = new TextBox[5];
و همچنين ميتونيد كليد واژه "collection" رو به صورت تركيبي با شي مورد نظر جستجو كنيد و باور كنيد همين الان كه اين پست رو ميفرستم شايد بيش از 7 و 8 نوع كار تركيبي در ذهنم هست ، اگه جستجو كنيد راههاي مناسب تري هم پيدا ميكنيد.

ممنون از شما دوست عزیز

بزارید اول بگم که می خوام چی کار کنم.
من دارم بازی minesweeper ویندوز رو می نویسم. برای اینکه تعداد پیکچر باکس ها و button هام زیاد هست و می خوام در یک حلقه اعداد تعداد بمب ها رو در پیکچر باکس ها بنویسم باید این روش رو به کار ببرم .

مثلا اگه تعداد خانه ها 60 تا باشه :


for(x=0;x<=10;x++)z
for(y=0;y<=6;y++)z

lbl(1-x,1-y)z
lbl(x,1-y)z
lbl(1+x,1-y)z
lbl(1-x,y)z
lbl(1+x,y)z
lbl(1-x,y+1)z
lbl(x,y+1)z
lbl(x+1,y+1)z

(z ها رو حذف کنید)کار این کد اینکه : اگر خونه بمب نباشه 8 تا خونه اطرافش رو چک می کنه و تعداد بمب ها رو در اون قرار می ده.

حالا چطور می شه که این لیبل ها رو من در دات نت اینطوری استفاده کنم.

h.jaza
دوشنبه 11 آذر 1387, 21:23 عصر
می تونی به جای استفاده از کلی لیبل از یه دیتاگرید استفاده بکنی که هر خونش باتن هست. اینجوری خیلی ساده تر می تونی این کارهایی رو که می خوای انجام بدی و پروژه ای رو که مطرح کردی، پیاده سازی بکنی.

EbiPenMan
دوشنبه 11 آذر 1387, 21:39 عصر
می تونی به جای استفاده از کلی لیبل از یه دیتاگرید استفاده بکنی که هر خونش باتن هست. اینجوری خیلی ساده تر می تونی این کارهایی رو که می خوای انجام بدی و پروژه ای رو که مطرح کردی، پیاده سازی بکنی.

آخه اگه بازي رو ديده باشي زير هر دكمه يه پيكچر باكس هست كه يا تعداد بمب هاي اطراف رو نشون ميده با در آخر بازي تصوير بمب رو نشون مي ده.

من فقط مي خوام پيكچر باكس هام و دكمه هام رو بتونم در يك حلقه يكي يكي چك كنم يا عكسش رو عوض كنم.

آخه اول بازي يك آرايه 2 بعدي به صورت رندم مقدار مثلا 10 تا از عنصر ها رو بمب مي كنه.
من بر اساس اين آرايه بايد پيكچر باكسي رو كه ايندكسش با اون يكي هست رو تغيير بدم و ...

h.jaza
دوشنبه 11 آذر 1387, 23:11 عصر
آخه اگه بازي رو ديده باشي زير هر دكمه يه پيكچر باكس هست كه يا تعداد بمب هاي اطراف رو نشون ميده با در آخر بازي تصوير بمب رو نشون مي ده.
خوب این با روشی که من مطرح کردم، چه ناسازگاری ای داره؟

من فقط مي خوام پيكچر باكس هام و دكمه هام رو بتونم در يك حلقه يكي يكي چك كنم يا عكسش رو عوض كنم.
اما در این مورد، همون راه مجید جان، راه خوب و مناسبی هستش.

EbiPenMan
دوشنبه 11 آذر 1387, 23:25 عصر
تا اونجا كه من خبر دارم ديتاگريد رو هر فيلدش رو ميشه فقط يه button گذاشت . حلا براي picturebox هاي زيرش چي كار كنم.

راه آقا مجيد هم آره ولي چون آرايه من 2 بعدي هست . براي اينكه جاي button رو راحت تر پيدا كنم مي خوام اونم يه جور دو بعدي باشه.

اصلا من 3 تا دكمه دارم توي يه فرم اگه به خوام text هر كدوم رو عوض كنم اينطور ميشه :
btn_1.text="Mine"
btn_2.text="Mine"
btn_3.text="Mine"
حالا اگه اينا به صورت ايندكسي باشن اينطوري مي شه استفاده كرد :
for(x=0;x<2;X++)z
btn(x).text="Mine"
حالا اينارو چطوري بسازم. دو بعديش چطور ميشه ساخت؟

h.jaza
دوشنبه 11 آذر 1387, 23:51 عصر
دوست عزیز این کاری رو که شما گفتین، فکر نمی کنم بشه انجام داد.

سه تا پیشنهاد:
1- استفاده از روش دوستمون، آقا مجید که البته اونجوریمان که شما می گید نیست. با یکم فکر کردن، خیلی ساده میشه اون چیزی رو که می خوای پیاده سازی کرد.

2- روشی که خودم گفتم (دیتا گرید) که اون هم مشکلی نداره چرا که میشه در رویداد کلیکش، تایپش رو از باتن به اونی که می خوای تغییر بدی.

3- و روش آخری هم از همه بهتره و ساده تر و البته نیاز به مطالعه ی زیاد داره، طراحی توسط WPF هستش که دیگه اصلا کار رو هلو می کنه ولی باید بشینی قشنگ WPF یاد بگیری که ...

majid325
سه شنبه 12 آذر 1387, 05:14 صبح
تعداد پیکچر باکس ها و button هام زیاد هست و می خوام در یک حلقه اعداد تعداد بمب ها رو در پیکچر باکس ها بنویسم
.

شما نيازي به پیکچر باکس نداريد از Button.Image استفاده كنيد

حالا چطور می شه که این لیبل ها رو من در دات نت اینطوری استفاده کنم.

من يه نمونه كد كوچيك از codeproject ميزارم كه يه ديدي از كار كردن با اشيا به صورت arry در دات نت داشته باشي:

ButtonArray = new System.Windows.Forms.Button[iWidth,iHeight];

int x,y;
for (y=0 ; y<iHeight ; y++)
for (x=0 ; x<iWidth ; x++)
{
ButtonArray[x,y] = new System.Windows.Forms.Button();
ButtonArray[x,y].Location = new System.Drawing.Point(20 + x*16, 70 + y*16);
ButtonArray[x,y].Name = "";
ButtonArray[x,y].Size = new System.Drawing.Size(16,16);

iCellAddress = (0x1005340) + (32 * (y+1)) + (x+1);
memory = pReader.ReadProcessMemory((IntPtr)iCellAddress,1,o ut bytesReaded);
iIsMine = memory[0];

if (iIsMine == 0x8f)
ButtonArray[x,y].Image = ((System.Drawing.Bitmap)
(resources.GetObject("button1.Image")));

this.Controls.Add(ButtonArray[x,y]);
}


اينم لينك (http://www.codeproject.com/KB/trace/minememoryreader.aspx)خود برنامه ، شايد در نگاه اول كدش برات يه خورده سنگين باشه .

EbiPenMan
سه شنبه 12 آذر 1387, 07:26 صبح
سلام به همگي

دوستان ممنونم از همه تون براي راهنمايي هايي كه به من كرديد. مخصوصا از H.jaza و majid325 .

من تونستم جواب سوالم رو در اين لينك سايت آخر در سورس برنامش پيدا كنم. خيلي راحت هست و اصلا لازم نيست اين همه راه بريم.

من با خودم تو اين فكر بودن كه تو vb6 به اون راحتي مي شود آبجكت رو به صورت آرايه اي كرد آخه ميشه دات نت بياد اينو برداره يا سخت تر كنه.

اين كد پايين نه تا button مي سازه :




private System.Windows.Forms.Button[,] ButtonArray = null;
private void Form1_Load(object sender, EventArgs e)
{
ButtonArray = new System.Windows.Forms.Button[3, 3];

int x, y;
for (y = 0; y < 3; y++)
for (x = 0; x < 3; x++)
{
ButtonArray[x, y] = new System.Windows.Forms.Button();
ButtonArray[x, y].Location = new System.Drawing.Point(20 + x * 16, 70 + y * 16);
ButtonArray[x, y].Name = "";
ButtonArray[x, y].Size = new System.Drawing.Size(16, 16);

this.Controls.Add(ButtonArray[x, y]);
}

h.jaza
سه شنبه 12 آذر 1387, 13:19 عصر
دوست عزیز از شما تشکر می کنم.

و یه نکته که چون تازه کار هستین بهش اشاره می کنم: در صورتی که تاپیکتون به جواب رسید، از قسمت ابزارهای تاپیک، تایید پاسخ های ارسالی به عنوان راه حل رو چک کنید، تا سرانجام تاپیک معلوم باشه. :لبخند:

بعد از اعمال، این پست رو یا خودم پاک می کنم یا مدیرا زحمتشو بکشن.

با تشکر