PDA

View Full Version : یک سوال در مورد ارتباط بین فرمها



Hamedm
جمعه 25 شهریور 1384, 18:27 عصر
سلام

یک پروژه داریم که دوتا فرم و یک ماژول داره و با SubMain هم پروژه اجرا میشه.
در ماژول کد زیر نوشته شده:

Public frmForm1 As New Form1
Public frmForm2 As New Form2

Public Sub main()

Application.Run(frmForm1)

End Sub
روی هر کدوم از فرمها یک Button وجود داره.
با کلیک بر روی Button فرم یک، فرم دو ظاهر میشه:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

frmForm2.Close()

End Sub
و با کلیک بر روی Button فرم دوم، فرم دوم بسته میشه:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

frmForm2.Close()

End Sub
یکبار Button فرم یک رو میزنیم و فرم دوم ظاهر میشه، سپس Button فرم دوم رو میزنیم و فرم دوم بسته میشه. حالا اگه مجددا Button فرم یک رو فشار بدیم پیغام زیر ظاهر میشه.


http://tinypic.com/dpirns.jpg


علت این پیغام چیه؟ و برای حل این مشکل چه کار باید کرد؟

در پناه حق موفق باشید و پرتوان

GentleGuy
جمعه 25 شهریور 1384, 18:49 عصر
میشه سورسه کدتو بزاری ؟؟؟؟؟

Hamedm
جمعه 25 شهریور 1384, 18:58 عصر
میشه سورسه کدتو بزاری ؟؟؟؟؟
سلام

چشم این هم سورس.

در پناه حق موفق باشید و پرتوان

asilverisis
شنبه 26 شهریور 1384, 01:52 صبح
سلام
قبل از FrmForm2.Show این رو بنویس



frmForm2 = New Form2

Hamedm
شنبه 26 شهریور 1384, 10:37 صبح
سلام
قبل از FrmForm2.Show این رو بنویس



frmForm2 = New Form2

سلام دوست عزیز

خیلی ممنون. مشکلم حل شد.

حالا میشه توضیح بدید اصلا مشکل چی بود؟

در پناه حق موفق باشید و پرتوان

asilverisis
شنبه 26 شهریور 1384, 21:22 عصر
سلام
خوب شما وقتی فرم رو می بندید Garbage Collector تمام اجزا اون رو از حافظه پاک می کنه
شما در واقع می خواستی فرمی رو که وجود خارجی نداشته Show کنی

موفق باشید

Hamedm
شنبه 26 شهریور 1384, 21:34 عصر
سلام
خوب شما وقتی فرم رو می بندید Garbage Collector تمام اجزا اون رو از حافظه پاک می کنه
شما در واقع می خواستی فرمی رو که وجود خارجی نداشته Show کنی

موفق باشید
سلام

از پاسختان تشکر میکنم.

آخه مگه frmForm2 بصورت Public تعریف نشده؟
من اینجوری فکر میکنم: وقتی که frmForm2 تعریف میشه در Stack یک خونه بخودش اختصاص میده حالا وقتی Show میشه یک اتصال از Stack به Heap ایجاد میشه و وقتی که Close میشه این اتصال قطع میشه و اون موقع است که Garbage میاد از Heap پاک میکنه اما در Stack همچنان هست.
بنظر این استدلال من غلطه؟

در پناه حق موفق باشید و پرتوان

asilverisis
شنبه 26 شهریور 1384, 21:57 عصر
سلام
خوب وقتی شما برای بار دوم می خوای فرم رو Show کنی به یک فضا توی Heap نیاز داری چون به قول خودت فضای Heap اولیه پاک شده
که این فضا توسط New به برنامه داده می شه

موفق باشید

Hamedm
شنبه 26 شهریور 1384, 22:04 عصر
سلام
خوب وقتی شما برای بار دوم می خوای فرم رو Show کنی به یک فضا توی Heap نیاز داری چون به قول خودت فضای Heap اولیه پاک شده
که این فضا توسط New به برنامه داده می شه

موفق باشید
سلام

نه عزیز جان.

همون طور که گفتم زمانی که ما Show میکنیم یک فضای جدید در Heap ایجاد میشه. یعنی قبل از این عمل مهم نیست که در Heap وجود داشته یا نه(پاک شده یا نه). حتی اگه وجود داشته باشه و Garbage اونو پاک نکرده باشه، یک فضای دیگه احتصاص داده میشه نه اون فضای قبلی.

در پناه حق موفق باشید و پرتوان

asilverisis
یک شنبه 27 شهریور 1384, 09:29 صبح
سلام
آقا حامد بعید بدونم چیزی که شما میگی درست باشه
Show فقط یک متد از کلاس فرم که فرم رو نمایش می ده
یعنی بعد از New کردن فرم شما وجود داره و بعد از Show کردن هم فرم همونه که بوده فقط دیده می شه

مثل متد Hide این متد هم هیچ تغییری در وضعیت نمی ده فقط فرم از حالت نمایش خارج میشه

شما فرم رو یک بار Hide و بعد از اون Show کنید متوجه عملکرد Show می شوید