PDA

View Full Version : قرار گرفتن یک فرم زیر تمام فرمهای پروژه



alireza_63
سه شنبه 30 آبان 1385, 11:08 صبح
سلام دوستان

اگر بخواهیم یک فرم همیشه زیر تمام فرم های بعدی که روی آن باز خواهد شد قرار بگیرد و هیچ هنگام روی فرمی که از طریق آن باز می شود قرار نگیرد چه باید بکنیم ؟

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

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

dkhatibi
سه شنبه 30 آبان 1385, 11:13 صبح
در رویداد Onactive فرم Bringtofront , Bringtoback را امتحان کنید.

alireza_63
سه شنبه 30 آبان 1385, 11:26 صبح
مشکل اینجاست که Bringtoback اساسا وجود ندارد! یا من پیداش نکردم ...
Bringtofront هست اما مشکل رو حل نمیکنه چون هدف اینه که این فرم همیشه زیر فرمهای بعدی که باز میشن قرار بگیره ...

ممنونم از توجهتون.

sarvestan
سه شنبه 30 آبان 1385, 11:40 صبح
خاصیت FormStyle فرمهایی که می خواهید همیشه رو باشند را به fsStayOnTop تغییر دهید!


پ. ن : چرا از قابلیت فرم های پدر و فرزند استفاده نمی کنید؟

alireza_63
سه شنبه 30 آبان 1385, 12:39 عصر
با نکته ای که شما فرمودید تا حدی مشکل حل شد ولی هنوز یه مشکل وجود داره و اون اینه که اگر در حین کار کردن با فرمهای دیگه کاربر اتفاقی روی فرم background کلیک کنه فرم رویی زیر background قرار میگیره و باز همون مشکل تکرار میشه ...

در مورد فرم های پدر و فرزند لطف میکنین بیشتر توضیح بدین و اینکه چطور میشه فرم های فعلی که تو پروژه وجود داره رو به اون شکل تبدیل کرد و آیا مشکلات فوق حل خواهد شد ؟

MNosouhi
سه شنبه 30 آبان 1385, 12:45 عصر
فکر کنم که بهتره از MdiForm و MdiChild استفاده کنید.

dkhatibi
سه شنبه 30 آبان 1385, 12:56 عصر
مشکل اینجاست که Bringtoback اساسا وجود ندارد! یا من پیداش نکردم ...
Bringtofront هست اما مشکل رو حل نمیکنه چون هدف اینه که این فرم همیشه زیر فرمهای بعدی که باز میشن قرار بگیره ...

ممنونم از توجهتون.
درسته SendToBack درستشه

sarvestan
سه شنبه 30 آبان 1385, 13:27 عصر
یه نگاهی به این Sample بنداز

alireza_63
سه شنبه 30 آبان 1385, 14:30 عصر
dkhatibi عزیز
متاسفانه مشکل به کمک SendToBack حل نشد ....

Pesare_khob عزیز
اگر دقیقا متوجه چگونگی انجام این کار بشم این موضوع رو امتحان میکنم ...

سروستان عزیز
ممنونم از sample ای که در اختیارم گذاشتید ... اما مثال بسیار مبهمی بود! نکته مبهمش هم این بود که چطور میشه از طریق فرم 1 اجزاء موجود در فرم 2 رو صدا زد و تغییرشون داد ؟ تا اونجایی که من امتحان کردم در این مورد موفق نشدم به اجزاء فرم 2 از طرق فرم 1 دسترسی پیدا کنم... ( با وجودی که Unit2 به uses اضافه شده بود )

مسئله ی دیگه ای که وجود داره در مورد message box هست ....
گاهی وقتها پیش میاد که در هنگام نمایش یه message box بعد از انجام یک سری عملیات ، پیام به زیر فرم میره و برای کاربر دردسر ایجاد میکنه ... چون کاربر فکر میکنه برنامه از کار افتاده در حالی که پیامی ظاهر شده و او باید روی ok کلیک کنه تا برنامه مجدد فعال بشه ولی کاربر پیام رو به دلیل اینکه زیر فرم رفته نمی بینه ...
آیا راهی برای جلوگیری از بروز این اشکال وجود داره ؟

soroush_vs
سه شنبه 30 آبان 1385, 18:33 عصر
من هم همین مشکل رو داشتم اما خوشبختانه حل شد
اول اینکه باید در رویداد OnShow مربوط به فرم هایی که رو قرار میگیرند دودستور بنویسید
BackForm.Show
MainForm.Show
و در رویداد OnActivate مربوط به فرم بک گران یا BackForm یک دستور اصافه کنید
MainForm.Show

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

alireza_63
سه شنبه 30 آبان 1385, 18:42 عصر
soroush_vs عزیز
این کار مشکل رو حل نمیکنه ... چون همیشه mainform قرار نیست رو باشه ... بلکه ممکنه صفحات دیگه ای فعال بشن و اونها باید رو باشن ... در حالی که در روش شما همیشه در هنگام فعال شدن background صفحه mainform در رو قرار میگیره ...

dkhatibi
سه شنبه 30 آبان 1385, 22:08 عصر
برای قرار دادن دیالوگ در روی فرمها از تابع زیر استفاده کن!


MessageBox(Application.handle,'Your Message','Your Caption',mb_Topmost);

قاعدتا اگر هر فرم به جز فرم مورد نظر که می خواید در زیر قرار بگیره خاصیت FormStyle را به FsStayOnTop تغییر دهید (در Property ها وجود داره) نباید به مشکلی برخورد کنید.

ghabil
چهارشنبه 01 آذر 1385, 00:41 صبح
همونطوری که دوستات گفتند راه حل اصولی استفاده از فرمهای MDI هست، خود دلفی هم براشون مثال داره مطمئن باشید اگر به جای اینکه سعی کنید چرخ رو دوباره خودتون اختراع کنید به خودتون زحمت رانندگی یادگرفتن رو بدیند نه تنها زودتر به مقصد میرسید بلکه از اون مهمتر میتونید مطمئن باشید که به مقصد میرسید

برای نمونه برید New>>Other>>Projects>>MDI Application

alireza_63
چهارشنبه 01 آذر 1385, 01:13 صبح
dkhatibi عزیز

میشه گفت مشکل تقریبا به کمک همون StayOnTop که آقای سروستان هم بهش اشاره کرده بودند حل شد ...

در مورد دیالوگ روی فرم ها هم ازتون ممنونم...

قابیل عزیز

حق با شماست!
ممنونم از توجهتون.