PDA

View Full Version : مشکل در بستن فرم فرزند



touraj
شنبه 10 فروردین 1387, 14:00 عصر
ببخشید. شاید سوال احمقانه باشه. من یه فرم اصلی دارم به نام frmMain. یک فرم دیگه هم وجود داره به نام Form1 که فرزند فرم اصلیه و من با کد زیر داخل frmMain اون رو show میکنم:


Dim Child As New Form1
Child.MdiParent=Me
Child.Show


تا اینجا مشکلی نیست. حالا یه فرم دیگه دارم به نام Form2 که شرایط اون مثل Form1 هستش و با همون متد به صورت فرم فرزند فرم اصلی در میاد.
مشکل اینجاست که من نمیدونم که چه جوری باید از داخل Form2، Form1 رو close کنم.
فرض کنید میخوام وقتی Form1 لود میشه، Form2 بسته بشه. توی رویداد Form_Load در Form1 از دستور Form2.Close استفاده کردم اما نشد. Dipose هم جواب نداد.
جستجو کردم، به نتیجه نرسیدم. اگه کمک کنین ممنون میشم.

VBExpress
شنبه 10 فروردین 1387, 14:40 عصر
مشکل اینجا هست که اول فرم 1 رو لود میکنی و بعد دستورات From_load فرم اول (بستن فرم 2) اجرا میشه و بعد از اون فرم 2 لود میشه ...
اول فرم 2 رو ظاهر کن ...

touraj
شنبه 10 فروردین 1387, 15:28 عصر
مشکل اینجا هست که اول فرم 1 رو لود میکنی و بعد دستورات From_load فرم اول (بستن فرم 2) اجرا میشه و بعد از اون فرم 2 لود میشه ...
اول فرم 2 رو ظاهر کن ...

نه. مشکل این نیست. ببین، Form2 الان لود شده و بصورت فرم فرزند در frmMain (فرم اصلی) وجود داره. حالا فرض کن یه Button توی frmMain وجود داره که وقتی اون رو کلیک میکنیم، باید Form1 ظاهر بشه.
مسئله اینه که Form1 ظاهر میشه. اما در Form_load فرم Form1 باید Form2 بسته بشه. اما این اتفاق نمیفته.
بطور کلی چه جوری از داخل یک فرم فرزند، فرم فرزند دیگه ای رو میشه بست؟

Dariuosh
شنبه 10 فروردین 1387, 15:52 عصر
وقتی یه فرم رو New میکنی همه Propertyهاش خالیه ، پس اول باید یه اسمی بهش بدی
بعدشم برا اسمش سعی کن که از یه مقدار ثابت استفاده نکنی مثلاً با یه Counter خودت بهشون شماره بده که قابل دسترسی باشن

ForEach a As System.Windows.Forms.Form InMy.Forms.frmMain.MdiChildren
MsgBox(a.Name)
a.Close()
Next

با یه همچین چیزی هم میتونی پیداش کنی
دیگه فک نکنم مشکلی باشه

touraj
شنبه 10 فروردین 1387, 19:59 عصر
وقتی یه فرم رو New میکنی همه Propertyهاش خالیه ، پس اول باید یه اسمی بهش بدی
بعدشم برا اسمش سعی کن که از یه مقدار ثابت استفاده نکنی مثلاً با یه Counter خودت بهشون شماره بده که قابل دسترسی باشن

ForEach a As System.Windows.Forms.Form InMy.Forms.frmMain.MdiChildren
MsgBox(a.Name)
a.Close()
Next

با یه همچین چیزی هم میتونی پیداش کنی
دیگه فک نکنم مشکلی باشه

ممنونم. اینی که شما نوشتی در واقع اسم تمام فرمهای فرزند رو در یک msgbox نشون میده. یک فرم خاص رو چه جوری میشه پیدا کرد؟ میشه یه مثال بزنی؟

VBExpress
شنبه 10 فروردین 1387, 20:37 عصر
نه. مشکل این نیست. ببین، Form2 الان لود شده و بصورت فرم فرزند در frmMain (فرم اصلی) وجود داره. حالا فرض کن یه Button توی frmMain وجود داره که وقتی اون رو کلیک میکنیم، باید Form1 ظاهر بشه.
مسئله اینه که Form1 ظاهر میشه. اما در Form_load فرم Form1 باید Form2 بسته بشه. اما این اتفاق نمیفته.
بطور کلی چه جوری از داخل یک فرم فرزند، فرم فرزند دیگه ای رو میشه بست؟

ببین من 3 تا فرم درست کردم frmMain , Form1 , Form2
تو فرم اصلی یک باتن گذاشتم و ای کدها رو هم نوشتم و کار کزد ...



Public Class frmMain
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Form1.MdiParent = Me
Form1.Show()
End Sub
Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Form2.MdiParent = Me
Form2.Show()
End Sub
End Class





Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Form2.Close()
End Sub
End Class

VBExpress
شنبه 10 فروردین 1387, 20:44 عصر
یک فرم خاص رو چه جوری میشه پیدا کرد؟ میشه یه مثال بزنی؟


با یک دستور شرطی داخل حلقه ای که آقا داریوش نوشتن میتونید اون فرم خاص رو پیدا کنید ...

VBExpress
شنبه 10 فروردین 1387, 20:55 عصر
آقای touraj خیلی عذر میخوام ... الان که به پست اولتان نگاه کردم متوجه شدم شما فرم های فرزند را موقع Runtime میسازی ... و مشکل اینجا هست که شما متغییر مربوط به فرم فرزند رو داخل پراسیجر مینویسی و میدان دید اون هم به داخل پراسیجر محدود میشه ...

VBExpress
شنبه 10 فروردین 1387, 21:21 عصر
آقای touraj خیلی خیلی شرمنده ... الان که بیشتر به پست اولتان توجه کردم متوجه شدم که شما می خواهید Instant های جدیدی که از فرم1 میسازید و داخل پراسیجر هم معرفیشان میکنید رو ببندید ...

برای این کار باید به فرمی که ساخته میشه نام بدید ...



Dim Child As new Form2
Child.Name = "AsgharJuje"


البته اگه می خواید تعداد بیشتری Instant از این فرم بسازید به اسم ، شماره هم اضافه کنید تا قاطی پاتی نشه ارور بده ... مثلا



Static A as integer
A+=1
Child.Name = "AsgharJuje" & A


حالا برای پیدا کردن این فرم ... هم میتونید از کدی که آقا داریوش نوشتن استفاده کنید هم از این کد :


For i AsInteger = 0ToMy.Application.OpenForms.Count - 1
IfMy.Application.OpenForms(i).Name = "AsgharJuje"Then
MsgBox("Closing AsgharJuje")
My.Application.OpenForms(i).Close()
EndIf
Next

touraj
پنج شنبه 15 فروردین 1387, 12:53 عصر
از هر دوی شما خصوصاً VBExpress ممنونم.