PDA

View Full Version : متغیر اشتراکی بین دو فرم



tanha70
دوشنبه 03 فروردین 1394, 19:32 عصر
سلام

ما ۲ تا فرم داریم که میخوایم به تعدادی از متغییر هایی که در فرم ۱ قرار دارند در فرو ۲ دسترسی داشته باشیم.
یک راه این کار اینه که از متغیر static استفاده کنیم که این امر برامون امکان پذیر نیست و روش دوم هم اینه که در فرم ۲ فرم یک را new کنیم که اینم مدنظر ما نیست.
به غیر از این روش، روش دیگری هم هست؟ و اگر هست به چه شکلی میباشد؟

امیر مهرشاد
دوشنبه 03 فروردین 1394, 20:13 عصر
متغیر ها رو میتونید در یک کلاس بزارید و پرارپرتی خ.اندنی و ن.شتنی داشته باشند یا بصورت public تعریف کنید

LastAirbender
دوشنبه 03 فروردین 1394, 20:49 عصر
سلام

ما ۲ تا فرم داریم که میخوایم به تعدادی از متغییر هایی که در فرم ۱ قرار دارند در فرو ۲ دسترسی داشته باشیم.
یک راه این کار اینه که از متغیر static استفاده کنیم که این امر برامون امکان پذیر نیست و روش دوم هم اینه که در فرم ۲ فرم یک را new کنیم که اینم مدنظر ما نیست.
به غیر از این روش، روش دیگری هم هست؟ و اگر هست به چه شکلی میباشد؟

سلام ، واقعا من نمی فهمم چرا استفاده از متغیرهای static براتون امکان پذیر نیست؟ یا اینکه چرا نمی تونین از روی یک Class یک نمونه Object بسازید ، این متغیرهایی که می فرمایید چه نوع متغیرهایی هستن و چه استفاده ای میخواید ازشون بکنید؟ لطفا دقیقا بفرمایید که قصد دارید چکار بکنید تا بشه بهتون یک جواب مناسب داد ،

tanha70
دوشنبه 03 فروردین 1394, 22:29 عصر
سلام ، واقعا من نمی فهمم چرا استفاده از متغیرهای static براتون امکان پذیر نیست؟ یا اینکه چرا نمی تونین از روی یک Class یک نمونه Object بسازید ، این متغیرهایی که می فرمایید چه نوع متغیرهایی هستن و چه استفاده ای میخواید ازشون بکنید؟ لطفا دقیقا بفرمایید که قصد دارید چکار بکنید تا بشه بهتون یک جواب مناسب داد ،
متغیر static باید داخل محیط استاتیک هم تعریف بشه و کلاس اصلی ما هم استاتیک نیست و امکانش هم نیست که استاتیکش کنیم.
از طرفی هم اگر در فرم دیگه ازش obj بسازیم مقادیری که متغیرها در فرم اصلی دارن رو دیگه نخواهند داشت. یعنی من میخوام زمانی که متغیری در فرم ۱ تغییر کرد در فرم ۲ هم تغییر کنه. یه جورایی اشتراکی باشه مثه static ولی مثه static محدود به این نباشیم که حتما داخل یه محیط استاتیک تعریف بشه...

tanha70
دوشنبه 03 فروردین 1394, 22:31 عصر
متغیر ها رو میتونید در یک کلاس بزارید و پرارپرتی خ.اندنی و ن.شتنی داشته باشند یا بصورت public تعریف کنید
اگر این کار رو هم کنم که باید تو هر دو تا فرم ازش obj بسازم و دو گونه مختلف از متغیرهای خواهیم داشت که اینم مدنظر ما نیست...

LastAirbender
دوشنبه 03 فروردین 1394, 23:04 عصر
متغیر static باید داخل محیط استاتیک هم تعریف بشه و کلاس اصلی ما هم استاتیک نیست و امکانش هم نیست که استاتیکش کنیم.
از طرفی هم اگر در فرم دیگه ازش obj بسازیم مقادیری که متغیرها در فرم اصلی دارن رو دیگه نخواهند داشت. یعنی من میخوام زمانی که متغیری در فرم ۱ تغییر کرد در فرم ۲ هم تغییر کنه. یه جورایی اشتراکی باشه مثه static ولی مثه static محدود به این نباشیم که حتما داخل یه محیط استاتیک تعریف بشه...

ببین دوست من شما می تونی تو همون فضای نامی که بقیه Form هات توش قرار داره به این شکل یک Class عمومی استاتیک ایجاد کنی و متغیر هایی رو که در بیش از یک فرم بهش احتیاج داری توش تعریف کنی :

public static class GlobalInfo
{
public static string program_name= "executable.exe";
public static string program_mode = "ready";
/* ......etc....... */

}

خب حالا این متغیر ها تعریف شدن و شما بهش تو هرکدوم از Form هات خواستی مقدار میدی و تو هرکدومم خواستی فراخونی می کنی. خب الان مشکل کجاس؟

LastAirbender
دوشنبه 03 فروردین 1394, 23:09 عصر
البته این ها الان به صورت فیلد هستن شما میتونی اونارو به صورت خاصیت یا متد تعریف کنی م موقعی set و get مثلا بررسی کنی ببینی کدای داخل کدوم فرمت دارن متغیر مذکور رو Read یا Write می کنن..
پ ن : نگفتید چه نوع متغیرهایی رو و برا چه استفاده ای میخواید ، مثلا اگر متغیرهاتون زیاد هست می تونید آرایه ها استفاده بکنید، اگر اینها قراره setting عمومی برنامتون باشه خب در یک فایل inf مثلا ذخیره بکنید بهتر هست ، ..

tanha70
سه شنبه 04 فروردین 1394, 00:44 صبح
تا حد زیادی به جوابام رسیدم و ازتون تشکر میکنم.
حالا اگر متغیر اشتراکی ما یه شی مثه richtextbox باشه باید چه کار کنیم؟

esafb52
سه شنبه 04 فروردین 1394, 00:51 صبح
با سلام
دوست عزیز شما که با خود شی کار نمیکنید بلکه با خاصیت هاش کار میکنی مثلا در این شی به خاصیت تکس اش کار داری شما هرجا لازم داشتی از طریق پراپرتی ها گت و ست کن
موفق باشی

LastAirbender
سه شنبه 04 فروردین 1394, 09:30 صبح
تا حد زیادی به جوابام رسیدم و ازتون تشکر میکنم.
حالا اگر متغیر اشتراکی ما یه شی مثه richtextbox باشه باید چه کار کنیم؟

با سلام ، ببینید در Csharp همه کنترل ها یک Object و همه Object ها یک متغیر و همه متغیر ها هم یک Object و انواع متغیری باز خودشون می تونن یک Class باشن ، همونطور که میدونید VS موقع Drag/Drop کاری که میکنه در قسمت Designer میاد کدهای سیشارپ ای رو به صورت اتوماتیک ایجاد میکنه که این کنترل ها رو میسازه (از رو کلاسشون نمونه سازی میکنه) بعد اونها رو مقدار دهی میکنه و بعد با متد this.Controls.Add (که this همون فرم جاری هست) میاد اون رو به صفحتون اضافه میکنه، من توصیم به همه دوستان تازه وارد این هست یکبار هم که شده با استفاده از notepad و command prompt ویندوز و فقط با استفاده از DotNetFramework نه با یک IDE مثل VS بیاین یک ماشین حساب یا دیکشنری ای چیزی بسازین تا این مفاهیم رو بهتر درک بکنین بماند..من اینجا نمی خوام بگم خودتون برین اینها رو دستی بسازین یا قسمت Design رو ویرایش بکنین ، فرض میکنم شما کنترلتون رو دستی کشیدین انداختین روی Form1 ، خب حالا کاری که باید انجام بدین موقع نمایش Form2 میایان به این شکل عمل می کنین :
new Form2(this).Show();
یعنی هنگام ساخت فرم 2 فرم جاری رو به عنوان یک آرگومان برای متد سازنده Form2 ارسال می کنین ، حالا در متد سازنده Form2 کاری که باید بکنین این آرگومنت رو دریافت و در متغیر مناسب set میکنین:
public partial class Form2 : Form
{
Form main_form;
public Form2(Form frm1)
{
this.main_form = frm1;
InitializeComponent();
}

/****** Rest Of Class Members ************************/

}

حال کافیه در متد یا رویداد مورد نظر مثلا کلیک شدن button1 به این شکل عمل بکنین :
private void button1_Click(object sender, EventArgs e)
{

RichTextBox main_rtb= (RichTextBox)this.main_form.Controls["richTextBox1"];
main_rtb.Text=main_rtb.Text+ "\n writen by form2!";


}

اگه در فرم 1 هم اینو داشته باشین :
private void button1_Click(object sender, EventArgs e)
{
richTextBox1.Text =richTextBox1.Text+ "\nwriten by form1";
}
می تونید نتیجه رو مشاهده بکنید، موفق باشید

tanha70
سه شنبه 04 فروردین 1394, 12:57 عصر
با سپاس فراوان از شما

مشکل به روشی که گفتین حل شد...