PDA

View Full Version : سوال: امکان Always On Top یک فرم در صفحه دسکتاپ



hamedjim
سه شنبه 10 شهریور 1394, 00:49 صبح
سلام به همگی.
برنامه ای دارم که بر اساس پردازشی که انجام میده، گاهی یک فرم جدید رو ShowModal می کنه و هشداری روی این فرم نمایش داده میشه.
ممکنه یه نفر من رو راهنمایی کنه که چطور می تونم این فرم رو در زمان نمایش به صورت AlwaysOnTop قرار بدم؟ جوری که اگه کاربر در حال کار با برنامه دیگه ای بود، این فرم روی صفحه بیاد؟
تو جستجوها به نتیجه قابل اتکایی نرسیدم.
ممنون

BORHAN TEC
سه شنبه 10 شهریور 1394, 09:29 صبح
سام،
در مورد سوال شما دو نکته به ذهنم میرسه.
1- اگه فقط قصد شما این باشه که فرم مربوطه بالای فرم های دیگه قرار بگیره میتونید خاصیت FormStyle مربوط به فرم رو به fsStayOnTop تغییر بدین.

2- در شرایطی نیازه که فرمی که بالا میاد فوکوس هم به فرم مربوطه منتقل بشه که در این صورت میتونید از روتینی مثل این استفاده کنید:
procedure InitializeFocus;var
Input: TInput;
begin
ZeroMemory(@Input, SizeOf(Input));
SendInput(1, Input, SizeOf(Input));
SetForegroundWindow(Handle);
end;
این روتین رو میتونید در رویدادی مثل OnShow صدا بزنید.

موفق باشید...

hamedjim
سه شنبه 10 شهریور 1394, 10:04 صبح
ممنون از راهنمایی. منظور من حالت دوم بود. از کد شما استفاده کردم و البته پارامتر Handle رو هم از نوع THandle تعریف کردم. ولی نتیجه‌بخش نبود.
وقتی برنامه رو اجرا کردم، برای آزمایش شروع کردم به باز کردن نرم افزار Word و انتظار داشتم زمانی که رویداد مورد نظر پیش میاد و فرم مربوطه ShowModal میشه، اون رو روی فایل Word ببینم. اما این طور نشد.
میشه راهنمایی کنید مشکل کار من کجاست؟

hamedjim
سه شنبه 10 شهریور 1394, 11:32 صبح
خب من در نهایت با استفاده از این کد تونستم به جواب برسم:



SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NoMove or SWP_NoSize);


و در صورتی که نیاز بود فرم دوباره به حالت نرمال برگرده:


SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NoMove or SWP_NoSize);