Ich habe immer gehört, dass Leinwand in Delphi einfach und bequem zu bedienen ist. Jetzt verwende ich die Leinwand, um eine grafische Darstellung eines einfachen Baummechanismus zu implementieren. Das System unterstützt Knotenauswahl, Bewegung, Sparen von Bäumen, Öffnen von Bäumen usw. Rekursion und Zeiger werden für die Bequemlichkeit verwendet.
Das Programm ist in einem Chaos geschrieben, Willkommen zu kommunizieren: [email protected]
Der Quellcode lautet wie folgt:
Einheit u_tree;
Schnittstelle
Verwendung
Windows, Nachrichten, Systeme, Klassen, Grafiken, Steuerelemente, Formulare, Dialoge,
Extctrls, Stdctrls, JPEG, Menüs, Inifiles32;
Typ
Tobj = record
Objid: String;
CenterX: Ganzzahl;
Zentrum: Ganzzahl;
Typeno: Ganzzahl;
Ausgewählt: Boolean;
Fnode: String;
gezeigt: boolean;
Ende;
Tfrm_tree = class (tform)
Panel1: tpanel;
Paintbox1: TPaintbox;
Panel2: tpanel;
Label1: Tlabel;
Button2: Tbutton;
Button1: Tbutton;
Button3: Tbutton;
Button4: Tbutton;
Button5: Tbutton;
Button6: Tbutton;
Mainmenu1: Tmainmenu;
Fadestream1: Tmenuitem;
RandomRandomSelection1: tMenuitem;
Savedialog1: Tsavedialog;
Opendialog1: Topendialog;
Button7: Tbutton;
Prozedur Paintbox1MouseDown (Absender: Tobject; Taste: tmouseButton;
Verschiebung: TShiftState; x, y: Ganzzahl);
Prozedur Formcreate (Absender: Tobject);
PROCEDURE Taste1Click (Absender: Tobject);
PROCEDURE Button2Click (Absender: Tobject);
Prozedur Paintbox1Paint (Absender: Tobject);
PROCEDURE Button3Click (Absender: Tobject);
PROCEDURE Button4Click (Absender: Tobject);
PROCEDURE Taste5Click (Absender: Tobject);
PROCEDURE TAFT6CLICK (Absender: Tobject);
Prozedur Paintbox1MouseUp (Absender: Tobject; Taste: TMouseButton;
Verschiebung: TShiftState; x, y: Ganzzahl);
Prozedur Paintbox1Mousemove (Absender: Tobject; Verschiebung: TShiftstate; x,
Y: Ganzzahl);
Prozedur Fadestream1Click (Absender: Tobject);
Verfahren RandomRandomSelection1Click (Absender: Tobject);
PROCEDURE Button7Click (Absender: Tobject);
Privat
{Private Deklarationen}
Toolno: Ganzzahl;
beginx, beginy, endx, Endy: Ganzzahl;
geklickt: boolean;
OLST: TLIST;
Selid: String;
Wurzel: Boolean;
Searilid: Ganzzahl;
Prozedur Drawnode (ID: String);
Prozedur Addobj (ID: String; x, y: Integer; typeno: Integer; ausgewählt: boolean; fnode: String; gezeigt: boolean);
Funktion getObj (ID: String): Tobj;
Funktion getPobj (ID: String): Zeiger;
Funktion getSelect: Tobj;
Funktion HAVELECT: boolean;
Funktion ClickObj (x, y: Ganzzahl): String;
Verfahren drawul;
Verfahren setSelected (x, y: Integer);
Funktionsetshowsel (x, y: Ganzzahl): Tobj;
procedure setfnode (id: string);
Prozedur setCnode (ID: String);
Verfahrenslöser;
Verfahren Clearcanvas;
Prozedur MoveObj (DX, DY: Integer);
Prozedur Movenode (DX, DY: Integer; ID: String);
Prozedur Movelocal (DX, DY: Integer);
//Verfahren
öffentlich
{Öffentliche Erklärungen}
Ende;
var
FRM_TREE: TFRM_TREE;
Durchführung
{$ R *.dfm}
{Tform1}
Prozedur TFRM_TREE.DRAWNODE (ID: String);
var
OldBrushColor: Tcolor;
OldPencolor: Tcolor;
OBJ: Tobj;
Beginnen
obj: = getObj (id);
mit frm_tree.paintbox1.canvas do
Beginnen
Wenn obj.hows dann
Beginnen
OldBrushColor: = Pinsel.Color;
OldPencolor: = Pen.Color;
Wenn obj.selected dann
Beginnen
Pen.Color: = RGB (255,0,0);
Ende;
Binse.Color: = $ 00ff31ff;
Ellipse (Obj.Centerx-10, Obj.Centery-10, Obj.Centerx+10, Obj.Centery+10);
Pen.Color: = $ 00ff31ff;
Wenn obj.typeno> 0 dann
Beginnen
MoveTo (Obj.Centerx, Obj.Centery);
lineto (getObj (obj.fnode) .Centerx, getObj (obj.fnode) .Centery);
Ende;
Pen.Color: = OldPencolor;
Pinsel.Color: = OldBrushColor;
Ende;
Ende;
Ende;
Prozedur tfrm_tree.paintbox1MouseDown (Absender: Tobject;
Taste: TMouseButton;
var
Curobj: Tobj;
Beginnen
Wenn Taste = Mbleft dann
Beginnen
Case tolno von
1:
Beginnen
Searilid: = Searilid+1;
Wenn Wurzel dann
Beginnen
Addobj (InttoStr (Searilid), x, y, 0, falsch, '', wahr);
Drawnode (InttoStr (Searilid));
Wurzel: = falsch;
Ende
anders
Beginnen
Wenn HaveSelect dann
Beginnen
Addobj (InttoStr (Searilid), x, y, 1, false, getSelect.objid, true);
Drawnode (InttoStr (Searilid));
Label1.Caption: = 'Fügen Sie den Knoten hinzu, id:'+inttostr (Searilid);
Ende
anders
Beginnen
Label1.Caption: = 'Bitte wählen Sie den Knoten aus!';
Ende;
Ende;
Ende;
2:
Beginnen
setSelected (x, y);
Ende;
3: // anzeigen
Beginnen
// Clearcanvas;
curobj: = setShowsel (x, y);
Wenn curobj.objid <> '' dann
Beginnen
Clearshowed;
curobj: = setShowsel (x, y);
curobj.showed: = true;
setfnode (curobj.fnode);
setCnode (curobj.objid);
Nutzfür;
Ende;
Ende;
4: // mobil
Beginnen
Wenn ClickObj (x, y) <> '' '' 'klickte: = true;
beginx: = x;
beginy: = y;
Ende;
5:
Beginnen
Wenn ClickObj (x, y) <> '' '' 'klickte: = true;
beginx: = x;
beginy: = y;
Ende;
Ende;
Ende
anders
Beginnen
setSelected (x, y);
Ende;
Ende;
Prozedur tfrm_tree.formcreate (Absender: tobject);
Beginnen
Olst: = tlist.create;
Toolno: = 0;
Wurzel: = wahr;
Selid: = '';
Searilid: = 0;
geklickt: = false;
mit Paintbox1.Canvas
Beginnen
Pinsel.Color: = clwhite;
FILLRECT (RECT (0,0, Paintbox1.Width, Paintbox1.Height));
Ende;
Ende;
Prozedur tfrm_tree.button1click (Absender: tobject);
Beginnen
Toolno: = 1;
Ende;
procedure tfrm_tree.button2click (Absender: tobject);
Beginnen
Toolno: = 2;
Ende;
Prozedur TFRM_TREE.ADDOBJ (ID: String; x, y, typeno: Integer;
ausgewählt: boolean;
var
Obj: ^tobj;
Beginnen
neu (obj);
obj.objid: = id;
Obj.Centerx: = x;
Obj.Centery: = y;
obj.typeno: = typeno;
OBJ.Selected: = ausgewählt;
obj.fnode: = fnode;
OBJ.Showed: = gezeigt;
Olst.add (obj);
Ende;
Funktion tfrm_tree.getObj (ID: String): Tobj;
var
Ich, J: Ganzzahl;
Beginnen
J: = olst.count;
für i: = 0 bis j-1 tun
Beginnen
Wenn tobj (olst.items [i]^). objid = id dann
Beginnen
Ergebnis: = tobj (Olst.Items [i]^);
Brechen;
Ende;
Ende;
Ende;
Funktion tfrm_tree.getSelect: Tobj;
var
Ich, J: Ganzzahl;
Beginnen
J: = olst.count;
für i: = 0 bis j-1 tun
Beginnen
Wenn tobj (olst.items [i]^). Ausgewählt dann
Beginnen
Ergebnis: = tobj (Olst.Items [i]^);
Brechen;
Ende;
Ende;
Ende;
Funktion tfrm_tree.haveSelect: boolean;
var
Ich, J: Ganzzahl;
Beginnen
Ergebnis: = falsch;
J: = olst.count;
für i: = 0 bis j-1 tun
Beginnen
Wenn tobj (olst.items [i]^). Ausgewählt dann
Beginnen
Ergebnis: = wahr;
Brechen;
Ende;
Ende;
Ende;
Prozedur tfrm_tree.drawful;
var
Ich, J: Ganzzahl;
Beginnen
//Paintbox1.canvas.FillRect(Rect(0,0,Paintbox1.Width,Paintbox1.Height));
Clearcanvas;
J: = olst.count;
für i: = 0 bis j-1 tun
Beginnen
Gezeichnet (tobj (Olst.Items [i]^). Objid);
Ende;
Ende;
Prozedur tfrm_tree.paintbox1paint (Absender: tobject);
Beginnen
Nutzfür;
Ende;
Prozedur TFRM_TREE.SetSelected (x, y: Integer);
var
Ich, J: Ganzzahl;
Beginnen
J: = olst.count;
für i: = 0 bis j-1 tun
Beginnen
Tobj (Olst.Items [i]^). Ausgewählt: = false;
if (tobj (olst.items [i]^). Centerx-10 <x) und (tobj (Olst.items [i]^). Centerx+10> x)
und (tobj (Olst.items [i]^). Centery-10 <y) und (tobj (Olst.items [i]^). Centery+10> Y) dann
Beginnen
Tobj (Olst.Items [i]^). Ausgewählt: = true;
Label1.Caption: = 'Ausgewählt die Knoten -ID:'+ tobj (Olst.Items [i]^). Objid;
Ende;
Ende;
Nutzfür;
Ende;
procedure tfrm_tree.button3click (Absender: tobject);
Beginnen
Toolno: = 3;
Ende;
Funktion tfrm_tree.setshowsel (x, y: Integer): Tobj;
var
Ich, J: Ganzzahl;
Beginnen
J: = olst.count;
für i: = 0 bis j-1 tun
Beginnen
Tobj (Olst.Items [i]^). Ausgewählt: = false;
if (tobj (olst.items [i]^). Centerx-10 <x) und (tobj (Olst.items [i]^). Centerx+10> x)
und (tobj (Olst.items [i]^). Centery-10 <y) und (tobj (Olst.items [i]^). Centery+10> Y) dann
Beginnen
Tobj (Olst.Items [i]^). Zeigt: = wahr;
Label1.Caption: = 'Sehen Sie die Knoten -ID an:'+ tobj (Olst.Items [i]^). Objid;
Ergebnis: = tobj (Olst.Items [i]^);
Brechen;
Ende;
Ende;
Ende;
Prozedur tfrm_tree.clearshowed;
var
Ich, J: Ganzzahl;
Beginnen
J: = olst.count;
für i: = 0 bis j-1 tun
Beginnen
Tobj (Olst.Items [i]^). Zeigte: = falsch;
Ende;
Ende;
procedure tfrm_tree.setfnode (id: string);
var
Curobj:^Tobj;
Beginnen
Wenn ID <> '' '' dann
Beginnen
// neu (Curobj);
Curobj: = getPobj (id);
während curobj^.typeno = 1 tun
Beginnen
curobj^.showed: = true;
curobj: = getPobj (curobj^.fnode);
Ende;
curobj^.showed: = true;
// dispose (curobj);
Ende;
Ende;
Prozedur TFRM_TREE.SETCNODE (ID: String);
var
Curobj:^Tobj;
Ich, J: Ganzzahl;
Beginnen
// curobj: = getObj (id);
J: = olst.count;
für i: = 0 bis j-1 tun
Beginnen
Wenn tobj (olst.items [i]^). fnode = id dann
Beginnen
curobj: = getPobj (tobj (Olst.Items [i]^). Objid);
curobj^.showed: = true;
setCnode (curobj^.objid);
Ende;
Ende;
Ende;
Prozedur tfrm_tree.clearcanvas;
Beginnen
//Paintbox1.canvas
Paintbox1.Canvas.FillRect (RECT (0,0, Paintbox1.Width, Paintbox1.Height));
Ende;
procedure tfrm_tree.button4click (Absender: tobject);
Beginnen
geklickt: = false;
Paintbox1.Canvas.FillRect (RECT (0,0, Paintbox1.Width, Paintbox1.Height));
Olst.clear;
Wurzel: = wahr;
Selid: = '';
Searilid: = 0;
{mit Paintbox1.canvas tun
Beginnen
Pen.width: = 2;
Pen.Color: = ClBlack;
pen.style: = psclear;
Pinsel.Style :=bSsolid;
Pinsel.Color: = clwhite;
Rechteck (0,0, Paintbox1.Width, Paintbox1.Height);
Ende;}
Ende;
procedure tfrm_tree.button5click (Absender: tobject);
var
Ich, J: Ganzzahl;
Beginnen
J: = olst.count;
für i: = 0 bis j-1 tun
Beginnen
tobj (Olst.Items [i]^). Zeigt: = wahr;
Ende;
Nutzfür;
Ende;
Funktion tfrm_tree.getPOBJ (ID: String): Zeiger;
var
Ich, J: Ganzzahl;
Beginnen
Ergebnis: = nil;
J: = olst.count;
für i: = 0 bis j-1 tun
Beginnen
Wenn tobj (olst.items [i]^). objid = id dann
Beginnen
Ergebnis: = olst.items [i];
Brechen;
Ende;
Ende;
Ende;
Funktion tfrm_tree.clickobj (x, y: Integer): String;
var
Ich, J: Ganzzahl;
Beginnen
Ergebnisse: = '';
J: = olst.count;
setSelected (x, y);
für i: = 0 bis j-1 tun
Beginnen
if (tobj (olst.items [i]^). Centerx-10 <x) und (tobj (Olst.items [i]^). Centerx+10> x)
und (tobj (Olst.items [i]^). Centery-10 <y) und (tobj (Olst.items [i]^). Centery+10> Y) dann
Beginnen
Label1.Caption: = 'Klicken Sie auf die Knoten -ID:'+ tobj (Olst.Items [i]^). Objid;
Ergebnis: = tobj (Olst.items [i]^). Objid;
Brechen;
Ende;
Ende;
Ende;
Prozedur tfrm_tree.button6click (Absender: tobject);
Beginnen
Toolno: = 4;
Ende;
Prozedur TFRM_TREE.MOVEOBJ (DX, DY: Integer);
var
Ich, J: Ganzzahl;
Beginnen
J: = olst.count;
für i: = 0 bis j-1 tun
Beginnen
Tobj (Olst.Items [i]^). CenterX: = Tobj (Olst.Items [i]^). Centerx+dx;
Tobj (Olst.Items [i]^).
Ende;
// drawful;
Ende;
Prozedur tfrm_tree.paintbox1MouseUp (Absender: Tobject; Taste: TMouseButton;
Verschiebung: TShiftState; x, y: Ganzzahl);
Beginnen
Case tolno von
4:
Beginnen
Wenn klicken
Beginnen
endx: = x;
endy: = y;
moveObj ((endx-beginx), (endy-beginy));
Ende;
geklickt: = false;
Ende;
5:
Beginnen
geklickt: = false;
Ende;
Ende;
Ende;
Prozedur TFRM_TREE.PAINTBOX1MOUSEMOVE (Absender: Tobject; Shift: TShiftState;
X, y: Ganzzahl);
Beginnen
Wenn (geklickt) dann
Beginnen
Case tolno von
4:
Beginnen
moveObj ((x-beginx), (y-beginie));
beginx: = x; beginy: = y;
Nutzfür;
Ende;
5:
Beginnen
movenode ((x-beginx), (y-beginie), getSelect.objid);
movelocal ((x-beginx), (y-beginie));
beginx: = x; beginy: = y;
Nutzfür;
Ende;
Ende;
Ende;
Ende;
Prozedur TFRM_TREE.FADESTREAM1CLICK (Absender: Tobject);
var
Selfile: String;
Curid: String;
Curobj: Tobj;
lstdate: Tinifile32;
Ich, J: Ganzzahl;
Beginnen
J: = olst.count;
Wenn retteteialog1.execute dann
Beginnen
selfile: = savedialog1.filename;
lstdate: = Tinifile32.create (selfile+'. dat');
lstdate.writeInteger ('title', 'num', j);
für i: = 0 bis j-1 tun
Beginnen
curobj: = tobj (Olst.Items [i]^);
curid: = curobj.objid;
lstdate.writestring (curid, 'objid', curobj.objid);
lstdate.writeIneger (curid, 'centerx', curobj.Centerx);
lstdate.writeIneger (curid, 'centery', curobj.centery);
lstdate.writeInteger (curid, 'typeno', curobj.typeno);
lstdate.writeBool (curid, "ausgewählt", curobj.selected);
lstdate.writestring (curid, 'fnode', curobj.fnode);
lstdate.writeBool (curid, "gezeigt", curobj.showed);
Ende;
Ende;
Ende;
Prozedur TFRM_TREE.RANDOMRANDOMSelection1Click (Absender: Tobject);
var
Selfile: String;
// curid: String;
lstdate: Tinifile32;
Ich, J: Ganzzahl;
Beginnen
Wenn opendialog1.execute dann
Beginnen
selfile: = opendialog1.filename;
geklickt: = false;
Paintbox1.Canvas.FillRect (RECT (0,0, Paintbox1.Width, Paintbox1.Height));
Olst.clear;
Wurzel: = wahr;
Selid: = '';
Searilid: = 0;
lstdate: = Tinifile32.create (selfile);
J: = lstdate.readinteger ('title', 'num', 0);
für i: = 1 bis j tun
Beginnen
Addobj (lstdate.readstring (inttostr (i), 'objid', ''), lstdate.readinteger (inttostr (i), 'centerx', 0), lstdate.readinteger (inttostr (i), 'centery', 0) , lstdate.readinteger (inttostr (i), 'typeno', 0), lstdate.readbool (inttostr (i), 'ausgewählt', true), lstdate.readstring (inttostr (i), 'fnode', ''), lstdate.readbool (inttostr (i), 'gezeigt', wahr));
Ende;
Searilid: = j;
Wurzel: = falsch;
Nutzfür;
Ende;
Ende;
Prozedur tfrm_tree.button7click (Absender: tobject);
Beginnen
Toolno: = 5;
Ende;
procedure tfrm_tree.movenode (dx, dy: Integer; id: string);
var
Ich, J: Ganzzahl;
Curobj:^Tobj;
Beginnen
J: = olst.count;
für i: = 0 bis j-1 tun
Beginnen
Wenn tobj (olst.items [i]^). fnode = id dann
Beginnen
curobj: = getPobj (tobj (Olst.Items [i]^). Objid);
curobj^.Centerx: = curobj^.Centerx+dx;
curobj^.Centery: = curobj^.Centery+dy;
movenode (dx, dy, curobj^.objid);
Ende;
Ende;
Ende;
procedure tfrm_tree.movelocal (DX, DY: Integer);
var
Ich, J: Ganzzahl;
// Curobj: Tobj;
Beginnen
J: = olst.count;
für i: = 0 bis j-1 tun
Beginnen
Wenn tobj (olst.items [i]^). Ausgewählt dann
Beginnen
tobj (Olst.Items [i]^). CenterX: = Tobj (Olst.Items [i]^). Centerx+dx;
tobj (Olst.Items [i]^).
Brechen;
Ende;
Ende;
Ende;
Ende.