PDA

View Full Version : کنترل کردن فرمها



arash ahmadi
شنبه 26 آبان 1386, 11:03 صبح
من در برنامه ام از تعداد زیادی فرم استفاده کردم. مرتب کاربر ممکن است از یک فرم به فرم دیگر برود وسپس به فرم قبلی بازگردد. ایا راهی وجود دارد که کنترل کرد اگر فرم باز است یک شی دیگر از فرم ایجاد نشود .(اگر این کنترل صورت نگیرد ممکن است چندین کپی از فرم ایجاد شود)و اگر فرم بسته شده است.یک شی از فرم مورد نیاز کاربر ایجاد شود؟؟؟؟اگر ممکنه راهنمایی بفرمایید. من از متد isDisposed استفاده کردم. اما درست نشد!

arash ahmadi
یک شنبه 27 آبان 1386, 19:00 عصر
کسی راه حلی به نظرش نمی رسه

Alireza_Salehi
یک شنبه 27 آبان 1386, 19:49 عصر
در مورد Singleton Pattern (http://www.dofactory.com/Patterns/PatternSingleton.aspx) جستجو کنید!

hassan razavi
یک شنبه 27 آبان 1386, 20:37 عصر
شما می تونید از الگوی Singleton استفاده کنید.
هدف اصلی الگوی Singleton محدودسازی ایجاد کلاسهاست. این الگو تضمین میکنه که فقط و فقط یک Instance از کلاس وجود داشته باشه. مثلا برای فرم مدیریت چاپ .
ساده ترین راه پیاده سازی این الگو این است که متغیری استاتیک را در کلاس معرفی کرده و سپس درConstructor کلاس ، هر بار که اقدام به ایجاد یک نمونه از آن کلاس میکنیم ، متغیر استاتیک را بررسی کنیم.
همچنین سازنده کلاس را هم Private میکنیم تا تنها از توسط یک متد استاتیک کلاس قابل دسترسی باشه.

اینهم یک نمونه کد :


public class test{
private static bool instance=false;
private test(){
}
public static test Gettest(){
if(!instance)
return new test;
else
return null;
}
}

// نحوه استفاده
test t=test.Gettest();

اَرژنگ
یک شنبه 27 آبان 1386, 23:09 عصر
[quote=hassan razavi;422508]
ساده ترین راه پیاده سازی این الگو این است که متغیری استاتیک را در کلاس معرفی کرده و سپس درConstructor کلاس ، هر بار که اقدام به ایجاد یک نمونه از آن کلاس میکنیم ، متغیر استاتیک را بررسی کنیم.

اینهم یک نمونه کد :


با تشکر از جناب رضوی، فقط ۲ نقطه کوچیک:
۱ـدر Constructor کلاس کاری نمیکنیم
۲ـروش پیاد سازی سینگلتن یکمی فرق دارد:
[code]
public class TestClass{
private static TestClass instance;
private TestClass(){
}
public static TestClass GetInstance(){
if(instance==null))
instance = new TestClass();
return instance;
}
}

// نحوه استفاده
TestClass anInstance = TestClass.GetInstance();

hassan razavi
دوشنبه 28 آبان 1386, 00:37 صبح
ارژنگ جان در کد شما ، بوسیله متد GetInstance می توان هر چند تا Instance که بخواهیم از کلاس بسازیم و لی در کدی که من نوشتم فقط بار اول یک نمونه از کلاس رو برمیگردونه و ما بقی تلاشها برای ساخت نمونه بجز بار اول ، Null هست. ولی در مثال شما با هر بار فراخوانی متد GetInstance میتوان یک Instance جدید از کلاس ساخت.



در مثال من
test t1=test.Gettest(); یک نمونه از کلاس را می سازد
test t2=test.Gettest(); مقدار null برمیگرداند

در مثال شما

TestClass t1= TestClass.GetInstance(); یک نمونه از کلاس را می سازد
TestClass t2= TestClass.GetInstance(); بازهم یک نمونه از کلاس را می سازد

اَرژنگ
دوشنبه 28 آبان 1386, 03:34 صبح
ارژنگ جان در کد شما ، بوسیله متد GetInstance می توان هر چند تا Instance که بخواهیم از کلاس بسازیم و لی در کدی که من نوشتم فقط بار اول یک نمونه از کلاس رو برمیگردونه و ما بقی تلاشها برای ساخت نمونه بجز بار اول ، Null هست. ولی در مثال شما با هر بار فراخوانی متد GetInstance میتوان یک Instance جدید از کلاس ساخت.



در مثال من
test t1=test.Gettest(); یک نمونه از کلاس را می سازد
test t2=test.Gettest(); مقدار null برمیگرداند

در مثال شما

TestClass t1= TestClass.GetInstance(); یک نمونه از کلاس را می سازد
TestClass t2= TestClass.GetInstance(); بازهم یک نمونه از کلاس را می سازد



خیر! فقط یکبار از کلاس نمونه میسازد، بعدش هر بار همان نمونه را برمیگردانه.
اون مثال مال من نیست، روش استاندارد پیاده‌سازیه سینگلتن هستش.
اگر به لینک http://www.dofactory.com/Patterns/PatternSingleton.aspx برید روش نرمال این کار را دارد.


TestClass t1= TestClass.GetInstance(); یک نمونه از کلاس را می سازد
TestClass t2= TestClass.GetInstance(); هردوشان به یک نمونه اشاره میکنند.

Mahdi.Kiani
دوشنبه 28 آبان 1386, 07:56 صبح
جناب رضوی روشتان کاملا غلط است !!!
یکی از بزرگترین ایراد اون اینه که در دفعات بعدی نمونه گیری، null بر میگردونه (به قول خودتون و با توجه به کدتون)

null برگردوندن ف میتونه بسیار خطرناک باشه و 100 درصد با توجه به کدی که شما نوشتین برنامتون crash خواهد شد
الان دات نت ندارم ولی اگه خواستین تا با نمونه کد نشون بدم که چگونه ممکنه برنامه با توجه به روش شما کنفیکون بشه
همانطور که جناب آرژنگ هم اشاره کردند روش درست سینگلتن همینه که ایشون گفتند نه اونی که جنابعالی دادین !!!






TestClass t1= TestClass.GetInstance(); یک نمونه از کلاس را می سازد
TestClass t2= TestClass.GetInstance(); بازهم یک نمونه از کلاس را می سازد





خوب تست کردن این موضوع کار ساده ایه
اگه باز هم فکر می کنین که با اجرای هر بار دستور فوق یک نمونه جدید ساخته میشه کد زیر را برای تست استفاده کنید





if(t1==t1)
// the Instances Are the Same



خواهید دید که شرط فوق درست است به این معنی که تا اشاره گری به کلاس وئجود داشته باشه همون برگشت داده میشه و در غیر اینصورت اشاره گر جدیدی ساخته خواهد شد.

البته درمورد سینگلتن به مراتب توی سایت گفته شده و جناب arash ahmadi بایستی در پست شماره 2 جواب خود را گرفته باشند و خودشان به این الگو و نحوه استفاده از آن پی برده باشند
موفق باشید

اَرژنگ
دوشنبه 28 آبان 1386, 08:49 صبح
دوستان! عزیزان!
یادمان نره که مهمتر از همه چیز با هم در اینجا خوش بودن است.
من این اشتباه را کردم و با تعصب به بعضی از روشها ایراد گرفتم، ولی وقتی که فکر میکنم میگم کاشکی از زبان بهتری استفاده کرده بودم و به جایه گفتن اینکه روشهایه بقیه اشتباهست ، به اآرامی و ملایمت روشهایه مختلف را بررسی میکردم.
هدف اولمان باید کمک کردن به یکدیگر باشد و اینکار را با خوشدلی به یکدیگر انجام بدیم.
روش ، روش من و تو ندارد، ما اینجا همه با هم هستیم،
مخلص همه بچه هایه برنامه‌نویس.

hassan razavi
دوشنبه 28 آبان 1386, 09:45 صبح
با تشکر از ارژنگ جان و night_fall عزیز ، حالا متوجه شدم که روش شما کاملا صحیح هست. متشکرم از توضیح کاملتون.
من کد فوق و الگوی Singleton را از کتاب " الگوهای طراحی برنامه نویسی شی گرا در #C " انتشارات ناقوس یاد گرفته بودم . ولی روش شما صحیح هست. باز هم ممنون از اینکه با متانت من رو قانع کردید.

arash ahmadi
دوشنبه 28 آبان 1386, 20:09 عصر
با تشکر از راهنمایی شما. من اگر بخواهم در فرمهایم از کلاس شما استفاده کنم باید در کلاس که شما کدش رو نوشتین. همه فرمهای برنامه رو ایجاد کنم و بعد از اون استفاده کنم.؟؟؟

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

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

hassan razavi
دوشنبه 28 آبان 1386, 22:07 عصر
نه دوست عزیز اشتباه نکنید.
کدهای ما نمونه ای برای نشان دادن روش پیاده سازی Singleton Pattern بودند. که البته کد صحیح ، کد ارژنگ خان هست.
شما باید این الگو رو برای فرمهاتون پیاده سازی کنید. یعنی مثل کدها ی بالا یک فیلد استاتیک از نوع فرمتون ایجاد کنید و سپس از با یک متد استاتیک دیگر از کلاس مورد نظر (همان فرمتون ) نمونه سازی کنید.

arash ahmadi
چهارشنبه 30 آبان 1386, 07:00 صبح
باسلام. من نحوه استفاده از کد شما را در فرم متوجه شدم. اما برای این کار باید به تعداد فرمها کلاس درست کنم. اگر ممکنه روشی پیشنهاد کنید که فقط از یک کلا س برای برنامه مدنظر استفاده شود.؟؟

اَرژنگ
چهارشنبه 30 آبان 1386, 10:04 صبح
باسلام. من نحوه استفاده از کد شما را در فرم متوجه شدم. اما برای این کار باید به تعداد فرمها کلاس درست کنم. اگر ممکنه روشی پیشنهاد کنید که فقط از یک کلا س برای برنامه مدنظر استفاده شود.؟؟
http://barnamenevis.org/forum/showthread.php?t=82834&#post412617
http://barnamenevis.org/forum/showthread.php?t=75257#post376926

arash ahmadi
سه شنبه 06 آذر 1386, 17:55 عصر
با تشکر از شما. اما اگر ممکنه راه حلی بدهید که از یک کلاس برای کنترل کردن کلیه فرمها استفاده شود؟؟؟

sinpin
چهارشنبه 07 آذر 1386, 08:25 صبح
با تشکر از شما. اما اگر ممکنه راه حلی بدهید که از یک کلاس برای کنترل کردن کلیه فرمها استفاده شود؟؟؟

از یک Generic Singleton استفاده کنید :


public class SingletonProvider <T> where T:new()
{
SingletonProvider() {}

public static T Instance
{
get { return SingletonCreator.instance; }
}

class SingletonCreator
{
static SingletonCreator() { }

internal static readonly T instance = new T();
}
}

منبع :
http://www.codeproject.com/csharp/GenericSingleton.asp

Payman62
جمعه 23 آذر 1386, 14:55 عصر
سلام.
چرا برای یه بار باز شدن فرم تابع مینویسید. با یه متغیر استاتیک هم میشه این کار رو کرد.
یه متغیر پابلیک و استاتیک در سطح کلاس تعریف میکنیم و مقدار فالس بهش میدیم. تو فرم لود این مقدار تورو میشه و تو فرم کلوزینگ فالس. هنگام باز کردن فرم هم چک میکنیم اگه فالس بود فرم باز کنیم.

sinpin
جمعه 23 آذر 1386, 15:13 عصر
سلام.
چرا برای یه بار باز شدن فرم تابع مینویسید. با یه متغیر استاتیک هم میشه این کار رو کرد.
یه متغیر پابلیک و استاتیک در سطح کلاس تعریف میکنیم و مقدار فالس بهش میدیم. تو فرم لود این مقدار تورو میشه و تو فرم کلوزینگ فالس. هنگام باز کردن فرم هم چک میکنیم اگه فالس بود فرم باز کنیم.

بله روش شما هم جواب میده (منتها با Hard Coding و استفاده از منطق خاص و ایجاد وابستگی)
استفاده از الگوی Singleton برای اینکار ابداع این تاپیک نیست و همیشه بهترین راه حل برای اینگونه مسایل است ( ساخت تنها یک آبجکت از یک کلاس)
و البته گاه در شرایط خاص ممکنه برای داشتن و ایجاد چند آبجکت مشخص و محدود نیز از نوع دیگری از Singleton Patternاستفاده کنیم. در اینصورت چنانچه مساله ما با چنین تغییری مواجه شد (تغییر از داشتن یک آبجکت به چند آبجکت) تنها کافیه الگوی مربوطه رو تغییر بدیم.

sinpin
جمعه 23 آذر 1386, 15:41 عصر
سلام.
چرا برای یه بار باز شدن فرم تابع مینویسید. با یه متغیر استاتیک هم میشه این کار رو کرد.
یه متغیر پابلیک و استاتیک در سطح کلاس تعریف میکنیم و مقدار فالس بهش میدیم. تو فرم لود این مقدار تورو میشه و تو فرم کلوزینگ فالس. هنگام باز کردن فرم هم چک میکنیم اگه فالس بود فرم باز کنیم.


به این تاپیک مراجعه نمایید :
Singleton pattern vs Static classes (http://barnamenevis.org/forum/showthread.php?t=87810)

sinpin
جمعه 23 آذر 1386, 15:42 عصر
منبع : http://www.sanity-free.org/132/generic_singleton_pattern_in_csharp.html (http://www.sanity-free.org/132/generic_singleton_pattern_in_csharp.html)


public static class Singleton<T> where T : new()
{
static Mutex mutex = new Mutex();
static T instance;
public static T Instance
{
get
{
mutex.WaitOne();
if(instance == null)
{
instance = new T();
}
mutex.ReleaseMutex();
return instance;
}
}
}

Farhads
پنج شنبه 06 دی 1386, 12:09 عصر
سلام

دوتا فرم Form1 و Form2 داریم. وقتی روی Form1 کلیک میشه نمونه ای از Form2 ساخته و نمایش داده میشه. فرضا دو بار روی Form1 کلیک میکنیم و دو نمونه از Form2 ساخته و نمایش داده میشه. حالا چطوری میتونم وقتی روی نمونه اول Form2 کلیک میشه رنگ زمینه نمونه دوم Form2 رو عوض کنم ؟

با تشکر

Farhads
جمعه 07 دی 1386, 10:40 صبح
کسی نیست پاسخ بده ؟

اَرژنگ
سه شنبه 11 دی 1386, 09:58 صبح
کسی نیست پاسخ بده ؟

چرا هستش، ولی سوال شما احتیاج به یک توپیک جدید دارد. (در قوانین سایت ذکر شده)

sinpin
دوشنبه 17 دی 1386, 21:42 عصر
این لینک رو هم ببینید :
http://barnamenevis.org/forum/showthread.php?p=446800

amirdeveloper
یک شنبه 06 اردیبهشت 1388, 17:28 عصر
در برنامه اي كه دارم مي نويسم قصد دارم محدوديتي ايجاد كنم كه كاربر تنها امكان باز كردن سه نمونه از يك فرم را داشته باشد، قاعدتا استفاده از الگوي سينگلتن بهترين روش به نظر مي‌رسه. اما دو مشكل دارم، يكي اينكه با استفاده از اين الگو با توجه به كدهاي جناب ارژنگ در اين تاپيك الگو درست عمل مي كنه و بيش از يك فرم باز نميشه اما وقتي يكبار فرم توسط كاربر بسته ميشه اگر كاربر مجددا فرم را باز كند با اين پيغام خطا در هنگام Show كردن فرم مواجه ميشم: Cannot access a disposed object.
و دوم اينكه دوستان اگر ممكنه راهنمايي كنن چطور ميشه اين الگو رو براي ايجاد محدوديت باز شدن حداكثر سه فرم در برنامه بهينه كرد.
با تشكر.

SMRAH1
دوشنبه 07 اردیبهشت 1388, 00:09 صبح
1) می توین یکی متغیر Static در کلاس فرم باری شمارش تعداد فرم باز شده، معرفی کنی که در هنگام نمونه سازی از فرم به اون افزوده می شود (در هر حال تعداد فرمهای باز شده را دارد).در این حالت در لحظه نمونه سازی،فرم اول باید تست کنه ببینه که به حداکثر نرسیده باشد.در ضمن اگر به حداکثر رسیده باشد باید چه کار کند (مقدار null برگرداند یا .... این سئوال رو شما به عنوان طراح باید جواب بدی)
2) در مورد « اين پيغام خطا در هنگام Show كردن مجدد» فرم هم حق با شما است چون وقتی فرم بسته می شود،در واقع ناید نابود شود ولی نابود نمی شود و هنوز کلاس singelton یک نمونه از اون رو داره.برای این کار باید فرایندی رو در نظر بگیری که در هنگام بسته شدن فرم به شکل اتوماتیک متغیر instance به null تبدیل شود (کافی رویداد formclosed رو بگیری و ...)