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

رسم أسهم في دلفي

بدأه ابن ابي سفيان في 22 يونيو 2012 · 10 رد · 1,271 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

أما بعد في المرفق مثال كنت أريد رسم بيان به

لكني لم أستطع رسم هذه الأسهم

أريد تعديل يجعل البرنامج كالتالي

332822334.jpg

أي يمكنني رسم سهم بين أي زوج من Button الموجودين

وذلك بواسطة الفأرة

والسلام عليكم ورحمة الله وبركاته

EXEMPLE.rar

نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله

عمر بن الخطاب رضي الله عنه وأرضاه

#2

ألم تجدوا حلا

نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله

عمر بن الخطاب رضي الله عنه وأرضاه

#3

أين أنتم

نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله

عمر بن الخطاب رضي الله عنه وأرضاه

#4

لقد وجدت دالة رسم الأسهم وهذه هي

procedure TForm1.VecteurAB(ACanvas: TCanvas; A,B: TPoint);
const ArrowLength = 10;
      ArrowWidth  = 5;
var Norme,cX,cY: real;
    Arrow: Array [0..2] of TPoint;
begin
  Norme:=SQRT((B.X-A.X)*(B.X-A.X)+(B.Y-A.Y)*(B.Y-A.Y));
  if (Norme=0) then Exit;
  cX:=(B.X-A.X)/Norme;
  cY:=(B.Y-A.Y)/Norme;
  cX:=(B.X-A.X)/Norme;
  cY:=(B.Y-A.Y)/Norme;
  Arrow[0]:=B;
  Arrow[1]:=Point(Round(B.X-cX*ArrowLength+cY*ArrowWidth),Round(B.Y-cY*ArrowLength-cX*ArrowWidth));
  Arrow[2]:=Point(Round(B.X-cX*ArrowLength-cY*ArrowWidth),Round(B.Y-cY*ArrowLength+cX*ArrowWidth));
  ACanvas.Pen.Style:=psSolid;
  ACanvas.Pen.Color:= clBlack;
  ACanvas.Brush.Style:=bsSolid;
  ACanvas.Brush.Color:= clBlack;
  ACanvas.MoveTo(A.X,A.Y);
  ACanvas.LineTo(B.X,B.Y);
  ACanvas.Polygon(Arrow);
end;

لكن لم أجد فكرة تساعدني على إستعمالها في المثال السابق

المشكلة هي عند الضغط على الـ Button كيف يمكن تحديده لأنني إستخدمت array of button

فما هي طريقة لذلك

وأرجو منكم المساعدة ولو بقليل المعلومات

فأنا لم ألاحظ أي تفاعل منكم

نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله

عمر بن الخطاب رضي الله عنه وأرضاه

#5

لم أعتقد أن الأمر بهذه الصعوبة

ألا يوجد أحد قادر على إيجاد الحل أم أن الأمر مستحيل

نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله

عمر بن الخطاب رضي الله عنه وأرضاه

#6

يا جماعه .....

أنا أريد فقط دالة تحدد الـ Button من الجدول

نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله

عمر بن الخطاب رضي الله عنه وأرضاه

#7

السلام عليكم...

طوال اليومين السابقين كنت أجهز لك المشروع المرفق، و هو يحتوي على وحدة برمجية (Unit) باسم UDrawArrows خاصة برسم الأسهم، بالإضافة إلى Form للتجربة.

post-28631-097386700 1340978348_thumb.jp

طبعاً يمكن إضافة الوحدة UDrawArrows إلى مشروعك و استدعاء الإجراءات الموجود بها لرسم الأسهم بشكل مباشر أو بتحديد مكونين (زرين مثلاً) لربطهما بسهم.

تحتوي تلك الوحدة على مجموعة من الدوال و الإجراءات التي تضم شرحاً مفصلاً بالعربي. لا تنس أن تضيف اسم الوحدة UDrawArrows إلى جملة uses في النافذة التي تحتاجها فيها.

لا يمكنك الاعتماد على الرسم على الـ Canvas التابع للـ Form لأنه سيتم مسحه إذا قام Windows بتحديث (Refresh) للـ Form (هذا في أصل دلفي). لذلك يكون من الأفضل أن تضع مكون مثل TImage كخلفية للمكونات التي تريد ربطها بالأسهم بحيث يكون موضعه (0, 0) أي Left = 0 و Top = 0 للمكون TImage (كما هو في المثال المرفق)، أو تجعل الخاصية Align للمكون TImage مضبوطة على Client.

المرفقات: Draw Arrows.rar

نرجو الاستفادة و السلام.

المرفقات
DrawArrows.jpg

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#8

بارك الله فيك

لقد إستخدمت مكون Image كما قلت

وإستخدمت الدالة التي وضعتها في ردود سابقة

لكن هذه الوحدة أفضل فشكرا لك على هذه الوحدة

هل يمكن رسم الأسهم بين الأزرار بواسطة الفأرة ؟

للعلم فأنا إستخدمت Array of Button و أنت إستخدمت ثلاث Button

و آسف للأني أتعبتك معي

تم تعديل هذه المشاركة بواسطة ابن ابي سفيان في 29 يونيو 2012 في 17:45

نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله

عمر بن الخطاب رضي الله عنه وأرضاه

#9

السلام عليكم...

كنت أتمنى أن أحول الكود إلى مكون (Component) لكن للأسف لا أملك الوقت في المدة القريبة.

طبعاً يمكن رسم الأسهم بالفأرة، كالتالي:

قم بتعريف متغيرين من النوع Integer في بداية القسم implementation للاحتفاظ بإحداثيات نقطة البداية، مثلاً:

var
    StartX, StartY: Integer;

في إجراء الحدث OnMouseDown للمكون TImage اكتب الكود التالي:

    if Button = mbLeft then begin
        StartX := X;
        StartY := Y;
    end;

في إجراء الحدث OnMouseUp للمكون TImage اكتب الكود التالي (أو ما يشبهه):

    if (Button = mbLeft) and ((X <> StartX) or (Y <> StartY)) then begin
        DrawArrow(Image1.Canvas, FloatPoint(StartX, StartY), FloatPoint(X, Y), 3, clGreen,
                  TArrowHeadPosition(cboHeadPosition.ItemIndex), clRed, True,
                  StrToFloat(edtHeadLenPercent.Text), StrToFloat(edtHeadWidePercent.Text));
    end;

طبعاً للتوضيح أنا كتبت الكود على أساس أنه جزء من النافذة الموجودة في المشروع المرفق سابقاً، و طبعاً يمكنك تكييف الكود حسب حاجتك. الفكرة هي أن نقطة البداية يتم تحديدها بالمتغيرين StartX و StartY (المخزنتين عند ضغط زر الفأرة الأيسر في البداية)، و نقطة النهاية يتم تحديدها بالبارامترين X و Y عند إفلات زر الفأرة.

نرجو الاستفادة و السلام.

وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ

صدق الله العظيم

#10

بارك الله فيك ونفع بك

هذا ما كنت أريده

لك جزيل الشكر

نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله

عمر بن الخطاب رضي الله عنه وأرضاه

#11

ابداع ......

من جد وجد ومن زرع حصد

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