home *** CD-ROM | disk | FTP | other *** search
/ Delphi 5 for Professionals / DELPHI5.iso / AddOns / Components / TEECHART / DELPHI4.EXE / %MAINDIR% / Examples / Extended / Gantted.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1998-11-17  |  7.6 KB  |  288 lines

  1. {*********************************************}
  2. {  TeeChart Gantt Editor example              }
  3. {  Copyright (c) 1995-1997 by David Berneda   }
  4. {  All rights reserved                        }
  5. {*********************************************}
  6. unit GanttEd;
  7.  
  8. interface
  9.  
  10. { This example shows how to allow dragging and resizing of
  11.   Gantt bars at runtime.
  12. }
  13. uses
  14.   Wintypes,WinProcs, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  15.   TeEngine, Series, GanttCh, ExtCtrls, TeeProcs, Chart, StdCtrls, Spin,
  16.   Buttons, TeeComma;
  17.  
  18. type
  19.   TFormGanttEditor = class(TForm)
  20.     Chart1: TChart;
  21.     Series1: TGanttSeries;
  22.     Panel1: TPanel;
  23.     CheckBox1: TCheckBox;
  24.     AutoStretch: TCheckBox;
  25.     SpinEdit1: TSpinEdit;
  26.     Label1: TLabel;
  27.     AutoScroll: TCheckBox;
  28.     GroupBox1: TGroupBox;
  29.     Label2: TLabel;
  30.     LabelStart: TLabel;
  31.     Label5: TLabel;
  32.     LabelEnd: TLabel;
  33.     BitBtn1: TBitBtn;
  34.     BitBtn2: TBitBtn;
  35.     Button3: TButton;
  36.     TeeCommander1: TTeeCommander;
  37.     procedure FormCreate(Sender: TObject);
  38.     procedure Chart1AfterDraw(Sender: TObject);
  39.     procedure Chart1ClickBackground(Sender: TCustomChart;
  40.       Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  41.     procedure CheckBox1Click(Sender: TObject);
  42.     procedure Chart1MouseDown(Sender: TObject; Button: TMouseButton;
  43.       Shift: TShiftState; X, Y: Integer);
  44.     procedure Chart1MouseUp(Sender: TObject; Button: TMouseButton;
  45.       Shift: TShiftState; X, Y: Integer);
  46.     procedure Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
  47.       Y: Integer);
  48.     procedure AutoStretchClick(Sender: TObject);
  49.     procedure SpinEdit1Change(Sender: TObject);
  50.     procedure BitBtn1Click(Sender: TObject);
  51.     procedure BitBtn2Click(Sender: TObject);
  52.     procedure Button3Click(Sender: TObject);
  53.   private
  54.     { Private declarations }
  55.   public
  56.     { Public declarations }
  57.     Selected:Integer;
  58.     ResizeLeft,
  59.     ResizeRight,
  60.     Dragging:Boolean;
  61.     StartX,
  62.     OldStartX,
  63.     OldEndX:Double;
  64.     Procedure RepaintSelected;
  65.     Procedure DrawSelection;
  66.   end;
  67.  
  68. implementation
  69.  
  70. {$R *.DFM}
  71. Uses EditChar,EditPro; 
  72.  
  73. procedure TFormGanttEditor.FormCreate(Sender: TObject);
  74. begin
  75.   Selected:=-1;
  76.   Dragging:=False;
  77.   Series1.Cursor:=crTeeHand;
  78.  
  79.   { random data. replace with Series1.AddGantt calls }
  80.   Series1.FillSampleValues(10);
  81.  
  82.   { axis labelling }
  83.   With Chart1.BottomAxis do
  84.   begin
  85.     Increment:=DateTimeStep[dtOneDay];
  86.     ExactDateTime:=True;
  87.   end;
  88. end;
  89.  
  90. Procedure TFormGanttEditor.DrawSelection;
  91. var R,H,L,T:Integer;
  92. begin
  93.   With Chart1.Canvas do  { draw selected gantt bar... }
  94.   begin
  95.     { set pen and brush }
  96.     Pen.Style:=psDot;
  97.     Pen.Width:=1;
  98.     Pen.Color:=clWhite;
  99.     Brush.Style:=bsBDiagonal;
  100.     Brush.Color:=clSilver;
  101.     { calculate rectangle position }
  102.     With Series1 do
  103.     begin
  104.       R:=CalcXPosValue(EndValues[Selected]);
  105.       H:=Pointer.VertSize;
  106.       L:=CalcXPos(Selected);
  107.       T:=CalcYPos(Selected);
  108.     end;
  109.     { draw rectangle at selected gantt bar }
  110.     {$IFDEF GL}
  111.     RectangleWithZ(Rect(L,T-H,R,T+H),0);
  112.     {$ELSE}
  113.     Rectangle(L,T-H,R,T+H);
  114.     {$ENDIF}
  115.   end;
  116. end;
  117.  
  118. procedure TFormGanttEditor.Chart1AfterDraw(Sender: TObject);
  119. begin
  120.   if Selected<>-1 then
  121.   begin
  122.     DrawSelection;
  123.     { Custom code, change label captions: }
  124.     With Series1 do
  125.     begin
  126.       LabelStart.Caption:=XValueToText(StartValues[Selected]);
  127.       LabelEnd.Caption:=XValueToText(EndValues[Selected]);
  128.     end;
  129.   end;
  130. end;
  131.  
  132. Procedure TFormGanttEditor.RepaintSelected;
  133. begin
  134.   Chart1.Repaint;
  135. end;
  136.  
  137. procedure TFormGanttEditor.Chart1ClickBackground(Sender: TCustomChart;
  138.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  139. begin
  140.   { deselect clicked gantt bar... }
  141.   if Selected<>-1 then
  142.   begin
  143.     Selected:=-1;
  144.     Dragging:=False;
  145.     RepaintSelected;
  146.   end;
  147.   Chart1.CancelMouse:=False;  { <-- allow normal scroll }
  148. end;
  149.  
  150. procedure TFormGanttEditor.CheckBox1Click(Sender: TObject);
  151. begin
  152.   Chart1.View3D:=CheckBox1.Checked;
  153. end;
  154.  
  155. procedure TFormGanttEditor.Chart1MouseDown(Sender: TObject; Button: TMouseButton;
  156.   Shift: TShiftState; X, Y: Integer);
  157. begin
  158.   if Button=mbRight then Chart1.CancelMouse:=False
  159.   else
  160.   begin
  161.     { we'll drag if mouse button is left and is over a gantt bar }
  162.     Dragging:=(Button=mbLeft) and (Selected<>-1);
  163.     if Dragging then
  164.     With Series1 do
  165.     begin
  166.       { remember values at start dragging ... }
  167.       StartX:=XScreenToValue(X);
  168.       OldStartX:=StartValues[Selected];
  169.       OldEndX:=EndValues[Selected];
  170.       Chart1.CancelMouse :=True; { <-- to disable Zoom }
  171.       RepaintSelected;
  172.     end;
  173.   end;
  174. end;
  175.  
  176. procedure TFormGanttEditor.Chart1MouseUp(Sender: TObject; Button: TMouseButton;
  177.   Shift: TShiftState; X, Y: Integer);
  178. begin
  179.   Dragging:=False; { mouse released }
  180. end;
  181.  
  182. procedure TFormGanttEditor.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
  183.   Y: Integer);
  184. Var NewX,tmp:Double;
  185.     NewSelected,
  186.     tmpX0,tmpX1:Integer;
  187. begin
  188.   if Dragging and (Selected<>-1) then  { if mouse is pressed... }
  189.   With Series1 do
  190.   begin
  191.     { we are dragging horizontally... }
  192.     NewX:=StartX-XScreenToValue(X);
  193.  
  194.     { drag or resize left border }
  195.     if ResizeLeft then
  196.        if (OldStartX-NewX)<EndValues[Selected] then
  197.        begin
  198.          StartValues[Selected]:=OldStartX-NewX;
  199.          if (not AutoStretch.Checked) and (AutoScroll.Checked) then
  200.          With GetHorizAxis do
  201.          begin
  202.            tmp:=Minimum-StartValues[Selected];
  203.            if tmp>0 then SetMinMax(StartValues[Selected],Maximum-tmp);
  204.          end;
  205.        end;
  206.  
  207.     { drag or resize right border }
  208.     if ResizeRight then
  209.        if (OldEndX-NewX)>StartValues[Selected] then
  210.        begin
  211.          EndValues[Selected]:=OldEndX-NewX;
  212.          if (not AutoStretch.Checked) and (AutoScroll.Checked) then
  213.          With GetHorizAxis do
  214.          begin
  215.            tmp:=EndValues[Selected]-Maximum;
  216.            if tmp>0 then SetMinMax(Minimum+tmp,EndValues[Selected]);
  217.          end;
  218.        end;
  219.  
  220.     RepaintSelected;
  221.   end
  222.   else
  223.   begin  { check mouse is passing over a new gantt bar... }
  224.     NewSelected:=Series1.Clicked(X,Y);
  225.     if NewSelected<>Selected then
  226.     begin
  227.       Selected:=NewSelected;
  228.       RepaintSelected;
  229.     end
  230.     else
  231.     { check if mouse is passing over resizing left or right }
  232.     if Selected<>-1 then
  233.     With Series1 do
  234.     begin
  235.       tmpX0:=CalcXPosValue(StartValues[Selected]);
  236.       tmpX1:=CalcXPosValue(EndValues[Selected]);
  237.       ResizeLeft:=False;
  238.       ResizeRight:=False;
  239.       if (Abs(X-tmpX0)<4) then  { left border }
  240.       begin
  241.         Cursor:=crSizeWE;
  242.         ResizeLeft:=True;
  243.       end
  244.       else
  245.       if (Abs(X-tmpX1)<4) then { right border }
  246.       begin
  247.         Cursor:=crSizeWE;
  248.         ResizeRight:=True;
  249.       end
  250.       else
  251.       begin  { mouse is not in resizing borders }
  252.         Cursor:=crTeeHand;
  253.         ResizeLeft:=True;
  254.         ResizeRight:=True;
  255.       end;
  256.     end;
  257.   end;
  258. end;
  259.  
  260. procedure TFormGanttEditor.AutoStretchClick(Sender: TObject);
  261. begin
  262.   Series1.GetHorizAxis.Automatic:=AutoStretch.Checked;
  263. end;
  264.  
  265. procedure TFormGanttEditor.SpinEdit1Change(Sender: TObject);
  266. begin
  267.   Series1.Pointer.VertSize:=SpinEdit1.Value;
  268. end;
  269.  
  270. procedure TFormGanttEditor.BitBtn1Click(Sender: TObject);
  271. begin
  272.   AutoStretch.Checked:=False;
  273.   Series1.GetHorizAxis.Scroll(5,False);
  274. end;
  275.  
  276. procedure TFormGanttEditor.BitBtn2Click(Sender: TObject);
  277. begin
  278.   AutoStretch.Checked:=False;
  279.   Series1.GetHorizAxis.Scroll(-5,False);
  280. end;
  281.  
  282. procedure TFormGanttEditor.Button3Click(Sender: TObject);
  283. begin
  284.   Close;
  285. end;
  286.  
  287. end.
  288.