PDA

View Full Version : سوال: MDI Parent



vahid_erad
یک شنبه 18 بهمن 1388, 13:06 عصر
سلام
من فرمي به عنوان Parent ايجاد كرده ام و وسط فرم MessageBox بزرگي گذاشته ام
وقتي فرم Child رو باز ميكنم فرم Child باز شده در فرم Parent ميره زيره MessageBox .
علت چيه ؟
چيكار كنم تا فرم باز شده بالاي همه كامپوننت هاي ايجاد شده در فرم Parent قرار بگيره؟؟

iranrose63
یک شنبه 18 بهمن 1388, 13:21 عصر
اول باید System.Runtime.InteropServices را به using اضافه کن

در قسمت کدت



[DllImport("user32")]
public static extern int SetParent(int hWndChild,int hWndNewParent);


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



childform.TopMost=true;
SetParent((int)childform.Handle,(int)parentform.Ha ndle);

vahid_erad
یک شنبه 18 بهمن 1388, 13:26 عصر
[DllImport("user32")]
public static extern int SetParent(int hWndChild,int hWndNewParent);
كد بالا را بايد چطوري وارد كنم . من هر جاي كد واردشم ميكنم خطا ميده

ممنون از راهنماييتون
ولي راه بهتري نيست؟؟

iranrose63
یک شنبه 18 بهمن 1388, 13:36 عصر
کد بالا را باید چطوری وارد کنم . من هر جای کد واردشم میکنم خطا میده

همون اول برنامه قبل از سازنده فرم پدر

saba106
یک شنبه 18 بهمن 1388, 13:46 عصر
سلام میشه راجع به MDI Parent توضیح بدین؟
مرسی

FastCode
یک شنبه 18 بهمن 1388, 14:51 عصر
سلام میشه راجع به MDI Parent توضیح بدین؟
مرسی
mdi یا multi document interface به برنامه های چند سندی گفته میشه که همزمان با چند فرم سر و کار دارند و برای شلوغ نشدن taskbar و جلوگیری از خطای انسانی در حالت multiinstance استفاده میشوند.(مثل ویژوال استودیو)
Link (http://en.wikipedia.org/wiki/Multiple_document_interface)
mdiparent یعنی فرم صاحب فرم چه فرمی هست.

vahid_erad
یک شنبه 18 بهمن 1388, 14:54 عصر
دوست عزيز روش شما كارساز نبود
هنوز هم فرم باز شده (فرزند) زير كامپوننت ها قرار ميگيره
كسي روش ديگه اي بلد نيست؟؟

طبیب دل
یک شنبه 18 بهمن 1388, 17:25 عصر
دوست عزیز روش شما کارساز نبود
هنوز هم فرم باز شده (فرزند) زیر کامپوننت ها قرار میگیره
کسی روش دیگه ای بلد نیست؟؟
من هم همچین مشکلی داشتم هر کار کردم درست نشد و بالا خره از حالت والد و فرزند خارج کردم اگه تو هم مجبور نیستی فرم والد و فرزند داشته باشی این کار رو بکن

vahid_erad
یک شنبه 18 بهمن 1388, 19:21 عصر
كسي نيست كمكم كنه؟؟؟؟

iranrose63
دوشنبه 19 بهمن 1388, 08:04 صبح
دوست عزیز روش شما کارساز نبود
من مدتهاست از این روش استفاده می کنم یه بار دیگه تست کن



using System.Runtime.InteropServices

namespace yournamespace
{
public partial yourparentform:Form
{
[DllImport("user32")]
public static extern int SetParent(int hWndChild,int hWndNewParent);
....
....
public showform()
{
Yourchildform childform =new yourchildform();
childform.TopMost=true;
childform.show();
SetParent((int)childform.Handle,(int)parentform.Ha ndle);
}

احتمال ميدم كه تكه كد زير را هم نوشته باشي ولي نيازي به اين نيست
childform.MDIParent=parentorm;

اَرژنگ
دوشنبه 19 بهمن 1388, 16:12 عصر
من مدتهاست از این روش استفاده می کنم یه بار دیگه تست کن



using System.Runtime.InteropServices

namespace yournamespace
{
public partial yourparentform:Form
{
[DllImport("user32")]
public static extern int SetParent(int hWndChild,int hWndNewParent);
....
....
public showform()
{
Yourchildform childform =new yourchildform();
childform.TopMost=true;
childform.show();
SetParent((int)childform.Handle,(int)parentform.Ha ndle);
}

احتمال میدم که تکه کد زیر را هم نوشته باشی ولی نیازی به این نیست
childform.MDIParent=parentorm;

این روش از کجا توصیه میشه ؟ برایه اینکه یک فرم بالاتر از همه فرمها باشد مگر Form.TopMost Property کافی نیست؟

iranrose63
سه شنبه 20 بهمن 1388, 08:07 صبح
برایه اینکه یک فرم بالاتر از همه فرمها باشد مگر Form.TopMost Property کافی نیست؟
نه وقتي كه قراره فرم فرزند روي كنترلهاي فرم پدر قرار بگيره


این روش از کجا توصیه میشه ؟
از هيچ جا فقط يه روشه براي حل مشكل من كه اينحا هم نوشتم
اگه راه بهتري هست خوشحال ميشم بفرماييد


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

vahid_erad
چي شد مشكلت رو حل كرد يا نه

اَرژنگ
سه شنبه 20 بهمن 1388, 10:33 صبح
نه وقتی که قراره فرم فرزند روی کنترلهای فرم پدر قرار بگیره


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


با سلام و درود بر شما که پیگیری کردید:
من منظور از " وقتی که قراره فرم فرزند روی کنترلهای فرم پدر قرار بگیره" را درک نمیکنم،
وقتی که میگید رویه ، از لحاظ سطحی میگید؟
به شکل دفالت فرم فرزند بر رویه فرم قبلی قرار میگیره (فرم قبلی میزه زیره فرم جدید)

private void button1_Click(object sender, EventArgs e)
{
Form2 frm = new Form2();
frm.Show();
}
شاید اگر عکسی از اینکه منظور از "بررویه" چی هست بگید به درک من در مورد این مسئله کمک کند.

iranrose63
سه شنبه 20 بهمن 1388, 11:49 صبح
دوست عزيز يه parentform ايجاد كن و يه TextBox بذار رو اون حالا يه فرم فرزند رو Showكن فرم فرزند زير كنترل textBox قرار مي گيره

sjhosseini
چهارشنبه 21 بهمن 1388, 00:24 صبح
اول باید System.Runtime.InteropServices را به using اضافه کن

در قسمت کدت



[DllImport("user32")]
public static extern int SetParent(int hWndChild,int hWndNewParent);


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



childform.TopMost=true;
SetParent((int)childform.Handle,(int)parentform.Ha ndle);



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

foreach (Form frm in this.MdiChildren)
if (frm.Name == "...")

iranrose63
چهارشنبه 21 بهمن 1388, 07:51 صبح
از کد شما استفاده کردم و کاملا درست جواب داد. فقط یه مشکلی هست اونم اینکه من قبلا برای اینکه کاربر نتونه از یه فرم چندتا باز کنه از کد زیر استفاده می کردم اما الان این کد دیگه جواب نمی ده . راه حل شما چیه؟



foreach (Form frm in Application.OpenForms)
if (frm.Name == "...")

mf_007
سه شنبه 27 بهمن 1388, 18:23 عصر
foreach (Form frm in Application.OpenForms)
if (frm.Name == "...")


من مي خام كاربر نتونه از يه فرم چندتا باز كنه ولي نمي دونم چطوري كد بالا رو نمي دونم چطوري استفاده كنم تو كدوم قسمت بزارم
برنامه من تو قسمت فرم والد يه منو داره كه فرم هاي ديگه رو با اون باز مي كنه

يه سوال ديگه دارم و اينكه مثلا كاربر يه فرم child رو باز مي كنه بعد اگه كاربر يه فرم ديگه child رو باز كرد فرم قبلي بسته بشه چيكار بايد كنم؟
و اگه نخوام از فرم والد و فرزند استفاده كنم فرم ها همديگه رو نمي شناسن يعني از توي يه فرم نمي تونم به فرم ديگه دسترسي داشته باشم
و وقتي به فرم 2 مي رم و فرم يك رو hide مي كنم ديگه به فرم يك دسترسي ندارم و فرم يك رو show هم مي كنم نشون نمي ده

اين جور برنامه ها كه چند فرميه مثل نرم افزار آژانس بهتره ار فرم هاي والد و فرزند استفاده كنيم يا فرم هاي معمولي
البته ببخشيد كه سوالاتم ابتداييه من تازه كارم.
تو دلفي كه كار مي كردم مشكلات فرم رو نداشتم

maryam_59m
چهارشنبه 28 بهمن 1388, 09:38 صبح
من هم همين مشكل رو داشتم و اينجوري براي خودم حل اش كردم:
وقتي فرم فرزند نمايش داده ميشه تمام اجزايي كه روي فرم والد هست رو hide كردم و وقتي كه فرم فرزند رو مي بندم اون اجزا از حالت hide بيرون ميان. اين دو حالت رو توي دو تابع با ويژگي publicگذاشتم كه هر وقت كه بخوام صداشون مي زنم.