PDA

View Full Version : مشخص کردن وضعیت اشیاء ایجاد شده از یک کلاس



zahra1372
شنبه 29 شهریور 1393, 09:08 صبح
سلام
چطوری میشه فهمید از یه فرم قبلا شی ای ایجاد شده یا نه؟؟

Davidd
شنبه 29 شهریور 1393, 09:46 صبح
سلام
يه متغير public static با مقدار اوليه صفر در فرم مربوطه بسازيد كه هنگامي كه يه فرم جديد ساخته ميشه يكي بهش اضافه بشه (داخل تابع سازنده فرم) و هنگامي كه فرم از بين ميره يكي ازش كم بشه (داخل تابع destructor فرم)
هر جا كه نياز بود با چك كردن اين متغير استاتيك ميشه فهميدچند نمونه از فرم در حال حاضر وجود داره.
public static int InstanceNO = 0;
public Form1()
{
InitializeComponent();
InstanceNO++;
}
public ~Form1() { InstanceNO--; }

zahra1372
شنبه 02 خرداد 1394, 18:26 عصر
سلام
يه متغير public static با مقدار اوليه صفر در فرم مربوطه بسازيد كه هنگامي كه يه فرم جديد ساخته ميشه يكي بهش اضافه بشه (داخل تابع سازنده فرم) و هنگامي كه فرم از بين ميره يكي ازش كم بشه (داخل تابع destructor فرم)
هر جا كه نياز بود با چك كردن اين متغير استاتيك ميشه فهميدچند نمونه از فرم در حال حاضر وجود داره.
public static int InstanceNO = 0;
public Form1(){
InitializeComponent();
InstanceNO++;
}
public ~Form1(){
InstanceNO--;
}


اوکی!
یه لحظه ...!
اینایی که مشخص کردم در واقع میشن سازنده و مخرب فرم 1؟ درسته؟:متفکر:

ebrahim.rayatparvar
شنبه 02 خرداد 1394, 18:28 عصر
سلام
بهتره متغیر Static که داری درست می کنید توی یه کلاس Static باشد. اینجوری بهتره.

zahra1372
شنبه 02 خرداد 1394, 18:30 عصر
سلام
بهتره متغیر Static که داری درست می کنید توی یه کلاس Static باشد. اینجوری بهتره.

فرق اینکه اینجا تعریف بشه یا اینکه جدا تو یه کلاس تعریف بشه چیه؟
فرقش تو سطح دسترسیشونه؟ یا برای واضح تر بودن برنامه؟!

ebrahim.rayatparvar
شنبه 02 خرداد 1394, 18:58 عصر
من امتحان نکردم ولی زمانی که فرمی ساخته میشه به وسیله دستور new یه حافظه جدید دریافت میکنه و زمانی که بسته میشه از حافظه پاک میشه یعنی همراه با تمام متغیر ها و جزئیات ولی زمانی که کلاس Static باشه دیگه کاری به فرم نداره و در تمتام فرم ها قابل دست رسی است.

zahra1372
شنبه 02 خرداد 1394, 19:06 عصر
سوال قبلمم اگه ممکنه جواب بدییین

ebrahim.rayatparvar
شنبه 02 خرداد 1394, 19:19 عصر
اگه منظور شما



چطوری میشه فهمید از یه فرم قبلا شی ای ایجاد شده یا نه؟؟


باید بگم کدی که دوست خوبمون گذاشتن با کمی تغیر به سبک من بخواین بنویسین به این شکل میشه



public Form2()

{

InitializeComponent();

ClsStatic.InstanceNO++;

}


و در داخل فرم1 زمانی خواستید فرم2 رو صدا کنید به شکل زیر بنویسید


if (ClsStatic.InstanceNO == 0)
{
new Form2().ShowDialog();
}
else
{
//--------- اگه دوست دارید پیغام خطا بزارید
}

zahra1372
شنبه 02 خرداد 1394, 20:37 عصر
ممنون متوجه شدم اینو
ولی منظورم پست #3 بود

ebrahim.rayatparvar
شنبه 02 خرداد 1394, 20:48 عصر
اگه منظر شما اونه آره

SabaSabouhi
یک شنبه 03 خرداد 1394, 08:52 صبح
من امتحان نکردم ولی زمانی که فرمی ساخته میشه به وسیله دستور new یه حافظه جدید دریافت میکنه و زمانی که بسته میشه از حافظه پاک میشه یعنی همراه با تمام متغیر ها و جزئیات ولی زمانی که کلاس Static باشه دیگه کاری به فرم نداره و در تمتام فرم ها قابل دست رسی است.

سلام
دوست عزیز، Property اگه Static باشه محل نگهداری اون همراه با شی ایجاد شده از اون کلاس نیست. نگران از بین رفتنش نباش.
نیازی نیست برای این کار کلاس static جداگانه در نظر بگیری.

صبا صبوحی

SabaSabouhi
یک شنبه 03 خرداد 1394, 09:03 صبح
سلام
وقتی دیدم 10 پست رد و بدل شده، انتظار داشتم پاسخ هم توش باشه، اما نبود.
برای این کار نیاز به یک لیست Static از همین کلاس داری. برای مقداردهی اون از سازنده‌ی static استفاده کن.
هنگام ایجاد هر شی جدید اون رو به این لیست اضافه کن.
برای خارج کردن هم لازمه که IDisposable رو پیاده سازی کنی.

public class MyClass: IDisposable {
public static List<MyClass> InstanceList{ get; private set; }

static MyClass(){
InstanceList = new List<MyClass>();
}
public MyClass(){
. . .
InstanceList.Add( this );
}
public void Dispose(){
InstanceList.Remove( this );
}
}

به همین راحتی، با این کد فهرستی از اشیاء ایجاد شده رو خواهی داشت.
با New شدن، شی به لیست اضافه ‌می‌شه و با Dispose شدن هر شی، اون شی از فهرست خارج می‌شه.


صبا صبوحی