Siempre he oído que el lienzo en Delphi es simple y conveniente de usar. Ahora uso el lienzo para implementar una representación gráfica de un mecanismo de árbol simple. El sistema admite la selección de nodos, el movimiento, el ahorro de árboles, la apertura de árboles, etc. La recursión y los punteros se usan para conveniencia.
El programa está escrito en un desastre, bienvenido a comunicarse: [email protected]
El código fuente es el siguiente:
Unidad u_tree;
interfaz
usos
Windows, mensajes, sysutils, clases, gráficos, controles, formularios, diálogos,
Extctrls, stdctrls, jpeg, menús, inifiles32;
tipo
Tobj = registro
Objid: cadena;
CenterX: entero;
Centery: entero;
Typeno: entero;
Seleccionado: booleano;
Fnode: cadena;
mostrado: booleano;
fin;
TFrm_tree = class (tForm)
Panel1: Tpanel;
Paintbox1: tpaintbox;
Panel2: Tpanel;
Etiqueta1: tlabel;
Button2: tbutton;
Botón 1: tbutton;
Button3: tbutton;
Button4: tbutton;
Button5: tbutton;
Button6: tbutton;
Mainmenu1: tmainmenu;
FADESTREAM1: TMENITEM;
RandomRandomSelection1: tmenuitem;
Savedialog1: tsavedialog;
Opendialog1: topendialog;
Button7: tbutton;
Procedimiento Paintbox1MousEdown (remitente: Tobject; botón: TMouseButton;
Cambio: tshiftstate;
procedimiento formulcreate (remitente: tobject);
procedimiento botón1Click (remitente: tobject);
procedimiento Button2Click (remitente: tobject);
Procedimiento Paintbox1Paint (remitente: tobject);
procedimiento Button3Click (remitente: tobject);
Button de procedimiento4Click (remitente: tobject);
procedimiento Button5Click (remitente: tobject);
Procedimiento Button6Click (remitente: tobject);
Procedimiento Paintbox1MouseUp (remitente: tobject; botón: tmouseButton;
Cambio: tshiftstate;
Procedimiento Paintbox1MouseMove (remitente: Tobject; Shift: TshiftState; X,
Y: entero);
procedimiento fadeStream1Click (remitente: tobject);
procedimiento randomRandomSelection1Click (remitente: tobject);
procedimiento Button7Click (remitente: tobject);
Privado
{Declaraciones privadas}
ToolnO: entero;
beginx, beginy, endx, endy: entero;
Haga clic en: booleano;
Olst: tlist;
Selid: String;
Raíz: booleano;
Searilid: entero;
procedimiento DrawNode (id: String);
procedimiento addobj (id: string; x, y: entero; typeno: entero; seleccionado: booleano; fnode: string; mostrado: boolean);
function getobj (id: string): tobj;
función getPobj (id: string): puntero;
función getSelect: tobj;
la función ha eliminado: booleano;
función clickobj (x, y: entero): string;
procedimiento dibujado;
procedimiento setSelected (x, y: entero);
función setShowsel (x, y: entero): tobj;
procedimiento setFnode (id: string);
procedimiento setCNode (id: string);
procedimiento desplegado;
procedimiento ClearCanvas;
procedimiento MoveBJ (DX, DY: Integer);
procedimiento Movenode (dx, dy: entero; id: string);
procedimiento movelocal (dx, dy: entero);
//procedimiento
público
{Declaraciones públicas}
fin;
varilla
Frm_tree: tFrm_tree;
Implementación
{$ R *.dfm}
{TForm1}
procedimiento tFRM_Tree.Drawnode (id: string);
varilla
OldBrushColor: tcolor;
Oldpencolor: tcolor;
OBJ: TOBJ;
Comenzar
obj: = getobj (id);
con frm_tree.paintbox1.canvas do
Comenzar
Si obj.swe -way entonces
Comenzar
OldBrushColor: = Brush.color;
Oldpencolor: = Pen.color;
si se selecciona entonces entonces
Comenzar
Pen.Color: = RGB (255,0,0);
fin;
Brush.color: = $ 00ff31ff;
Elipse (obj.centerx-10, obj.centery-10, obj.centerx+10, obj.centery+10);
Pen.Color: = $ 00ff31ff;
Si obj.typeno> 0 entonces
Comenzar
Moveto (obj.centerx, obj.centery);
lineto (getobj (obj.fnode) .centerx, getobj (obj.fnode) .centery);
fin;
Pen.Color: = Oldpencolor;
Brush.Color: = OldBrushColor;
fin;
fin;
fin;
Procedimiento TFRM_Tree.Paintbox1MousEdown (remitente: tobject;
Botón: TMouseButton;
varilla
CUROBJ: TOBJ;
Comenzar
if botón = mbleft entonces
Comenzar
herramienta de casos no de
1:
Comenzar
Searilid: = searilid+1;
Si la raíz entonces
Comenzar
Addobj (intToStr (searilid), x, y, 0, falso, '', verdadero);
DrawNode (intToStr (searilid));
Raíz: = falso;
fin
demás
Comenzar
Si ha seleccionado entonces
Comenzar
Addobj (intToStr (searilid), x, y, 1, falso, getSelect.objid, verdadero);
DrawNode (intToStr (searilid));
etiqueta1.caption: = 'agregue el nodo, id:'+intToStr (searilid);
fin
demás
Comenzar
etiqueta1.caption: = '¡Seleccione el nodo!';
fin;
fin;
fin;
2:
Comenzar
setSelected (x, y);
fin;
3: // Ver
Comenzar
// ClearCanvas;
CUROBJ: = setShowsel (x, y);
Si Curobj.objid <> '' entonces
Comenzar
claro;
CUROBJ: = setShowsel (x, y);
CUROBJ.showed: = True;
setfnode (curobj.fnode);
setCNode (Curobj.objid);
Dibujado;
fin;
fin;
4: // móvil
Comenzar
Si clickobj (x, y) <> '' luego hizo clic: = true;
beginx: = x;
beginy: = y;
fin;
5:
Comenzar
Si clickobj (x, y) <> '' luego hizo clic: = true;
beginx: = x;
beginy: = y;
fin;
fin;
fin
demás
Comenzar
setSelected (x, y);
fin;
fin;
procedimiento tFrm_tree.FormCreate (remitente: tobject);
Comenzar
Olst: = tlist.create;
Herramienta no: = 0;
Raíz: = verdadero;
Selid: = '';
Searilid: = 0;
Haga clic en: = falso;
con pintbox1.canvas do
Comenzar
Brush.color: = clwhite;
Fillrect (Rect (0,0, Paintbox1.Width, Paintbox1.Height));
fin;
fin;
procedimiento tFrm_tree.Button1Click (remitente: tobject);
Comenzar
Herramienta no: = 1;
fin;
procedimiento tFrm_tree.Button2Click (remitente: tobject);
Comenzar
Herramienta no: = 2;
fin;
procedimiento tFrm_tree.addoBj (id: string; x, y, typeno: integer;
seleccionado: booleano;
varilla
Obj: ^tobj;
Comenzar
nuevo (obj);
obj.objid: = id;
obj.centerx: = x;
obj.centery: = y;
obj.typeno: = typeno;
obj.selected: = seleccionado;
obj.fnode: = fnode;
obj.showed: = mostrado;
Olst.add (obj);
fin;
function tFrm_tree.getObj (id: string): tobj;
varilla
I, J: entero;
Comenzar
j: = olst.count;
para i: = 0 a j-1 do
Comenzar
if tobj (olst.items [i]^). objid = id entonces
Comenzar
Resultado: = tobj (olst.items [i]^);
Romper;
fin;
fin;
fin;
función tFrm_tree.getSelect: tobj;
varilla
I, J: entero;
Comenzar
j: = olst.count;
para i: = 0 a j-1 do
Comenzar
Si Tobj (olst.items [i]^). Seleccionado entonces
Comenzar
Resultado: = tobj (olst.items [i]^);
Romper;
fin;
fin;
fin;
función tFrm_tree.haveselect: boolean;
varilla
I, J: entero;
Comenzar
Resultado: = falso;
j: = olst.count;
para i: = 0 a j-1 do
Comenzar
Si Tobj (olst.items [i]^). Seleccionado entonces
Comenzar
Resultado: = verdadero;
Romper;
fin;
fin;
fin;
procedimiento tFrm_tree.drawfull;
varilla
I, J: entero;
Comenzar
//Paintbox1.canvas.fillrect(rect(0,0,Paintbox1.width,paintbox1.height));
Clearcanvas;
j: = olst.count;
para i: = 0 a j-1 do
Comenzar
DrawNode (tobj (olst.Items [i]^). Objid);
fin;
fin;
procedimiento tFrm_tree.paintbox1Paint (remitente: tobject);
Comenzar
Dibujado;
fin;
procedimiento tfrm_tree.setselected (x, y: entero);
varilla
I, J: entero;
Comenzar
j: = olst.count;
para i: = 0 a j-1 do
Comenzar
Tobj (olst.items [i]^). Seleccionado: = falso;
if (tobj (olst.items [i]^). CenterX-10 <x) y (tobj (olst.items [i]^). CenterX+10> x)
y (tobj (olst.Items [i]^). Centery-10 <y) y (tobj (olst.items [i]^). Centery+10> y) Entonces
Comenzar
Tobj (olst.items [i]^). Seleccionado: = True;
Etiqueta1.caption: = 'seleccionado la identificación del nodo:'+ tobj (olst.items [i]^). Objid;
fin;
fin;
Dibujado;
fin;
procedimiento tFrm_tree.Button3Click (remitente: tobject);
Comenzar
Herramienta no: = 3;
fin;
function tFrm_tree.setShowsel (x, y: entero): tobj;
varilla
I, J: entero;
Comenzar
j: = olst.count;
para i: = 0 a j-1 do
Comenzar
Tobj (olst.items [i]^). Seleccionado: = falso;
if (tobj (olst.items [i]^). CenterX-10 <x) y (tobj (olst.items [i]^). CenterX+10> x)
y (tobj (olst.Items [i]^). Centery-10 <y) y (tobj (olst.items [i]^). Centery+10> y) Entonces
Comenzar
Tobj (olst.items [i]^). Mostró: = verdadero;
Label1.Caption: = 'Mire el nodo ID:'+ tobj (olst.items [i]^). Objid;
Resultado: = tobj (olst.items [i]^);
Romper;
fin;
fin;
fin;
procedimiento tFrm_tree.cLearShowed;
varilla
I, J: entero;
Comenzar
j: = olst.count;
para i: = 0 a j-1 do
Comenzar
Tobj (olst.items [i]^). Mostró: = falso;
fin;
fin;
procedimiento tFrm_tree.setfnode (id: string);
varilla
CUROBJ:^TOBJ;
Comenzar
Si id <> '' entonces
Comenzar
// nuevo (CUROBJ);
CUROBJ: = getPobj (id);
mientras que Curobj^.Typeno = 1 do
Comenzar
CUROBJ^.sHEHED: = verdadero;
curobj: = getPobj (curobj^.fnode);
fin;
CUROBJ^.sHEHED: = verdadero;
// desechar (Curobj);
fin;
fin;
procedimiento tFrm_tree.setCNode (id: string);
varilla
CUROBJ:^TOBJ;
I, J: entero;
Comenzar
// CUROBJ: = getObj (id);
j: = olst.count;
para i: = 0 a j-1 do
Comenzar
if tobj (olst.items [i]^). fnode = id entonces
Comenzar
curobj: = getPobj (tobj (olst.items [i]^). objid);
CUROBJ^.sHEHED: = verdadero;
setCnode (Curobj^.Objid);
fin;
fin;
fin;
procedimiento tFrm_tree.ClearCanvas;
Comenzar
//Paintbox1.canvas
Pintarbox1.canvas.fillrect (rect (0,0, pintarbox1.width, pintarbox1.height));
fin;
procedimiento tFrm_tree.Button4Click (remitente: tobject);
Comenzar
Haga clic en: = falso;
Pintarbox1.canvas.fillrect (rect (0,0, pintarbox1.width, pintarbox1.height));
Olst.clear;
Raíz: = verdadero;
Selid: = '';
Searilid: = 0;
{con pintbox1.canvas do
Comenzar
Pen.Width: = 2;
Pen.Color: = clblack;
Pen.Style: = PSCLear;
Pincel.style:=bssolid;
Brush.color: = clwhite;
Rectángulo (0,0, Paintbox1.Width, Paintbox1.Height);
fin;}
fin;
procedimiento tFrm_tree.Button5Click (remitente: tobject);
varilla
I, J: entero;
Comenzar
j: = olst.count;
para i: = 0 a j-1 do
Comenzar
tobj (olst.items [i]^). Mostró: = verdadero;
fin;
Dibujado;
fin;
función tFrm_tree.getPobj (id: string): pointer;
varilla
I, J: entero;
Comenzar
Resultado: = nil;
j: = olst.count;
para i: = 0 a j-1 do
Comenzar
if tobj (olst.items [i]^). objid = id entonces
Comenzar
Resultado: = olst.Items [i];
Romper;
fin;
fin;
fin;
función tFrm_tree.ClickObj (x, y: entero): string;
varilla
I, J: entero;
Comenzar
Resultados: = '';
j: = olst.count;
setSelected (x, y);
para i: = 0 a j-1 do
Comenzar
if (tobj (olst.items [i]^). CenterX-10 <x) y (tobj (olst.items [i]^). CenterX+10> x)
y (tobj (olst.Items [i]^). Centery-10 <y) y (tobj (olst.items [i]^). Centery+10> y) Entonces
Comenzar
Label1.Caption: = 'Haga clic en la ID del nodo:'+ tobj (olst.items [i]^). Objid;
Resultado: = tobj (olst.items [i]^). Objid;
Romper;
fin;
fin;
fin;
procedimiento tFrm_tree.Button6Click (remitente: tobject);
Comenzar
Herramienta no: = 4;
fin;
procedimiento tFrm_tree.MoveObj (dx, dy: integer);
varilla
I, J: entero;
Comenzar
j: = olst.count;
para i: = 0 a j-1 do
Comenzar
Tobj (olst.items [i]^). CenterX: = tOBJ (olst.items [i]^). Centerx+dx;
Tobj (olst.items [i]^). Centery: = tObj (olst.items [i]^). Centery+dy;
fin;
// dibujado;
fin;
Procedimiento TFRM_Tree.PaintBox1MouseUp (remitente: tobject; botón: tMouseButton;
Cambio: tshiftstate;
Comenzar
herramienta de casos no de
4:
Comenzar
Si se hace clic entonces entonces
Comenzar
endx: = x;
Endy: = y;
MoveBj ((endx-beginx), (endy-beginy));
fin;
Haga clic en: = falso;
fin;
5:
Comenzar
Haga clic en: = falso;
fin;
fin;
fin;
Procedimiento TFRM_Tree.Paintbox1MouseMove (remitente: tobject; shift: tshiftState;
X, y: entero);
Comenzar
if (hacer clic) entonces
Comenzar
Herramienta de casos no
4:
Comenzar
MoveBJ ((X-Beginx), (Y-Beginy));
beginx: = x; beginy: = y;
Dibujado;
fin;
5:
Comenzar
Movenode ((X-Beginx), (Y-Beginy), GetSelect.objid);
Movelocal ((X-Beginx), (Y-Beginy));
beginx: = x; beginy: = y;
Dibujado;
fin;
fin;
fin;
fin;
procedimiento tFrm_tree.fadReMeam1Click (remitente: tobject);
varilla
Selfile: String;
Curido: cadena;
CUROBJ: TOBJ;
lstdate: tinifile32;
I, J: entero;
Comenzar
j: = olst.count;
Si saveDialog1.ExCute entonces
Comenzar
Selfile: = saveDialog1.FileName;
lstdate: = tinifile32.create (selfile+'. dat');
lstdate.WriteInteger ('Título', 'Num', J);
para i: = 0 a j-1 do
Comenzar
curobj: = tobj (olst.Items [i]^);
curido: = curobj.objid;
lstdate.writeString (curido, 'objid', curobj.objid);
lstdate.writeInteger (curido, 'CenterX', Curobj.Centerx);
lstdate.writeInteger (curido, 'Centery', Curobj.Centery);
lstdate.writeInteger (curido, 'typeno', curobj.typeno);
lstdate.writbool (curido, 'seleccionado', curobj.selected);
lstdate.writeString (curido, 'fnode', curobj.fnode);
lstdate.writbool (curido, 'mostrado', curobj.showed);
fin;
fin;
fin;
procedimiento tFrm_tree.randomRandomSelection1Click (remitente: tobject);
varilla
Selfile: String;
// curido: cadena;
lstdate: tinifile32;
I, J: entero;
Comenzar
Si opendialog1.ExCute entonces
Comenzar
Selfile: = Opendialog1.FileName;
Haga clic en: = falso;
Pintarbox1.canvas.fillrect (rect (0,0, pintarbox1.width, pintarbox1.height));
Olst.clear;
Raíz: = verdadero;
Selid: = '';
Searilid: = 0;
lstdate: = tinifile32.create (selfile);
j: = lstdate.readinteger ('title', 'num', 0);
para i: = 1 a j do
Comenzar
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), 'seleccionado', true), lstdate.readString (intToStr (i), 'fNode', ''), lstdate.readbool (intToStr (i), 'Mostrar', true));
fin;
Searilid: = j;
Raíz: = falso;
Dibujado;
fin;
fin;
procedimiento tFrm_tree.Button7Click (remitente: tobject);
Comenzar
Herramienta no: = 5;
fin;
procedimiento tFrm_tree.movenode (dx, dy: integer; id: string);
varilla
I, J: entero;
CUROBJ:^TOBJ;
Comenzar
j: = olst.count;
para i: = 0 a j-1 do
Comenzar
if tobj (olst.items [i]^). fnode = id entonces
Comenzar
curobj: = getPobj (tobj (olst.items [i]^). objid);
CUROBJ^.CENTERX: = CUROBJ^.CENTERX+DX;
CUROBJ^. Centería: = Curobj^. Centery+Dy;
Movenode (dx, dy, curobj^.objid);
fin;
fin;
fin;
procedimiento tFrm_tree.movelocal (dx, dy: integer);
varilla
I, J: entero;
// CUROBJ: TOBJ;
Comenzar
j: = olst.count;
para i: = 0 a j-1 do
Comenzar
Si Tobj (olst.items [i]^). Seleccionado entonces
Comenzar
tobj (olst.items [i]^). CenterX: = tOBJ (olst.items [i]^). Centerx+dx;
tobj (olst.items [i]^). Centery: = tObj (olst.items [i]^). Centery+dy;
Romper;
fin;
fin;
fin;
fin.