PDA

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



aliqqq
پنج شنبه 21 تیر 1386, 23:44 عصر
سلام
در برنامه ی خودمون (به زبان c#(چندین فرم داریم میخوایم متغیری تعریف کنیم که همه ی فرمها بتونن ازش استفاده کنن کجا و چطوری تعریفش کنیم ؟
مرسی

jeus
جمعه 22 تیر 1386, 00:21 صبح
باید public تعریف کنی

mehdi.mousavi
جمعه 22 تیر 1386, 00:52 صبح
سلام
در برنامه ی خودمون (به زبان c#(چندین فرم داریم میخوایم متغیری تعریف کنیم که همه ی فرمها بتونن ازش استفاده کنن کجا و چطوری تعریفش کنیم ؟
مرسی


سلام.
لطفا اینکار رو نکنید! انجام چنین کاری مطلقا صحیح نیست. شما باید مدلی از Business Entity های خودتون داشته باشید و تغییرات رو روی مدل اعمال کنید. UI باید خودش رو برای گرفتن تغییرات مدل register کرده باشه، هر گاه تغییر در مدل رخ داد، UI مطلع میشه و خودش رو بنا به نیاز به روز می کنه.

بعنوان مثال Visual Studio رو در نظر بگیرید. وقتی شما در حال ویرایش یه فایل CS دراین محیط هستید و اون فایل رو از Solution Explorer پاک می کنید، پنجره فعال بسته میشه، نام فایل از درخت مربوط به Solution Explorer حذف میشه، منوی اصلی Update میشه و Status bar پیام مناسبی رو بهتون نشون میده و ....

برای نوشتن چنین چیزی به دو طریق میشه عمل کرد:

الف . کلیه عملیات رو بصورت رویه ای انجام بدید، یعنی بگید

1. آیا کاربر فایل رو پاک کرد؟
2. اگه document مربوط به این فایل باز هستش، اونو ببند.
3. برو تو treeview و فلان node رو حذف کن.
4. منوها رو update کن.
5. statusbar رو update کن
و و و ....

ب. بیایید یه مدل بسازید واسه فایلهایی که قرار باهاشون کار کنید. هر کاری که انجام میدین رو این مدل انجام میدین. مثلا وقتی کاربر یه فایل رو پاک میکنه، شما میرید و به مدل میگید که فلان فایل رو پاک کنه. به این ترتیب event ای برای همه اونهایی که مشتاق این event هستند ارسال میشه. مثلا treeview میفهمه که فلان فایل پاک شدش و خودش میدونه که باید بره و فلان Node ور از درخت پاک کنه. وقتی statusbar این event رو گرفت، میدونه که باید بره و خودش رو update کنه و نشون بده که فلان فایل پاک شده و .... در نتیجه، هر کنترل وظیفه خودش رو انجام میده و دیگه مجبور نیستید اونجایی که دارید نودی رو از درخت پاک میکنید، خط بعدش برید و statusbar رو Update کنید! یعنی همه چیز Modular میشه.


اگر این کارو کنید، دیگه لازم نیست که متغیری از کلاس رو public بذارید که هر کسی بتونه تغییرش بده و در نهایت کلاف سردرگمی درست بشه که مدیریتش بسیار پیچیده باشه.

gomnam
جمعه 22 تیر 1386, 07:09 صبح
سلام.
لطفا اینکار رو نکنید! انجام چنین کاری مطلقا صحیح نیست. شما باید مدلی از Business Entity های خودتون داشته باشید و تغییرات رو روی مدل اعمال کنید. UI باید خودش رو برای گرفتن تغییرات مدل register کرده باشه، هر گاه تغییر در مدل رخ داد، UI مطلع میشه و خودش رو بنا به نیاز به روز می کنه.

بعنوان مثال Visual Studio رو در نظر بگیرید. وقتی شما در حال ویرایش یه فایل CS دراین محیط هستید و اون فایل رو از Solution Explorer پاک می کنید، پنجره فعال بسته میشه، نام فایل از درخت مربوط به Solution Explorer حذف میشه، منوی اصلی Update میشه و Status bar پیام مناسبی رو بهتون نشون میده و ....

برای نوشتن چنین چیزی به دو طریق میشه عمل کرد:

الف . کلیه عملیات رو بصورت رویه ای انجام بدید، یعنی بگید

1. آیا کاربر فایل رو پاک کرد؟
2. اگه document مربوط به این فایل باز هستش، اونو ببند.
3. برو تو treeview و فلان node رو حذف کن.
4. منوها رو update کن.
5. statusbar رو update کن
و و و ....

ب. بیایید یه مدل بسازید واسه فایلهایی که قرار باهاشون کار کنید. هر کاری که انجام میدین رو این مدل انجام میدین. مثلا وقتی کاربر یه فایل رو پاک میکنه، شما میرید و به مدل میگید که فلان فایل رو پاک کنه. به این ترتیب event ای برای همه اونهایی که مشتاق این event هستند ارسال میشه. مثلا treeview میفهمه که فلان فایل پاک شدش و خودش میدونه که باید بره و فلان Node ور از درخت پاک کنه. وقتی statusbar این event رو گرفت، میدونه که باید بره و خودش رو update کنه و نشون بده که فلان فایل پاک شده و .... در نتیجه، هر کنترل وظیفه خودش رو انجام میده و دیگه مجبور نیستید اونجایی که دارید نودی رو از درخت پاک میکنید، خط بعدش برید و statusbar رو Update کنید! یعنی همه چیز Modular میشه.


اگر این کارو کنید، دیگه لازم نیست که متغیری از کلاس رو public بذارید که هر کسی بتونه تغییرش بده و در نهایت کلاف سردرگمی درست بشه که مدیریتش بسیار پیچیده باشه.

سلام
میشه لطف کنید و یه مثال عملی در مورد این مطلبی که توضیح دادین بزنین؟ یا لینک خاصی اگه دارین بفرستین
ممنون

mehdi.mousavi
جمعه 22 تیر 1386, 13:07 عصر
سلام
میشه لطف کنید و یه مثال عملی در مورد این مطلبی که توضیح دادین بزنین؟ یا لینک خاصی اگه دارین بفرستین
ممنون


سلام.
راستش فرصت کد نوشتن رو ندارم، اما برای اینکه کاملا متوجه این مساله بشید، باید با Model-View-Controller آشنا بشید. در واقع MVC الگویی به شما ارائه میده که میتونید توسط این الگو و با رعایت قوانینی کاملا ساده از بوجود اومدن بی نظمی در نرم افزار جلوگیری کنید. MVC در زبانهای برنامه نویسی متفاوت بصورتهای متفاوت پیاده سازی میشه، چون هر زبونی قابلیتهای خاص خودش رو داره و حیف بوده که اون قابلیتها در پیاده سازی این الگو استفاده نشه. در نتیجه شما باید کتبی در زمینه MVC و Pattern ها در C# مطالعه کنید.

mohammad272005
جمعه 05 مرداد 1386, 04:19 صبح
سلام.
لطفا اینکار رو نکنید! انجام چنین کاری مطلقا صحیح نیست.
دوست من لزومی نداره همیشه از مدل n-layer استفاده کنیم. گاهی یه برنامه داری که واقعا کار بزرگی انجام نمی‏ده.

به نظر من شما یا یه کلاس internal public بگیر و تو Program ازش instance بگیر و متغیرهای عمومی خودت رو تو کلاست بزار یا از اول این کلاس رو static کن تا حتی نیازی به instance هم نداشته‏باشه. بسته به نیازت یکیشو انتخاب کن.