لقد سمعت دائمًا أن القماش في دلفي بسيط ومريح للاستخدام. الآن يمكنني استخدام القماش لتنفيذ تمثيل رسومي لآلية شجرة بسيطة. يدعم النظام اختيار العقدة والحركة وإنقاذ الأشجار وفتح الأشجار ، إلخ. تُستخدم العوالم والمؤشرات للراحة.
البرنامج مكتوب في فوضى ، مرحبًا بك في التواصل: [email protected]
رمز المصدر كما يلي:
الوحدة u_tree ؛
واجهة
يستخدم
Windows ، الرسائل ، sysutils ، الفئات ، الرسومات ، عناصر التحكم ، النماذج ، الحوار ،
extctrls ، stdctrls ، jpeg ، menus ، inifiles32 ؛
يكتب
TOBJ = السجل
objid: سلسلة.
CenterX: عدد صحيح ؛
مركزية: عدد صحيح ؛
Typeno: عدد صحيح ؛
مختارة: منطقية ؛
fnode: سلسلة ؛
أظهر: منطقية.
نهاية؛
TFRM_TREE = فئة (tform)
لوحة 1: tpanel ؛
paintbox1: tpaintbox ؛
لوحة 2: tpanel ؛
Label1: tlabel ؛
Button2: Tbutton ؛
Button1: Tbutton ؛
Button3: Tbutton ؛
Button4: Tbutton ؛
Button5: Tbutton ؛
Button6: Tbutton ؛
MainMenu1: tmainmenu ؛
fadestream1: tmenuitem ؛
RandomRandomSelection1: tmenuitem ؛
SaveAdialog1: tsavedialog ؛
Opendialog1: Topendialog ؛
Button7: Tbutton ؛
الإجراء paintbox1mousedown (المرسل: TOBJECT ؛ زر: TMOUSEBUTTON ؛
Shift: TshiftState ؛
Formcreate الإجراء (المرسل: TOBJECT) ؛
الإجراءات button1click (المرسل: tobject) ؛
الإجراءات button2click (المرسل: tobject) ؛
الإجراء paintbox1paint (المرسل: tobject) ؛
الإجراء button3click (المرسل: tobject) ؛
الإجراءات button4click (المرسل: tobject) ؛
الإجراءات button5click (المرسل: tobject) ؛
الإجراء button6click (المرسل: tobject) ؛
الإجراء paintbox1mouseup (المرسل: TOBJECT ؛ زر: TMOUSEBUTTON ؛
Shift: TshiftState ؛
الإجراء paintbox1mousemove (المرسل: tobject ؛ Shift: TshiftState ؛ X ،
Y: عدد صحيح) ؛
الإجراءات fadestream1click (المرسل: TOBJECT) ؛
الإجراء randomrandomselection1click (المرسل: tobject) ؛
الإجراءات button7click (المرسل: tobject) ؛
خاص
{إعلانات خاصة}
Toolno: عدد صحيح ؛
Beginx ، Beginy ، endx ، endy: integer ؛
نقر: منطقية ؛
olst: stlist ؛
سيلد: سلسلة.
الجذر: منطقية ؛
سيرليد: عدد صحيح.
الإجراء DrawNode (id: string) ؛
الإجراء AddObj (id: string ؛ x ، y: integer ؛ typeno: integer ؛ select: boolean ؛ fnode: string ؛ arher: boolean) ؛
وظيفة getObj (id: string): tobj ؛
وظيفة getPobj (معرف: سلسلة): مؤشر ؛
وظيفة getSelect: tobj ؛
وظيفة hadeselect: منطقية ؛
وظيفة clickObj (x ، y: integer): سلسلة ؛
الإجراء رسم.
الإجراء setSelected (x ، y: integer) ؛
وظيفة setShowsel (x ، y: integer): tobj ؛
الإجراء setFnode (id: string) ؛
الإجراء setCnode (id: string) ؛
الإجراء clearshowed ؛
الإجراء ClearCanvas ؛
الإجراء MoveObj (DX ، dy: integer) ؛
الإجراء movenode (dx ، dy: integer ؛ id: string) ؛
الإجراء movelocal (dx ، dy: integer) ؛
//إجراء
عام
{الإعلانات العامة}
نهاية؛
var
frm_tree: tfrm_tree ؛
تطبيق
{$ r *.dfm}
{tform1}
الإجراء tfrm_tree.drawnode (معرف: سلسلة) ؛
var
Oldbrushcolor: tcolor ؛
Oldpencolor: tcolor ؛
OBJ: TOBJ ؛
يبدأ
OBJ: = getObj (id) ؛
مع frm_tree.paintbox1.canvas تفعل
يبدأ
إذا كان obj.showed ثم
يبدأ
OldBrushColor: = brush.color ؛
Oldpencolor: = pen.color ؛
إذا تم Obj.seleded ثم
يبدأ
Pen.Color: = RGB (255،0،0) ؛
نهاية؛
Brush.Color: = $ 00ff31ff ؛
Ellipse (obj.centerx-10 ، obj.centery-10 ، obj.centerx+10 ، obj.centery+10) ؛
Pen.Color: = $ 00ff31ff ؛
إذا obj.typeno> 0 ثم
يبدأ
Moveto (obj.centerx ، obj.centery) ؛
Lineto (getObj (obj.fnode) .Centerx ، getObj (obj.fnode) .Centery) ؛
نهاية؛
Pen.Color: = Oldpencolor ؛
Brush.Color: = OldBrushColor ؛
نهاية؛
نهاية؛
نهاية؛
الإجراء tfrm_tree.paintbox1mousedown (المرسل: tobject ؛
زر: TmouseButton ؛
var
Curobj: Tobj ؛
يبدأ
إذا كان الزر = mbleft ثم
يبدأ
TOURNO CASE من
1:
يبدأ
searilid: = searilid+1 ؛
إذا الجذر ثم
يبدأ
addobj (inttoStr (searilid) ، x ، y ، 0 ، false ، '' ، true) ؛
Drawnode (inttostr (searilid)) ؛
الجذر: = خطأ ؛
نهاية
آخر
يبدأ
إذا كان hadeselect ثم
يبدأ
addobj (inttoStr (searilid) ، x ، y ، 1 ، false ، getSelect.Objid ، true) ؛
Drawnode (inttostr (searilid)) ؛
label1.caption: = 'أضف العقدة ، معرف:'+inttoStr (searilid) ؛
نهاية
آخر
يبدأ
label1.caption: = "الرجاء تحديد العقدة! '؛
نهاية؛
نهاية؛
نهاية؛
2:
يبدأ
setSelected (x ، y) ؛
نهاية؛
3: // عرض
يبدأ
// ClearCanvas ؛
curobj: = setShowsel (x ، y) ؛
إذا curobj.objid <> 'ثم
يبدأ
clearshowed
curobj: = setShowsel (x ، y) ؛
curobj.showed: = true ؛
setFnode (curobj.fnode) ؛
setCnode (curobj.objid) ؛
رسم
نهاية؛
نهاية؛
4: // mobile
يبدأ
إذا كان ClickObj (x ، y) <> '' ثم انقر فوق: = true ؛
BeginX: = x ؛
Beginy: = y ؛
نهاية؛
5:
يبدأ
إذا كان ClickObj (x ، y) <> '' ثم انقر فوق: = true ؛
BeginX: = x ؛
Beginy: = y ؛
نهاية؛
نهاية؛
نهاية
آخر
يبدأ
setSelected (x ، y) ؛
نهاية؛
نهاية؛
الإجراء TFRM_TREE.FormCreate (المرسل: tobject) ؛
يبدأ
OLST: = ledly.create ؛
toolno: = 0 ؛
الجذر: = صحيح ؛
selid: = '' ؛
searilid: = 0 ؛
نقر: = خطأ ؛
مع paintbox1.canvas تفعل
يبدأ
Brush.Color: = clwhite ؛
FillRect (rect (0،0 ، paintbox1.width ، paintbox1.Height)) ؛
نهاية؛
نهاية؛
الإجراء tfrm_tree.button1click (المرسل: tobject) ؛
يبدأ
Toolno: = 1 ؛
نهاية؛
الإجراء tfrm_tree.button2click (المرسل: tobject) ؛
يبدأ
toolno: = 2 ؛
نهاية؛
الإجراء TFRM_TREE.ADDOBJ (ID: String ؛ X ، Y ، Typeno: integer ؛
مختارة: Boolean ؛
var
OBJ: ^TOBJ ؛
يبدأ
جديد (OBJ) ؛
obj.objid: = id ؛
obj.centerx: = x ؛
obj.centery: = y ؛
obj.typeno: = typeno ؛
obj.selected: = محدد ؛
obj.fnode: = fnode ؛
obj.showed: = أظهر ؛
olst.add (OBJ) ؛
نهاية؛
دالة tfrm_tree.getobj (معرف: سلسلة): tobj ؛
var
أنا ، ي: عدد صحيح ؛
يبدأ
J: = olst.count ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
إذا tobj (olst.items [i]^). objid = id ثم
يبدأ
النتيجة: = tobj (olst.items [i]^) ؛
استراحة؛
نهاية؛
نهاية؛
نهاية؛
دالة tfrm_tree.getSelect: tobj ؛
var
أنا ، ي: عدد صحيح ؛
يبدأ
J: = olst.count ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
إذا tobj (olst.items [i]^). تم اختياره ثم
يبدأ
النتيجة: = tobj (olst.items [i]^) ؛
استراحة؛
نهاية؛
نهاية؛
نهاية؛
وظيفة tfrm_tree.haveselect: منطقية ؛
var
أنا ، ي: عدد صحيح ؛
يبدأ
النتيجة: = خطأ ؛
J: = olst.count ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
إذا tobj (olst.items [i]^). تم اختياره ثم
يبدأ
النتيجة: = صحيح ؛
استراحة؛
نهاية؛
نهاية؛
نهاية؛
الإجراء tfrm_tree.drawfull ؛
var
أنا ، ي: عدد صحيح ؛
يبدأ
//paintbox1.canvas.fillRect(Rrect(0،0،paintbox1.width،paintbox1.height)) ؛
ClearCanvas ؛
J: = olst.count ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
drawnode (tobj (olst.items [i]^). objid) ؛
نهاية؛
نهاية؛
الإجراء tfrm_tree.paintbox1paint (المرسل: tobject) ؛
يبدأ
رسم
نهاية؛
الإجراء TFRM_TREE.SetSelected (x ، y: integer) ؛
var
أنا ، ي: عدد صحيح ؛
يبدأ
J: = olst.count ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
tobj (olst.items [i]^). تم اختياره: = false ؛
if (tobj (olst.items [i]^). centerx-10 <x) و (tobj (olst.items [i]^). centerx+10> x)
و (tobj (olst.items [i]^). centery-10 <y) و (tobj (olst.items [i]^). centery+10> y) ثم)
يبدأ
tobj (olst.items [i]^). تم اختياره: = صحيح ؛
label1.caption: = 'حدد معرف العقدة:'+ tobj (olst.items [i]^). objid ؛
نهاية؛
نهاية؛
رسم
نهاية؛
الإجراء tfrm_tree.button3click (المرسل: tobject) ؛
يبدأ
Toolno: = 3 ؛
نهاية؛
دالة tfrm_tree.setshowsel (x ، y: integer): tobj ؛
var
أنا ، ي: عدد صحيح ؛
يبدأ
J: = olst.count ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
tobj (olst.items [i]^). تم اختياره: = false ؛
if (tobj (olst.items [i]^). centerx-10 <x) و (tobj (olst.items [i]^). centerx+10> x)
و (tobj (olst.items [i]^). centery-10 <y) و (tobj (olst.items [i]^). centery+10> y) ثم)
يبدأ
tobj (olst.items [i]^). أظهر: = صحيح ؛
label1.caption: = 'انظر معرف العقدة:'+ tobj (olst.items [i]^). objid ؛
النتيجة: = tobj (olst.items [i]^) ؛
استراحة؛
نهاية؛
نهاية؛
نهاية؛
الإجراء tfrm_tree.clearshowed ؛
var
أنا ، ي: عدد صحيح ؛
يبدأ
J: = olst.count ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
tobj (olst.items [i]^). أظهر: = خطأ ؛
نهاية؛
نهاية؛
الإجراء tfrm_tree.setfnode (معرف: سلسلة) ؛
var
curobj:^tobj ؛
يبدأ
إذا كان معرف <> 'ثم
يبدأ
// جديد (curobj) ؛
curobj: = getPobj (id) ؛
بينما curobj^.typeno = 1 تفعل
يبدأ
curobj^.showed: = true ؛
curobj: = getPobj (curobj^.fnode) ؛
نهاية؛
curobj^.showed: = true ؛
// dispose (curobj) ؛
نهاية؛
نهاية؛
الإجراء tfrm_tree.setCnode (معرف: سلسلة) ؛
var
curobj:^tobj ؛
أنا ، ي: عدد صحيح ؛
يبدأ
// curobj: = getObj (id) ؛
J: = olst.count ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
إذا tobj (olst.items [i]^). fnode = id ثم
يبدأ
curobj: = getPobj (tobj (olst.items [i]^). objid) ؛
curobj^.showed: = true ؛
setCnode (curobj^.Objid) ؛
نهاية؛
نهاية؛
نهاية؛
الإجراء tfrm_tree.clearcanvas ؛
يبدأ
//paintbox1.canvas
paintbox1.canvas.fillrect (rect (0،0 ، paintbox1.width ، paintbox1.hight)) ؛
نهاية؛
الإجراء tfrm_tree.button4click (المرسل: tobject) ؛
يبدأ
نقر: = خطأ ؛
paintbox1.canvas.fillrect (rect (0،0 ، paintbox1.width ، paintbox1.hight)) ؛
olst.clear ؛
الجذر: = صحيح ؛
selid: = '' ؛
searilid: = 0 ؛
{مع paintbox1.canvas تفعل
يبدأ
Pen.Width: = 2 ؛
pen.color: = clblack ؛
Pen.Style: = psclear ؛
Brush.style:=bssolid ؛
Brush.Color: = clwhite ؛
مستطيل (0،0 ، paintbox1.width ، paintbox1.hight) ؛
نهاية؛}
نهاية؛
الإجراء tfrm_tree.button5click (المرسل: tobject) ؛
var
أنا ، ي: عدد صحيح ؛
يبدأ
J: = olst.count ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
tobj (olst.items [i]^). أظهر: = صحيح ؛
نهاية؛
رسم
نهاية؛
دالة tfrm_tree.getpobj (معرف: سلسلة): مؤشر ؛
var
أنا ، ي: عدد صحيح ؛
يبدأ
النتيجة: = لا شيء ؛
J: = olst.count ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
إذا tobj (olst.items [i]^). objid = id ثم
يبدأ
النتيجة: = olst.items [i] ؛
استراحة؛
نهاية؛
نهاية؛
نهاية؛
دالة tfrm_tree.clickobj (x ، y: integer): String ؛
var
أنا ، ي: عدد صحيح ؛
يبدأ
النتائج: = '' ؛
J: = olst.count ؛
setSelected (x ، y) ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
if (tobj (olst.items [i]^). centerx-10 <x) و (tobj (olst.items [i]^). centerx+10> x)
و (tobj (olst.items [i]^). centery-10 <y) و (tobj (olst.items [i]^). centery+10> y) ثم)
يبدأ
label1.caption: = 'انقر معرف العقدة:'+ tobj (olst.items [i]^). objid ؛
النتيجة: = tobj (olst.items [i]^). objid ؛
استراحة؛
نهاية؛
نهاية؛
نهاية؛
الإجراء tfrm_tree.button6click (المرسل: tobject) ؛
يبدأ
Toolno: = 4 ؛
نهاية؛
الإجراء tfrm_tree.moveobj (dx ، dy: integer) ؛
var
أنا ، ي: عدد صحيح ؛
يبدأ
J: = olst.count ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
tobj (olst.items [i]^). centerx: = tobj (olst.items [i]^). centerx+dx ؛
tobj (olst.items [i]^). centery: = tobj (olst.items [i]^). centery+dy ؛
نهاية؛
// Drawfull ؛
نهاية؛
الإجراء tfrm_tree.paintbox1mouseup (المرسل: tobject ؛ زر: tmouseButton ؛
Shift: TshiftState ؛
يبدأ
TOURNO CASE من
4:
يبدأ
إذا تم النقر فوقه ثم
يبدأ
endx: = x ؛
endy: = y ؛
MoveObj ((endx-beginx) ، (endy-beginy)) ؛
نهاية؛
نقر: = خطأ ؛
نهاية؛
5:
يبدأ
نقر: = خطأ ؛
نهاية؛
نهاية؛
نهاية؛
الإجراء tfrm_tree.paintbox1mousemove (المرسل: tobject ؛ Shift: TshiftState ؛
x ، y: عدد صحيح) ؛
يبدأ
إذا (النقر) ثم
يبدأ
TOURNO CASE من
4:
يبدأ
MoveObj ((x-beginx) ، (y-beginy)) ؛
BeginX: = x ؛ starty: = y ؛
رسم
نهاية؛
5:
يبدأ
movenode ((x-beginx) ، (y-beginy) ، getSelect.Objid) ؛
movelocal ((x-beginx) ، (y-beginy)) ؛
BeginX: = x ؛ starty: = y ؛
رسم
نهاية؛
نهاية؛
نهاية؛
نهاية؛
الإجراء tfrm_tree.fadestream1click (المرسل: tobject) ؛
var
Selfile: سلسلة.
المنقص: سلسلة.
Curobj: Tobj ؛
lstdate: tinifile32 ؛
أنا ، ي: عدد صحيح ؛
يبدأ
J: = olst.count ؛
إذا كان حفظه 1.execute ثم
يبدأ
Selfile: = SaveAdialog1.filename ؛
lstdate: = tinifile32.create (selfile+'. dat') ؛
lstdate.writeInteger ('title' ، 'num' ، j) ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
curobj: = tobj (olst.items [i]^) ؛
curid: = curobj.objid ؛
lstdate.writeString (curid ، 'objid' ، curobj.objid) ؛
lstdate.writeInteger (curid ، 'centerx' ، curobj.centerx) ؛
lstdate.writeInteger (curid ، 'centery' ، curobj.centery) ؛
lstdate.writeInteger (curid ، 'typeno' ، curobj.typeno) ؛
lstdate.writeBool (curid ، 'selection' ، curobj.selected) ؛
lstdate.writeString (curid ، 'fnode' ، curobj.fnode) ؛
lstdate.writeBool (curid ، "أظهرت" ، curobj.showed) ؛
نهاية؛
نهاية؛
نهاية؛
الإجراء TFRM_TREE.RANDOMRANDOMSELECTION1CLICK (المرسل: tobject) ؛
var
Selfile: سلسلة.
// Curid: String ؛
lstdate: tinifile32 ؛
أنا ، ي: عدد صحيح ؛
يبدأ
إذا opendialog1.execute ثم
يبدأ
Selfile: = opendialog1.filename ؛
نقر: = خطأ ؛
paintbox1.canvas.fillrect (rect (0،0 ، paintbox1.width ، paintbox1.hight)) ؛
olst.clear ؛
الجذر: = صحيح ؛
selid: = '' ؛
searilid: = 0 ؛
lstdate: = tinifile32.create (selfile) ؛
J: = lstdate.ReadInteger ('title' ، 'num' ، 0) ؛
لأني: = 1 إلى j تفعل
يبدأ
AddObj (lstdate.readstring (inttostr (i) ، 'objid' ، '') ، lstdate.readinteger (inttostr (i) ، 'centerx' ، 0) ، lstdate.readinteger (inttost (i) ، 'centery' ، 0) ، lstdate.readinteger (inttostr (i) ، 'typeno' ، 0) ، lstdate.readbool (inttostr (i) ، 'selection' ، true) ، lstdate.readstring (inttostr (i) ، 'fnode' ، '') ، lstdate.readbool (inttostr (i) ، 'arnow' ، true)) ؛
نهاية؛
searilid: = j ؛
الجذر: = خطأ ؛
رسم
نهاية؛
نهاية؛
الإجراء tfrm_tree.button7click (المرسل: tobject) ؛
يبدأ
Toolno: = 5 ؛
نهاية؛
الإجراء tfrm_tree.movenode (dx ، dy: integer ؛ id: string) ؛
var
أنا ، ي: عدد صحيح ؛
curobj:^tobj ؛
يبدأ
J: = olst.count ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
إذا tobj (olst.items [i]^). fnode = id ثم
يبدأ
curobj: = getPobj (tobj (olst.items [i]^). objid) ؛
curobj^.centerx: = curobj^.centerx+dx ؛
curobj^.centery: = curobj^.centery+dy ؛
movenode (dx ، dy ، curobj^.Objid) ؛
نهاية؛
نهاية؛
نهاية؛
الإجراء tfrm_tree.movelocal (dx ، dy: integer) ؛
var
أنا ، ي: عدد صحيح ؛
// curobj: tobj ؛
يبدأ
J: = olst.count ؛
لأني: = 0 إلى J-1 تفعل
يبدأ
إذا tobj (olst.items [i]^). تم اختياره ثم
يبدأ
tobj (olst.items [i]^). centerx: = tobj (olst.items [i]^). centerx+dx ؛
tobj (olst.items [i]^). centery: = tobj (olst.items [i]^). centery+dy ؛
استراحة؛
نهاية؛
نهاية؛
نهاية؛
نهاية.