PDA

View Full Version : Stay on top کردن فرم در Runtime



پریسا نامدار
پنج شنبه 11 فروردین 1384, 14:02 عصر
من یک فرم دارم که تویه اون یک فایل ویدیویی در حال پخش هستش.
حالا میخوام به کاربر این اجازه رو بدم که بتونه فرم ویدویی رو به stay on top یا برعکس در بیاره.
وفتی از دستور زیر استفاده میکنم فرم یه بسته و باز میشه که در کار مدیا پلیر اختلال ایجاد میکنه .

form3.FormStyle:=fsStayOnTop;
میشه کمک کنید و بگید چطوری میشه ان مشکل رو طوری حل کرد که فیلمی که در حال پخشه مشکلی براش پیش نیاد.
اگه دستوری بر روی Application هم باشه خوبه . چون موقع باز بودن این فرم فرم دیگه ای باز نیست.[/code]

DelphiMan
پنج شنبه 11 فروردین 1384, 15:35 عصر
با سلام
شما با استفاده از API زیر می توانید اینکار انجام دهید:

<span dir=ltr>
SetWindowPos&#40;Handle, // handle to window
HWND_TOPMOST, // placement-order handle &#123;*&#125;
Left, // horizontal position
Top, // vertical position
Width,
Height,
// window-positioning options
SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE&#41;;
</span>

البته در اونجایی که * گذاشته شده شما می تونید از مقادیر زیر هم استفاده کنید:


HWND_BOTTOM
Places the window at the bottom of the Z order.
HWND_NOTOPMOST
Places the window above all non-topmost windows
HWND_TOP
Places the window at the top of the Z order.
HWND_TOPMOST
Places the window above all non-topmost windows.
The window maintains its topmost position even when it is deactivated.

امیدوارم مفید باشه
موفق باشید

DelphiMan
پنج شنبه 11 فروردین 1384, 15:40 عصر
یک نکته که یادم رفت بگم اینه که در قسمت اول Handle, left, top, Width, Height مربوط به Form هست که شما میتونید با استفاده از یک With Form1 do قبل از کد یا With Self do مشکل رو حل کنید

موفق باشید

JavanSoft
پنج شنبه 11 فروردین 1384, 16:47 عصر
دستور شما در دلفی درست است ...محل اجرای آن کدام Event است؟

DelphiMan
پنج شنبه 11 فروردین 1384, 17:49 عصر
محل خاصی نداره :wink:

هرجا که لازم باشه میشه این API رو صدا زد. در واقع با این تابع شما میتونید فرم برنامتون رو on top کنید.

موفق باشید

پریسا نامدار
پنج شنبه 11 فروردین 1384, 18:26 عصر
خیلی ممنون از لطفتون.
براحتی تونستم از این تابع استفاده کنم و مشکل قبل هم حل شد.
بازم ممنون. :flower:

vcldeveloper
پنج شنبه 11 فروردین 1384, 18:37 عصر
مشکل از فراخوانی DestroyHandle در متد SetFormStyle هست :



procedure TCustomForm.SetFormStyle&#40;Value&#58; TFormStyle&#41;;
...
if not &#40;csDesigning in ComponentState&#41; then DestroyHandle;
...


کد DestroyHandle :


procedure TWinControl.DestroyHandle;
var
I&#58; Integer;
begin
if FHandle &lt;> 0 then
begin
if FWinControls &lt;> nil then
for I &#58;= 0 to FWinControls.Count - 1 do
TWinControl&#40;FWinControls&#91;I&#93;&#41;.DestroyHandle;
DestroyWnd;
end;
end;


و کد CreateHandle :


procedure TWinControl.CreateHandle;
var
I&#58; Integer;
begin
if FHandle = 0 then
begin
CreateWnd;
...
if Parent &lt;> nil then
SetWindowPos&#40;FHandle, Parent.PrecedingWindow&#40;Self&#41;, 0, 0, 0, 0,
SWP_NOMOVE + SWP_NOSIZE + SWP_NOACTIVATE&#41;;
...
end;
end;


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

پریسا نامدار
یک شنبه 14 فروردین 1384, 12:14 عصر
خیلی ممنون.
میشه بگید چطوری میتونم از دادن مقادیر top و Left صرف نظر کنم که فرم هرجا هست همون جا Stay on top بشه ؟

vcldeveloper
دوشنبه 15 فروردین 1384, 02:15 صبح
میشه بگید چطوری میتونم از دادن مقادیر top و Left صرف نظر کنم که فرم هرجا هست همون جا Stay on top بشه ؟
به آخرین پارامتر تابع دقت کنید:


SWP_NOMOVE + SWP_NOSIZE + SWP_NOACTIVATE

SWP_NOMOVE موجب میشه که پنجره مورد نظر تغییر مکان نده.

Hamid_PaK
دوشنبه 03 مرداد 1384, 05:23 صبح
چطوری فرمی که با ShowModal نمایش داده شده رو StayOnTop کرد ؟؟؟
(البته فرم از نوع Child هست)

Hamid_PaK
سه شنبه 04 مرداد 1384, 06:17 صبح
اواخر کسی نیست دیگه به سوالات جواب بده یا سوالات تعدادش زیاد شدن ؟؟؟؟؟؟؟؟