الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تحريك الأزرار

مغلق
بدأه in4maTic في 17 مارس 2006 · 3 رد · 591 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

إخواني الأعزاء!

إذا كان لدينا على أحد النماذج زر button ونرغب بتحريكه حركة دائرية حول نقطة معينة, فكيف يمكن ذلك ...

أرجو وضع كود يرشد للعمل (لأن الفكرة النظرية واضحة لدي وحاولت تطبيقها فلم تنحج بالشكل المطلوب)... وشكراً لكم...

المال في الغربة وطن والفقر في الوطن غربة

#2

السلام عليكم

شيئ مثل هذا...

For i:=0 to 360 Do Begin
   Button1.Top:=Round(Cos(DegToRad(i))*100);
   Button1.Left:=Round(Sin(DegToRad(i))*100);
Sleep(10); // نم قليلا
end;

Delphi_Spinning_button_Example.rar

تم تعديل هذه المشاركة بواسطة DeltaAziz في 18 مارس 2006 في 17:42

d4baa0.gif
#3

أخي العزيز! كل الشكر لك...

الحقيقة أنني أستخدم الشيفرة ذاتها, وبالطبع مع قيم متغيرة لمركز الدوران و لنصف قطر الدوران.... لكن ما يحصل أن الدوران لا يبدأ من موضع الزر الحالي... وإنما ينتقل في البداية إلى موقع جديد يبدأ منه الدوران...

بالطبع, لقد قمت بتعريف متحول حقيقي (i) يأخذ قيمة ابتدائية معتمدة على الـ (left) الخاص بالزر (من خلال العلاقة arcsin)... لكن قيمة y هي التي لا تنجح في جميع الأحوال...

أرجو إن أمكن, إيضاح كيفية تدوير الزر من موقعه الحالي, وليس نقله إلى الموقع الموافق لـ (i=0) ثم البدء بالدوران...

شكراً لك...

المال في الغربة وطن والفقر في الوطن غربة

#4

السلام عليكم

بالنسبة لإحداثيات دائرة فهي على هذا النحو:

Sx:= X0 + R Cos (teta)
Sy:= Y0 + R Sin (teta)

أما في المعلم الإفتراضي للنوافذ في ويندوز فيجب كتابتها:

Sx.Top:=  X0.top   + r * Cos(teta);
Sy.Left:= Y0.left  + r * Sin(teta);

مع Sx,Sy هما إحداثيات الدائرة على النافذة و X0,Y0 هما إحداثيات مركزها, و r هو شعاعها.

سيكون الكود في ديلفي :

procedure TForm1.Button2Click(Sender: TObject);
var
 teta,i:integer;
 b0: TPoint;
const r= 20; //Rayon in pixels
begin
  b0.X:= Button1.Top - r;
  b0.Y:= Button1.Left;
For teta:=0 to 360 Do Begin
  Button1.Top:= b0.x   + Round( r * Cos(teta * pi /180));
  Button1.Left:= b0.Y +  Round( r * Sin(teta * pi /180));
  for i := 0 to 100000 do Application.ProcessMessages;
end;
end;

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

هذا الموضوع مغلق.

مواضيع مشابهة