PDA

View Full Version : سوال: مشکل در مقدار گرفتن آرایه



sajjadrad
چهارشنبه 15 دی 1389, 09:02 صبح
سلام دوستان خسته نباشید
قطعه کد پایین رو ببینید:



int[] a;
a = new int[10];
switch (comboBox1.SelectedIndex)
{
case 0:
for (int i = 0; i < 10; i++)
{
Form2 frm2 = new Form2();
frm2.ShowDialog();
a[i] = num;
}
break;
case 1:
label2.Text = System.Convert.ToString(checkMax(a,10));
label3.Text = System.Convert.ToString(checkMin(a, 10));
break;


من یه آرایه نعریف کردم و با استفاده از حلق for مقدارش رو از form2 گرفتم و تو هر عنصرش ریختم
اما وقتی از حلقه for بیرون میاد تمام مقدار های عناصر صفره....
num هم در form1 بصورت پایین تعریف شده:


public static int num;

مشکل از کجاست؟

tooraj_azizi_1035
چهارشنبه 15 دی 1389, 09:36 صبح
سلام،
اول اینکه بگو دقیقاً می خوای چی کار کنی؟
توضیح کدت:
شما تو حلقه For هر بار میای متغیری از نوع Form2 تعریف می کنی و یک نمونه از اون تو حافظه ایجاد می کنی. دفعه بعد که حلقه اجرا می شه باز یه شیء Form2 درست می کنی و Form2 قبلی اصطلاحاً بی صاحب می مونه و Garbage Collector اون رو به صورت یک زباله شناسایی می کنه. البته همه فرم ها نمایش داده می شن.
ولی نه تای اولی بی صاحب هستند یعنی هیچ متغیری به اونها اشاره نمی کنه.
متغیرnum هم مقدار صفر داره و تو تمام عناصر آرایه a کپی می شه. نمی دونم هدفت از نوشتن این کدها چیه؟

sajjadrad
چهارشنبه 15 دی 1389, 09:45 صبح
تو این برنامه یه combobox طراحی شده که گزینه اولش ReadArray هست...یعنی آرایه رو میخونه
گزینه دوم هم بزرگترین و کوچترین عنصر آرایه رو بر میگردونه...تابع ها مشکلی ندارن چون تست کردم...یعنی به آرایه مقدار اولیه دادم کار کرد.
خب من میخوام به ده عنصر آرایه a مقدار بدم
برای اینکار از یه فرم استفاده کردم.در هر حلقه form2 یبار ایجاد میشه و پس از مقدار دهی به num بسته میشه.در حقیقت کد زیر رو پس از فشردن دکمه اوکی اجرا میکنه:


Form1.num=System.Convert.ToInt32( textBox1.Text);
this.Close();

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

tooraj_azizi_1035
چهارشنبه 15 دی 1389, 10:21 صبح
ببین من اینطوری متوجه شدم که شما می خوای یک فرم رو باز کنی و از Textbox یه مقدار رو بگیری. و این کار رو 10 بار انجام بدی و در نهایت Min و Max رو داخل دو TextBox نمایش بدی. اگه درست می گم تایید کن تا بریم جلوتر.

sajjadrad
چهارشنبه 15 دی 1389, 10:28 صبح
آره من میخوام از طریق form2 ده مقدار رو بگیرم و در ده عنصر آرایه بریزم
بعد با استفاده از تابع max و min دو مقدار بازگشتی رو تو لیبل ها بریزم

tooraj_azizi_1035
چهارشنبه 15 دی 1389, 10:41 صبح
خوب اول اینکه اگه حتماً می خوای برای گرفتن یه مقدار یه فرم باز بشه قضیه اینطوری میشه:
یه فرم داریم که توش بازدن یه دکمه قراره 10 تا فرم باز بشه یعنی فرم مادر. کد مربوط به Click دکمه اینه:
فرم مادر یه فیلد آرایه ای به نام num[10] داره. که static نیست و public هست.

خارج از حلقه For:
Form2[] frm=new Form2[10];
داخل حلقه For باید اینطوری بنویسی:
frm.FormClosed+=new delegate {frmMother.num[i]=text1.text;};
frm[i].Show();

البته Convert text رو خودت انجام بده.
همین.

sajjadrad
چهارشنبه 15 دی 1389, 11:06 صبح
یه فرم داریم که توش بازدن یه دکمه قراره 10 تا فرم باز بشه یعنی فرم مادر.

ببینید تو فرم مادر ما یه combobox + یه دکمه داریم
فرض میکنیم کاربر گزینه خواندن آرایه رو کلیک کنه:
ابتدا یه آرایه با طول 10 تعریف میشه:


int[] a;
a = newint[10];

بعد به کیس مورد نظر تو سوییچ میره:


for (int i = 0; i < 10; i++)
{
Form2 frm2 = newForm2();
frm2.ShowDialog();
a[i] = num;
}


تو اینجا showdialog شده یعنی تا بسته نشدن فرم جدید ادامه دستوراتفرم مادر انجام نمیشه
تو فرم جدید کاربر یه عدد وارد میکنه
این عدد در متغیر num که یه مقدار صحیح هست ریخته میشه.
بعد فرم بسته میشه
متغیر نام در خونه مورد نظر از آرایه ریخته میشه
اینا تا اینجا درسته
مشکل اینه که بعد از خروج از حلقه فور
تمام مقادری آرایه صفر میشه

tooraj_azizi_1035
چهارشنبه 15 دی 1389, 11:16 صبح
من فرض کردم که تو فرم مادر یه فیلد داری که آرایه 10 عنصری num هست که قرار مقادیر 10 فرم رو بگیره. چطوری؟ با کلیک دکمه ابتدا این کد اجرا میشه:
Form2[] frm=new Form2[10];
یعنی یه متغیر 10 عنصری از نوع Form2. حالا تو حلقه For هر 10 تام فرم باید باز بشه و مقدار رو بگیره. برای این کار فرم رو Show می کنی. قبل از اون باید تو رویداد FormClosed کدی بنویسی که اگه کاربر فرم رو بست مقدار TextBox اون فرم تو num فرم مادر قرار بگیره که کدش رو نوشتم. البته یه مسئله ای هست اونم اینه که هر 10 تا فرم احتمالاً با هم باز می شن. با ShowModal تست کن ببین اینطوری میشه یا نه. کجای قضیه برات مبهمه؟

sajjadrad
چهارشنبه 15 دی 1389, 11:40 صبح
مرسی دوست عزیز
یکی از مشکلات این بود که آرایه رو تو کلاس دکمه تعریف کرده بودم.
مشکل حل شد.:خجالت: