Advertisement
Guest User

Untitled

a guest
May 15th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 9.44 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   Buttons, ExtCtrls, StdCtrls, XPMan, Menus;
  8.  
  9. type
  10.   TMainForm = class(TForm)
  11.     SBNode: TSpeedButton;
  12.     SBLine: TSpeedButton;
  13.     SBStart: TSpeedButton;
  14.     SBFinish: TSpeedButton;
  15.     SBPath: TSpeedButton;
  16.     SBClear: TSpeedButton;
  17.     MemoSolution: TMemo;
  18.     LbSolution: TLabel;
  19.     LbDistance: TLabel;
  20.     EdDistance: TEdit;
  21.     LbStart: TLabel;
  22.     EdStart: TEdit;
  23.     EdFinish: TEdit;
  24.     LbFinish: TLabel;
  25.     XPManifest: TXPManifest;
  26.     MainMenu: TMainMenu;
  27.     mmiHelp: TMenuItem;
  28.     mmiAbout: TMenuItem;
  29.     Image: TImage;
  30.     LbGraph: TLabel;
  31.     procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  32.     Y: Integer);
  33.     procedure SBNodeClick(Sender: TObject);
  34.     procedure ImageMouseUp(Sender: TObject; Button: TMouseButton;
  35.     Shift: TShiftState; X, Y: Integer);
  36.     procedure ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
  37.     Y: Integer);
  38.     procedure ImageMouseDown(Sender: TObject; Button: TMouseButton;
  39.     Shift: TShiftState; X, Y: Integer);
  40.     procedure SBLineClick(Sender: TObject);
  41.     procedure FormCreate(Sender: TObject);
  42.     procedure SBStartClick(Sender: TObject);
  43.     procedure SBFinishClick(Sender: TObject);
  44.     procedure SBPathClick(Sender: TObject);
  45.     procedure SBClearClick(Sender: TObject);
  46.     procedure mmiAboutClick(Sender: TObject);
  47.     procedure FormCenter;
  48.     private
  49.     Drawing: Boolean;
  50.     Origin, MovePt: TPoint;
  51.     DrawingTool : byte;
  52.     { Private declarations }
  53.     public
  54.     procedure DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode);
  55.     { Public declarations }
  56.   end;
  57.  
  58. var
  59.   MainForm: TMainForm;
  60.  
  61. implementation
  62.  
  63. {$R *.DFM}
  64.  
  65. uses disktrat, Unit2;
  66.  
  67. const max = 30;
  68.  
  69. type
  70.     Vertek = record
  71.     posx,posy : Integer;
  72. end;
  73.  
  74. AVertek = Array [1..max] of Vertek;
  75.  
  76. var
  77.   count : byte;
  78.   awal,akhir : byte;
  79.   Node : AVertek;
  80.   bool_awal,bool_akhir : Boolean;
  81.   node1,node2 : byte;
  82.   Data : TJarak;
  83.   Closed : TPath;
  84.  
  85. procedure TMainForm.DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode);
  86. begin
  87.   with Image.Canvas do
  88.   begin
  89.     Pen.Mode := AMode;
  90.     case DrawingTool of
  91.       2: {LINE}
  92.       begin
  93.         Image.Canvas.MoveTo(TopLeft.X, TopLeft.Y);
  94.         Image.Canvas.LineTo(BottomRight.X, BottomRight.Y);
  95.       end;
  96.     end;
  97.   end;
  98. end;
  99.  
  100. procedure TMainForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  101. Y: Integer);
  102. begin
  103.   if Drawing then
  104.   begin
  105.     DrawShape(Origin, MovePt, pmNotXor);
  106.     MovePt := Point(X, Y);
  107.     DrawShape(Origin, MovePt, pmNotXor);
  108.   end;
  109. end;
  110.  
  111. procedure TMainForm.SBNodeClick(Sender: TObject);
  112. begin
  113.   Drawingtool := 1;
  114.   Image.Canvas.Pen.Mode := pmcopy;
  115. end;
  116.  
  117. procedure TMainForm.ImageMouseUp(Sender: TObject; Button: TMouseButton;
  118. Shift: TShiftState; X, Y: Integer);
  119. var
  120.    XX,YY,i : byte;
  121. begin
  122.   if Drawing then
  123.   begin
  124.     DrawShape(Origin, MovePt, pmNotXor);
  125.     if drawingtool=2 then
  126.     begin
  127.       bool_akhir := False;
  128.       for i := 1 to count do
  129.         if (X>Node[i].posX-10) and (Y>Node[i].posY-10) and (X<Node[i].posX+10) and (Y<Node[i].posY+10) then
  130.       begin
  131.         bool_akhir := True;
  132.         node2 := i;
  133.         break;
  134.       end;
  135.       if (node1<>0) and (node2<>0) and bool_awal and bool_akhir then
  136.       begin
  137.         DrawShape(Point(Node[node1].posx,Node[node1].posy), Point(Node[node2].posx,Node[node2].posy), pmCopy);
  138.         Data[node1,node2] := round(sqrt(sqr(abs(Node[node2].posy-Node[node1].posy)/9) + sqr(abs(Node[node2].posx-Node[node1].posx)/9)));
  139.         Data[node2,node1] := Data[node1,node2];
  140.         XX := Node[node1].posx;
  141.         YY := Node[node1].posy;
  142.         with Image.Canvas do
  143.         begin
  144.           Image.Canvas.Pen.Mode := pmcopy;
  145.           Ellipse(XX-10,YY-10,XX+10,YY+10);
  146.           if node1 div  10 > 0 then
  147.             Textout(xX-7,Yy-6,IntToStr(node1))
  148.           else
  149.             Textout(Xx-3,Yy-6,IntToStr(node1));
  150.         end;
  151.         XX := Node[node2].posx;
  152.         YY := Node[node2].posy;
  153.         with Image.Canvas do
  154.         begin
  155.           Image.Canvas.Pen.Mode := pmcopy;
  156.           Ellipse(XX-10,YY-10,XX+10,YY+10);
  157.           if node2 div  10 > 0 then
  158.             Textout(xX-7,Yy-6,IntToStr(node2))
  159.           else
  160.             Textout(Xx-3,Yy-6,IntToStr(node2));
  161.         end;
  162.         image.Canvas.TextOut((Node[node1].posx+Node[node2].posx)div 2 ,(Node[node1].posy+Node[node2].posy) div 2,IntToStr(Data[node1,node2]));
  163.       end;
  164.     end;
  165.     Drawing := False;
  166.     if drawingtool=1 then
  167.     begin
  168.       count :=  count + 1;
  169.       with Node[count] do
  170.       begin
  171.         posx := x;
  172.         posy := y;
  173.       end;
  174.       with Image.Canvas do
  175.       begin
  176.         Image.Canvas.Pen.Mode := pmcopy;
  177.         Ellipse(X-10,Y-10,X+10,Y+10);
  178.         if count div  10 > 0 then
  179.           Textout(x-7,y-6,IntToStr(count))
  180.         else
  181.           Textout(x-3,y-6,IntToStr(count));
  182.       end;
  183.     end;
  184.   end;
  185. end;
  186.  
  187. procedure TMainForm.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
  188. Y: Integer);
  189. begin
  190.   if Drawing then
  191.   begin
  192.     DrawShape(Origin, MovePt, pmNotXor);
  193.     MovePt := Point(X, Y);
  194.     DrawShape(Origin, MovePt, pmNotXor);
  195.   end;
  196. end;
  197.  
  198. procedure TMainForm.ImageMouseDown(Sender: TObject; Button: TMouseButton;
  199. Shift: TShiftState; X, Y: Integer);
  200. var
  201.   i : byte;
  202. begin
  203.   Drawing := True;
  204.   Image.Canvas.MoveTo(X, Y);
  205.   Origin := Point(X, Y);
  206.   MovePt := Origin;
  207.   if drawingtool=2 then
  208.   begin
  209.     bool_awal := False;
  210.     for i := 1 to count do
  211.       if (X>Node[i].posX-10) and (Y>Node[i].posY-10) and (X<Node[i].posX+10) and (Y<Node[i].posY+10) then
  212.     begin
  213.       bool_awal := True;
  214.       node1 := i;
  215.       break;
  216.     end;
  217.   end
  218.   else
  219.   if drawingtool in [3,4] then
  220.   begin
  221.     for i := 1 to count do
  222.       if (X>Node[i].posX-10) and (Y>Node[i].posY-10) and (X<Node[i].posX+10) and (Y<Node[i].posY+10) then
  223.     begin
  224.       case drawingtool of
  225.         3  : begin
  226.         awal := i;
  227.         EdStart.Text := IntToStr(i);
  228.       end;
  229.       4  : begin
  230.       akhir := i;
  231.       EdFinish.Text := IntToStr(i);
  232.     end;
  233.   end;
  234.   break;
  235. end;
  236. end;
  237. end;
  238.  
  239. procedure TMainForm.SBLineClick(Sender: TObject);
  240. begin
  241.   Drawingtool := 2;
  242. end;
  243.  
  244. procedure TMainForm.FormCreate(Sender: TObject);
  245. var
  246.   Bitmap: TBitmap;
  247.   xx,yy : byte;
  248. begin
  249.   MainForm.Left := Screen.Width  div 2 - Width  div 2;
  250.   MainForm.Top  := Screen.Height div 2 - Height div 2;
  251.   DoubleBuffered := True;
  252.   Bitmap := nil;
  253.   try
  254.     Bitmap := TBitmap.Create;
  255.     Bitmap.Width := 350;
  256.     Bitmap.Height := 300;
  257.     Image.Picture.Graphic := Bitmap;
  258.   finally
  259.     Bitmap.Free;
  260.   end;
  261.   MemoSolution.Clear;
  262.   Drawingtool := 1;
  263.   count := 0;
  264.   awal:= 0;
  265.   akhir := 0;
  266.   EdStart.Text := '';
  267.   EdFinish.Text := '';
  268.   for xx := 1 to max do
  269.     for yy := 1 to max do
  270.   begin
  271.     if xx=yy then
  272.       Data[xx,yy] := 0
  273.     else
  274.       Data[xx,yy] := 999;
  275.   end;
  276. end;
  277.  
  278. procedure TMainForm.SBStartClick(Sender: TObject);
  279. begin
  280.   Drawingtool := 3;
  281. end;
  282.  
  283. procedure TMainForm.SBFinishClick(Sender: TObject);
  284. begin
  285.   Drawingtool := 4;
  286. end;
  287.  
  288. procedure TMainForm.SBPathClick(Sender: TObject);
  289. var
  290.   i : byte;
  291.   XX,YY : byte;
  292. begin
  293.   MemoSolution.Clear;
  294.   Drawingtool := 2;
  295.   RuteTerpendek(Data,Closed,awal,akhir,count);
  296.   if (awal<>0) and (akhir<>0) and (closed.jarak<>0) and  (closed.jarak<>999)  then
  297.   begin
  298.     Drawing := True;
  299.     EdDistance.Text := IntToStr(closed.jarak);
  300.     for i := 1 to closed.nodeke-1 do
  301.     begin
  302.       MemoSolution.Text := MemoSolution.Text + IntToStr(closed.arraypath[i]) + '-';
  303.       image.Canvas.Pen.Color := clred;
  304.       DrawShape(Point(Node[closed.arraypath[i]].posx,Node[closed.arraypath[i]].posy), Point(Node[closed.arraypath[i+1]].posx,Node[closed.arraypath[i+1]].posy), pmCopy);
  305.       XX := Node[closed.arraypath[i]].posx;
  306.       YY := Node[closed.arraypath[i]].posy;
  307.       with Image.Canvas do
  308.       begin
  309.         Image.Canvas.Pen.Mode := pmcopy;
  310.         Ellipse(XX-10,YY-10,XX+10,YY+10);
  311.         if node2 div  10 > 0 then
  312.           Textout(xX-7,Yy-6,IntToStr(closed.arraypath[i]))
  313.         else
  314.           Textout(Xx-3,Yy-6,IntToStr(closed.arraypath[i]));
  315.       end;
  316.     end;
  317.     XX := Node[closed.arraypath[closed.nodeke]].posx;
  318.     YY := Node[closed.arraypath[closed.nodeke]].posy;
  319.     with Image.Canvas do
  320.     begin
  321.       Image.Canvas.Pen.Mode := pmcopy;
  322.       Ellipse(XX-10,YY-10,XX+10,YY+10);
  323.       if closed.nodeke div  10 > 0 then
  324.         Textout(xX-7,Yy-6,IntToStr(closed.arraypath[closed.nodeke]))
  325.       else
  326.         Textout(Xx-3,Yy-6,IntToStr(closed.arraypath[closed.nodeke]));
  327.     end;
  328.     image.Canvas.Pen.Color := clblack;
  329.     MemoSolution.Text :=  MemoSolution.Text + IntToStr(closed.arraypath[closed.nodeke]);
  330.     Drawing := False;
  331.   end
  332.   else
  333.   begin
  334.     MemoSolution.Text :=  'iln''ya pas de connections';
  335.     EdDistance.Text :=  '';
  336.   end;
  337.   Drawingtool := 5;
  338. end;
  339.  
  340. procedure TMainForm.SBClearClick(Sender: TObject);
  341. begin
  342.   Drawingtool := 6;
  343.   FormCreate(Sender);
  344.   SBNodeClick(Sender);
  345.   EdDistance.Clear;
  346. end;
  347.  
  348. procedure TMainForm.FormCenter;
  349. begin
  350.   with Form2 do
  351.   begin
  352.      Left := Screen.Width  div 2 - Width  div 2;
  353.      Top  := Screen.Height div 2 - Height div 2;
  354.   end;
  355. end;
  356.  
  357. procedure TMainForm.mmiAboutClick(Sender: TObject);
  358. begin
  359.   with Form2 do
  360.   begin
  361.      Form2 := TForm2.Create(Application);
  362.      FormCenter;
  363.      AnimateWindow(Handle, 250{Vitesse}, AW_CENTER);
  364.      Show;
  365.   end;
  366. end;
  367.  
  368. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement