PDA

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



programmermp
پنج شنبه 04 مرداد 1386, 17:38 عصر
با سلام و خسته نباشید خدمت همه دوستان

من یک فرم پدر دارم که خاصیت IsMdiContainer مربوط به اون را برابر true کردم و بعد توسط

دستورات زیر فرم فرزند رو ایجاد می کنم




Dim ChildForm AsNew frmChild()
ChildForm.MdiParent = Me
m_ChildFormNumber += 1
ChildForm.Text = "Window " & m_ChildFormNumber
ChildForm.Show()



همه چیز به ظاهر درسته اما فقط فرم اول هست که پس از ایجاد active یا به عبارتی focus

هست یعنی می تونم به طور مثال یک فایل تصویری رو از خارج برنامه به روی اون drag&drop

کنم ولی وقتی این فرم رو می بندم و دوباره new می کنم یعنی دکمه ای که حاوی کدهای

با لا هست رو برای ایجاد فرم جدید می فشارم فرم جدیدی که ظاهر می شه این خاصیت رو

نداره . یا وقتی فرم اولیه باز هست و فرم دوم رو به عنوان فرزند دوم باز می کنم باز کنترل روی

فرزند اولی هست یعنی عمل drag & drop تاثیرش رو فرم (فرزند) اولیه هست عکس بجای

فرزند دومی در اولی نمایش داده می شه چطوری می شه این مشکل رو حل کرد ؟

با تشکر فراوان

saeed_rezaei
پنج شنبه 04 مرداد 1386, 20:57 عصر
1- می شه کمی بیشتر در مورد درگ و دراپ توضیح بدی.
2- آیا ازکلاس توی فرمهات استفاده کردی که توی عملیات بهت کمک کنه.

shamsoft
جمعه 05 مرداد 1386, 09:37 صبح
از این کد استفاده کن:



FrmName.MdiParent = Me
FrmName.Show()

programmermp
جمعه 05 مرداد 1386, 11:30 صبح
با سلام و تشکر از شما

از کلاس استفاده نکردم چندتا تابع هست که فراخوانی می شه به هنگام باز شدن فرم دوم
در مورد درگ اند دراپ هم از همون توابع استفاده کردم برای انتقال یک فایل

تصویری به درون برنامه یعنی عمل درگ اند دراپ توسط کاربر برای باز کردن یک

فایل تصویری در برنامه صورت می گیره برنامه یک ویرایشگر تصویر هست


(فرم فرزند)

اقای shamsoft من از اون کد استفاده کردم ولی بازهم جواب نمی ده

اصلا یه سئوال دیگه کدی که من نوشتم ایا هر سری که اجرا می شه یک فرم جدید ایجاد (کد زیر)


Dim ChildForm AsNew frmChild()ChildForm.MdiParent = Me
m_ChildFormNumber += 1
ChildForm.Text = "Window " & m_ChildFormNumber
ChildForm.Show()


می کنه یا اینکه همون فرم ایجاد شده رو نشون می ده چون فرم دوم در محیط design ایجاد

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

اجرا باید اون فرم رو ایجاد کنیم و بعد نمایش دهیم

من بکل گیج شدم

سئوال بعد اینکه من با کدی مشابه کد زیر یک فرم در زمان اجرا ایجاد می کنم حالا اگه

بخواهم وقتی فرم ایجاد شده داره بار گذاری می شه ( همون رویداد load رو می گم) کد

خاصی ایجاد بشه باید چی کار کنم؟


dim newform as new system.windows.forms.form
newform.show

با تشکر از شما

asilverisis
شنبه 06 مرداد 1386, 00:47 صبح
سلام
کد شما که به نظر درست میاد و نباید مشکلی داشته باشه ولی در مورد سوال دومتون اگر می خواهید در زمان اجرا برای form_load کد بنویسید از این کد استفاده کنید.




Private Sub ShowToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowToolStripMenuItem.Click

Dim f As New Windows.Forms.Form

AddHandler f.Load, AddressOf My_Load

f.MdiParent = Me
cn += 1
f.Text = "Window " & cn
f.Show()

End Sub

Private Sub My_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
'My Code for Load Event

MsgBox(sender.Text())
End Sub

programmermp
شنبه 06 مرداد 1386, 17:07 عصر
سلام ممنون

امتحان می کنم مشکل داشتم دوباره مزاحم می شم

فعلا

programmermp
شنبه 06 مرداد 1386, 18:08 عصر
مجدد سلام

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

کد زیر که مربوط به پیکچر باکس در فرم فرزند هست اجرا نمی شه چرا ؟ حتی

رو خود فرم فرزند هم جواب نمی ده این ایونت درگ دارپ کی رخ می ده؟




PrivateSub PictureBox1_DragDrop(ByVal sender AsObject, ByVal e As System.Windows.Forms.DragEventArgs) Handles PictureBox1.DragDrop
MsgBox("asdasd")
EndSub



با تشکر

programmermp
یک شنبه 07 مرداد 1386, 18:48 عصر
کد زیر فقط برای نمایش دادن فرم هست یعنی فقط مرتبا فرم رو show می کنه نه ایجاد




Dim ChildForm AsNew frmChild()ChildForm.MdiParent = Me
m_ChildFormNumber += 1
ChildForm.Text = "Window " & m_ChildFormNumber
ChildForm.Show()



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

اجرا بسازم اونوقت نمی دونم چطور باید توابعی رو در اون قرار بدم که وقتی کاری در اون فرم

مثل عمل درگ دراپ صورت گرفت اون توابع اجرا بشن برای روشن تر شدن قضیه شما فرض

کنید یک فرمی در حالت طراحی تو محیط وی بی دات نت ایجاد کردید و در قسمت کد توابعی

نوشتید و در صورت رخ دادن ایونت خاصی در فرم اون توابع فراخوانی و ایجاد می شن حالا

اگر بخواهیم این فرم رو در زمان اجرا بسازیم بعنوان فرم فرزند باید چطوری من این توابع رو

تو قسمت کدش قرار بدهم جوری که وقتی ایونت خاصی رخ داد (مثل درگ دراپ یا هر ایونت

دیگری) اون تابع اجرا و فراخوانی بشه دقیقا مانند یک فرمی که در محیط وی بی ساخته شده؟

لطفا من رو راهنمایی کنید

با تشکر فراوان

asilverisis
یک شنبه 07 مرداد 1386, 23:07 عصر
سلام
شما اگر می خواهید برای objectی که در زمان اجرا ایجاد می کنید کد بنویسید ، فقط باید از همون Addhandler استفاده کنید ، نحوه استفادش رو هم که توضیح دادم ولی نیازی به این کار نیست.

اگر مشکلتون حل نشده یه نمونه کوچیک از کدتون بذارین شاید بتونیم مشکلش رو حل کنیم.
موفق باشید.

saeed_rezaei
یک شنبه 07 مرداد 1386, 23:18 عصر
من بلاخره متوجه نشدم، کدهای مربوط به درگ و دراپ رو شما توی فرم اولیه ساختین و بعد فرمهای دیگه رو به ارث می برید و یا در زمان طراحی فرم این eventهای مربوطه رو می نویسید؟

به هر حال اینجا یه نمونه برنامه هست، که برای رخداد click فرمها در زمان اجرا کد نویسی شده.

programmermp
دوشنبه 08 مرداد 1386, 20:15 عصر
سلام

من شرمنده ام که اینقدر شما رو اذیت کردم ببخشید

با تشکر از دوستانی که تا به الان به من جواب دادن

ببینید اصلا من می خواهم برای فرمی که در زمان اجرا می سازم دو تا تابع زیر رو داخل



PublicSub New1()
' Enable drag-and-drop operations.
Me.AllowDrop = True
EndSub
ProtectedOverridesSub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
' If there is an image and it has a location,
' paint it when the Form is repainted.
IfNot (Me.picture IsNothing) And _
Not (Me.pictureLocation.Equals(Point.Empty)) Then
e.Graphics.DrawImage(Me.picture, Me.pictureLocation)
EndIf
EndSub

قسمت کدش قرار بدهم نه توی ایونت خاصی از اون فرم مثل ایونت load فقط می خواهم

تو قسمت کدش قرار بگیره چون این کدها لازم نیست توی رویداد خاصی از فرم باشه باید

فقط توی قسمت کد فرم قرار بگیره همین حالا باید چی کار کنم؟ با اون دستوری که دوستمون گفته بود فکر کنم فقط بشه ایونت ها رو add کرد

لطفا من رو راهنمایی کنید

با تشکر فراوان

asilverisis
سه شنبه 09 مرداد 1386, 01:16 صبح
سلام
خب حالا فهمیدم منظور شما چیه.
شما برای این کار باید یه کلاس بنویسید که از کلاس Form ، ارث بری داشته باشه( inherits)
و این کدها رو توی اون کلاس قرار بدید.
حالا برای ایجاد فرم در زمان اجرا باید یک object از همین کلاسی که ساختین ایجاد کنین.
یعنی به جای


Dim f As New Windows.Forms.Form

از این :


Dim f as new MyForm

استفاده کنید.

موفق و موید.

programmermp
سه شنبه 09 مرداد 1386, 10:34 صبح
سلام

فکر کنم منظور شما از ارث بردن کلاس من از کلاس فرم این کد زیر باشه درسته

یعنی کد زیر رو در کلاس بنویسم




Inherits WindowsApplication1.Form1



اگه منظورت کد بالا هست اگه من این کد رو تو کلاسم بنویسم که در جا توی محیط design

یک فرم جدید ایجاد می شه و اونوقت کدی که شما گفتی فقط مرتبا همین فرم رو show

می کنه و ایجاد نمی کنه من می خواهم فرم در حالت design ساخته بشه

اگه اشتباه می کنم کمی بیشتر توضیح دهید

با تشکر فراوان

programmermp
چهارشنبه 10 مرداد 1386, 10:03 صبح
سلام

چی شد کسی نمی خواهد یه راهنمایی بکنه ؟؟؟

حامد مصافی
چهارشنبه 10 مرداد 1386, 13:18 عصر
همه چیز به ظاهر درسته اما فقط فرم اول هست که پس از ایجاد active یا به عبارتی focus

هست یعنی می تونم به طور مثال یک فایل تصویری رو از خارج برنامه به روی اون drag&drop

کنم ولی وقتی این فرم رو می بندم و دوباره new می کنم یعنی دکمه ای که حاوی کدهای

با لا هست رو برای ایجاد فرم جدید می فشارم فرم جدیدی که ظاهر می شه این خاصیت رو

نداره . یا وقتی فرم اولیه باز هست و فرم دوم رو به عنوان فرزند دوم باز می کنم باز کنترل روی

فرزند اولی هست یعنی عمل drag & drop تاثیرش رو فرم (فرزند) اولیه هست عکس بجای

فرزند دومی در اولی نمایش داده می شه چطوری می شه این مشکل رو حل کرد ؟
چنین مشکلی من ندیدم!
به احتمال قوی مرتکب اشتباه دیگه ای شدید.
کدی که نوشتید برای کارکرد صحیح روال مورد نظر شما کفایت می کنه.


اصلا یه سئوال دیگه کدی که من نوشتم ایا هر سری که اجرا می شه یک فرم جدید ایجاد (کد زیر) ... می کنه یا اینکه همون فرم ایجاد شده رو نشون می ده ...
در هر بار اجرا یک نمونه جدید ایجاد می شود.



سئوال بعد اینکه من با کدی مشابه کد زیر یک فرم در زمان اجرا ایجاد می کنم حالا اگه

بخواهم وقتی فرم ایجاد شده داره بار گذاری می شه ( همون رویداد load رو می گم) کد

خاصی ایجاد بشه باید چی کار کنم؟
با استفاده از addhandler یک روتین رو به رویداد Load فرم جدید الحاق کنید.
کاری که asilverisis (http://barnamenevis.org/forum/member.php?u=10463) انجام داده.



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

اجرا بسازم اونوقت نمی دونم چطور باید توابعی رو در اون قرار بدم که وقتی کاری در اون فرم

مثل عمل درگ دراپ صورت گرفت اون توابع اجرا بشن برای روشن تر شدن قضیه شما فرض

کنید یک فرمی در حالت طراحی تو محیط وی بی دات نت ایجاد کردید و در قسمت کد توابعی

نوشتید و در صورت رخ دادن ایونت خاصی در فرم اون توابع فراخوانی و ایجاد می شن حالا

اگر بخواهیم این فرم رو در زمان اجرا بسازیم بعنوان فرم فرزند باید چطوری من این توابع رو

تو قسمت کدش قرار بدهم جوری که وقتی ایونت خاصی رخ داد (مثل درگ دراپ یا هر ایونت

دیگری) اون تابع اجرا و فراخوانی بشه دقیقا مانند یک فرمی که در محیط وی بی ساخته شده؟

لطفا من رو راهنمایی کنی

من شرمنده ام که اینقدر شما رو اذیت کردم ببخشید

با تشکر از دوستانی که تا به الان به من جواب دادن

ببینید اصلا من می خواهم برای فرمی که در زمان اجرا می سازم دو تا تابع زیر رو داخل
یک فرم جدید در محیط توسعه ایجاد کنید و کد های مورد نظر رو در روتین های وربوطه بنویسید.
اگر نام این فرم Form2 باشد، کد های زیر یک نمونه جدید از آن را نمایش خواهد داد:

Dim ChildForm As New Form2()
ChildForm.MdiParent = Me
m_ChildFormNumber += 1
ChildForm.Text = "Window " & m_ChildFormNumber
ChildForm.Show()




شما برای این کار باید یه کلاس بنویسید که از کلاس Form ، ارث بری داشته باشه( inherits)
هر فرمی که در محیط توسعه ایجاد می شود به طور خودکار از کلاس form مشتق می شود.


@ programmermp (http://barnamenevis.org/forum/member.php?u=10091) :
دوست عزیزم در مجموع باید اعلام کنم بنده به طور کامل متوجه نشدم مشکل شما چیست.
در مورد پست اول شما با توجه به اطلاعاتی که دادید من مشکلی نمی بینم. مگر اینکه قسمت دیگه ای از کار شما ایراد داشته باشه.

programmermp
چهارشنبه 10 مرداد 1386, 13:45 عصر
سلام حامدجان

خیلی ممنون که وقت گذاشتی و جواب دادی

ببین من گفته بودم تو پست قبلیم که من نمی خواهم فرم رو تو محیط design ایجاد کنم

شما برنامه فتوشاپ رو در نظر بگیر هر بار که یک عکس رو باز می کنی توی یک پنجره جدید

باز می شه و یا اگر عکس رو به محیط فتوشاپ drag کنی توی یک پنجره جدید باز می شه

من هم می خواهم یه همچین کاری بکنم برای نمایش عکس به هنگام drag&drop کدهاش

توی خود وی بی دات نت در msdn هست (برای دوستانی که مایلند کدهاشو داشته باشند

گفتم) یکی از کدهای مورد استفاده کد زیر هست که نمی دونم دقیقا چطور فراخوانی می

شه به هنگام رخ دادن عمل drag&drop


Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)

' If there is an image and it has a location,
' paint it when the Form is repainted.
If Not (Me.picture Is Nothing) And _
Not (Me.pictureLocation.Equals(Point.Empty)) Then
e.Graphics.DrawImage(Me.picture, Me.pictureLocation)
End If
End Sub

حالا سئوال من اینه که ایا با توجه به اینکه قرار به ازای هر عکس یک صفحه باز بشه این کار

رو می شه با رو شی که شما گفتید یعنی کد زیر :


Dim ChildForm As New Form2()
ChildForm.MdiParent = Me
m_ChildFormNumber += 1
ChildForm.Text = "Window " & m_ChildFormNumber
ChildForm.Show()


انجام داد یا نه ؟

و سئوال اخر هم این که من هیچ فرمی در محیط design ایجاد نمی کنم و می خواهم فرم

در زمان اجرا ساخته بشه حال اگر کدهای مربوطه درون event خاصی از فرم باشه (مثل load

) که هیچ مشکلی نیست می شه با addhandler این کار رو انجام داد ولی اگر یک تابعی

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

چگونه می توانم در قسمت کد فرم اضافه کنم ؟(مثلا کدهای زیر چطوری باید در قسمت کد

قرار داده شوند)



Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)

' If there is an image and it has a location,
' paint it when the Form is repainted.
If Not (Me.picture Is Nothing) And _
Not (Me.pictureLocation.Equals(Point.Empty)) Then
e.Graphics.DrawImage(Me.picture, Me.pictureLocation)
End If
End Sub

با تشکر فراوان

حامد مصافی
چهارشنبه 10 مرداد 1386, 15:30 عصر
خب در این حالت باید رویداد DragDrop رو برای فرم مادر (MDI Container) کد نویسی کنی نه برای فرزندان.

Alireza_Salehi
چهارشنبه 10 مرداد 1386, 21:21 عصر
سلام
به نظرم دوستان جواب رو داده اند ، ولی با این حال این مثال رو ببین اگر باز هم حل نشد توضیح میدم.

programmermp
پنج شنبه 11 مرداد 1386, 22:56 عصر
با تشکر از همه دوستان به خاطر پاسخگویی خوبشون

سئوال جدید من اینه که من چطوری باید بفهمم که در فرم مادر فرم فرزند باز هست یا نه

یعنی من یکی از گزینه های منوی فرم مادر فقط زمانی باید فعال باشه که فرم فرزند باز باشه

اگه بسته باشه باید غیر فعال بشه

حالا چطور می شه فهمید که فرم فرزند باز هست یا نه ؟ این در حالیکه نمی شه از متغیر

خاصی واسه این کار استفاده کرد یعنی با مقدار دهی متغیر خاصی فهمید که فرم فرزند باز

هست یا نه چون ممکنه چندین فرم فرزند باز باشند و من یکی از انها رو ببندم

لطفا من رو راهنمایی کنید

با تشکر

Business Analyst
جمعه 12 مرداد 1386, 02:00 صبح
اون گزینه منوی فرم مادر رو چک کن اگه توش گزینه ای داشت(اگه داشته باشه یعنی چایلدش بازه اگه نباشه یعنی بستس) اگه داشت که هیچ اگه نداشت غیر فعالش کن

programmermp
جمعه 12 مرداد 1386, 10:15 صبح
اون گزینه منوی فرم مادر رو چک کن اگه توش گزینه ای داشت(اگه داشته باشه یعنی چایلدش بازه اگه نباشه یعنی بستس) اگه داشت که هیچ اگه نداشت غیر فعالش کن

business جان شرمنده

من اصلا هیچی نفهمیدم از منظورت

ببین دوباره توضیح می دهم من یکی از گزینه های موجود در منوهام می خواهم زمانی

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

چطور باید تشخیص بدهم وجود فرم فرزند یا عدم وجود اون را؟

سئولا دیگر اینکه من در فرم مادر یک از منوهام چند تا گزینه داره که می خواهم

روی گزینه هاش از کلید میانبر یا sortcut key استفاده کنم مثلا مال یه کدومشون

c باشه و یکی دیگه b باشه یعنی وقتی کلید c رو کاربر زد ان گزینه از منو که

این میانبر را دارد کدهاش اجرا بشه اینگار که خود اون گزینه انتخاب شده ولی

وقتی از منوی properties کلید میانبر اون گزینه رو حرف c انتخاب می کنم

می گه نمی تونه یک حرف مثل c کلید میانبر باشه چرا ؟


با تشکر

asilverisis
شنبه 13 مرداد 1386, 01:25 صبح
سلام
امیدوارم نمونه زیر به دردتون بخوره
البته ناگفته نماند که برنامه زیر تصحیح شده برنامه جناب arsp_2004
(http://barnamenevis.org/forum/member.php?u=33355)هست
متغیر ChildformCount شمارنده تعداد فرمهای فرزند که موقع نمایش یکی اضافه و موقع بستن یکی کم میشه.
کد هر دو فرم رو ببینید.
موفق و موید.

حامد مصافی
شنبه 13 مرداد 1386, 07:08 صبح
یک آیتم به منوی فرم MDI Parent اضافه کن. البته به صورت غیر فعال.
سپس همون گزینه رو به صورت فعال به فرم فرزند اضافه کن. خصوصیت MergeAction رو برابر Replace قرار بده.
در این حالت هر وقت یک فرم فرزند نمایش داده بشه گزینه منوی فرم فرزند جایگزین گزینه منوی فرم مادر میشه.
توجه داشته باش که در هر دو فرم خصوصیت MainManu مربوط به فرم به منوی های روی فرم اشاره کنه.

saeed_rezaei
شنبه 13 مرداد 1386, 21:48 عصر
با تشکر از همه دوستان به خاطر پاسخگویی خوبشون

سئوال جدید من اینه که من چطوری باید بفهمم که در فرم مادر فرم فرزند باز هست یا نه

یعنی من یکی از گزینه های منوی فرم مادر فقط زمانی باید فعال باشه که فرم فرزند باز باشه

اگه بسته باشه باید غیر فعال بشه

حالا چطور می شه فهمید که فرم فرزند باز هست یا نه ؟ این در حالیکه نمی شه از متغیر

خاصی واسه این کار استفاده کرد یعنی با مقدار دهی متغیر خاصی فهمید که فرم فرزند باز

هست یا نه چون ممکنه چندین فرم فرزند باز باشند و من یکی از انها رو ببندم

لطفا من رو راهنمایی کنید

با تشکر

سلام دوست من.
شما می تونید، یه لیست از فرمهای فرزندت که هم اکنون open هستند بگیرید.



Dim formlist() As Form
formlist = Me.MdiChildren
Dim i AsInteger
For i = 0 To formlist.Length - 1
MsgBox(formlist(i).Text)
Next


در فریم ورک 1 شما می تونستید به نام فرمها نیز دسترسی داشته باشید یعنی با دستور



MsgBox(formlist(i).Name )


اسامی فرمها رو نمایش می ده اما در ورژن 2 متاسفانه یا خوشبختانه، یه متن خالی رو نمایش می ده.

programmermp
یک شنبه 14 مرداد 1386, 09:35 صبح
با تشکر از همه دوستان

ولی هیچیک از شما به سئوال دیگر من پاسخی ندادید

چرا نمی شه کلید میانبر یک گزینه از منو رو یک حرف مثل c گذاشت

برای این کار باید چه کرد؟

اگر امکان پذیر نیست فکر کنم تنها راه همون استفاده از ایونت keydown فرم باشه

با تشکر