delphi4arab منتديات دلفي للعرب

نسخة كاملة : جعل الفورم في مقدمة النوافذ و تحريكها مثل OnMoveWindow
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله وبراتة

لدي نافذة وقد اعطيتها الخاصية
BroderStyle=bsNone
المراد هو ان اجعل هذا الفورم يكون في مقدمة الونافذ في برنامجي فقط
حيث يوجد عدة نوافذ في هذا البرنامج وأريـ ـد لهذا الفورم ان يكون في مقدمتها دوماً ولا يكون في مقدمة البرامج الآخرى

السؤال الآخر .. ابحث عن الحدث خاص بتحريك النافذة أي عندما اقوم بنقل النافذة من مكان إلى آخرى على الشاشة يتم حدث .. كمثال OnMoveWindow
وإن لم يكن موجود كيف اعمل مثل هذا الحدث ^^


وشكراً لحسن القراءة
و عليكم السلام ورحمة الله وبركاته
كود :
المراد هو ان اجعل هذا الفورم يكون في مقدمة الونافذ في برنامجي فقط
formStyle=fsStayOnTop
إقتباس :ابحث عن الحدث خاص بتحريك النافذة أي عندما اقوم بنقل النافذة من مكان إلى آخرى على الشاشة يتم حدث
كود :
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); const SC_DRAGMOVE = $F012; begin if Button = mbLeft then begin ReleaseCapture; Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0); end; end;
كود :
http://stackoverflow.com/questions/10921093/move-form-without-border-style
باتلوفيق
أوه ^^" .. كنت اضن أن formStyle=fsStayOnTop تعمل على حميع البرامج عذراً على هذا السؤال .. وشكراً على الاجابة

لكن ماذا عن إذا كنت أريـ ـد تحرك النافذة الرئيسية وجعل النوافذ الاخرى تتحرك معها .. لذلك قصدت الحدث OnMoveWindow

كمثال .. لدي نافذتين .. النافذة الرئيسية تملك إطار اما الآخرى لا تملك ايطار .. وانا اريـ ـد عندما اقوم بتحرك النافذة الرئيسية تتحرك النافذة اللتي لا تملك إطار معها
مثال (Form1 هي الرئيسية ) :
كود :
TForm1 = class(TForm) procedure FormShow(Sender: TObject); private procedure WMMove(var Message: TMessage) ; message WM_MOVE; public iIniLeft,iIniTop: integer;
كود :
procedure TForm1.FormShow(Sender: TObject); begin iIniLeft:=Form2.Left-left; iIniTop:=Form2.Top-Top; end; procedure TForm1.WMMove(var Message: TMessage); begin Form2.Left:=iIniLeft+TWMMove(Message).XPos; Form2.Top:=iIniTop+TWMMove(Message).YPos; end;
بالتوفيق
شكراً اخي على الكود .. يعمل بكفائة

لكن هذا يعمل مع Windows .. فقط ؟

وكذلك كيف اعرف طرق التعامل مع النظام مثل هذه الحالة ؟
بالنسبة للمثال الذي كتبت .. عندما اقوم بتشغيل البرنامج .. تظهر رسالة خطاء تحتوي :
PHP كود :
Access violation at address 005D86B4 in module 'project.exe'. Read of address 0000001C. 
وموقع الخطاً يكون هنا :

PHP كود :
procedure TCustomForm.SetTop(Value: Integer);
begin
  
if (csDesigning in ComponentState) and (Parent <> nil) then  //<< ----- Error
  
begin
    DesignInfo 
:= (DesignInfo and $FFFF0000) or (Cardinal(Value) and $FFFF);
    if 
not (csLoading in ComponentState) and (Position <> poDefaultSizeOnly) then
      Position 
:= poDesigned;
  
end else
    
inherited Top := Value;
end; 

علماً ان الخطاء يظهر وقت تنفيذ البرنامج فقط ..
ما سبب الخطاء .. وشكراً

قمت بتجربة الكود على D7 , D XE4 ونفس الخطاء يظهر
وجدت الاجابة هنا :
PHP كود :
http://delphi.about.com/od/windowsshellapi/a/dragnocaption.htm 

شبيهي بالمثال الذي ذكرت لكن على ما يبدو ان النوع المستعمل في الدالة مختلف عن ما ذكرت
لكني إلى الان لا اعرف سبب الخط الذي حدث لي مع مثالك
قمت بتبديل الدالة إلى :
PHP كود :
procedure WMMove(var Msg: TWMMoving) ; message WM_MOVING; 
كي تعمل مع تحريك النافذة
السلام عليكم
إقتباس : لكن هذا يعمل مع Windows .. فقط ؟
نعم خاص بـ Windows فقط
كود :
http://msdn.microsoft.com/en-us/library/windows/desktop/ms632631%28v=vs.85%29.aspx
هل تخلصت من رسالة الخطأ ؟ (لا أملك دلفي للتجريب Big Grin)
إقتباس :هل تخلصت من رسالة الخطأ ؟
نعم عندما قمت بتغيير WM_MOVE إلى WM_MOVING .. لم يظهر الخطاء
على ما يبدو ان له طريقة استعمال خاصة او انه يوجد Bug