السلام عليكم ورحمة الله وبركاته
أما بعد في المرفق مثال كنت أريد رسم بيان به
لكني لم أستطع رسم هذه الأسهم
أريد تعديل يجعل البرنامج كالتالي

أي يمكنني رسم سهم بين أي زوج من Button الموجودين
وذلك بواسطة الفأرة
والسلام عليكم ورحمة الله وبركاته
السلام عليكم ورحمة الله وبركاته
أما بعد في المرفق مثال كنت أريد رسم بيان به
لكني لم أستطع رسم هذه الأسهم
أريد تعديل يجعل البرنامج كالتالي

أي يمكنني رسم سهم بين أي زوج من Button الموجودين
وذلك بواسطة الفأرة
والسلام عليكم ورحمة الله وبركاته
نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله
عمر بن الخطاب رضي الله عنه وأرضاه
ألم تجدوا حلا
نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله
عمر بن الخطاب رضي الله عنه وأرضاه
أين أنتم
نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله
عمر بن الخطاب رضي الله عنه وأرضاه
لقد وجدت دالة رسم الأسهم وهذه هي
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
فما هي طريقة لذلك
وأرجو منكم المساعدة ولو بقليل المعلومات
فأنا لم ألاحظ أي تفاعل منكم
نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله
عمر بن الخطاب رضي الله عنه وأرضاه
لم أعتقد أن الأمر بهذه الصعوبة
ألا يوجد أحد قادر على إيجاد الحل أم أن الأمر مستحيل
نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله
عمر بن الخطاب رضي الله عنه وأرضاه
يا جماعه .....
أنا أريد فقط دالة تحدد الـ Button من الجدول
نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله
عمر بن الخطاب رضي الله عنه وأرضاه
السلام عليكم...
طوال اليومين السابقين كنت أجهز لك المشروع المرفق، و هو يحتوي على وحدة برمجية (Unit) باسم UDrawArrows خاصة برسم الأسهم، بالإضافة إلى Form للتجربة.
طبعاً يمكن إضافة الوحدة UDrawArrows إلى مشروعك و استدعاء الإجراءات الموجود بها لرسم الأسهم بشكل مباشر أو بتحديد مكونين (زرين مثلاً) لربطهما بسهم.
تحتوي تلك الوحدة على مجموعة من الدوال و الإجراءات التي تضم شرحاً مفصلاً بالعربي. لا تنس أن تضيف اسم الوحدة UDrawArrows إلى جملة uses في النافذة التي تحتاجها فيها.
لا يمكنك الاعتماد على الرسم على الـ Canvas التابع للـ Form لأنه سيتم مسحه إذا قام Windows بتحديث (Refresh) للـ Form (هذا في أصل دلفي). لذلك يكون من الأفضل أن تضع مكون مثل TImage كخلفية للمكونات التي تريد ربطها بالأسهم بحيث يكون موضعه (0, 0) أي Left = 0 و Top = 0 للمكون TImage (كما هو في المثال المرفق)، أو تجعل الخاصية Align للمكون TImage مضبوطة على Client.
المرفقات: Draw Arrows.rar
نرجو الاستفادة و السلام.
وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ
صدق الله العظيم
بارك الله فيك
لقد إستخدمت مكون Image كما قلت
وإستخدمت الدالة التي وضعتها في ردود سابقة
لكن هذه الوحدة أفضل فشكرا لك على هذه الوحدة
هل يمكن رسم الأسهم بين الأزرار بواسطة الفأرة ؟
للعلم فأنا إستخدمت Array of Button و أنت إستخدمت ثلاث Button
و آسف للأني أتعبتك معي
تم تعديل هذه المشاركة بواسطة ابن ابي سفيان في 29 يونيو 2012 في 17:45
نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله
عمر بن الخطاب رضي الله عنه وأرضاه
السلام عليكم...
كنت أتمنى أن أحول الكود إلى مكون (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 عند إفلات زر الفأرة.
نرجو الاستفادة و السلام.
وَ قُلِ اعْمَلُوا فَسَيَرَى اللهُ عَمَلَكُمْ وَ رَسُولُهُ وَ الْمُؤْمِنُونَ
صدق الله العظيم
بارك الله فيك ونفع بك
هذا ما كنت أريده
لك جزيل الشكر
نحن قوم أعزنا الله بالإسلام فإن ارتضينا العزة بغيره أذلنا الله
عمر بن الخطاب رضي الله عنه وأرضاه