home *** CD-ROM | disk | FTP | other *** search
/ PC World Plus! (NZ) 2001 June / HDC50.iso / Runimage / Delphi50 / Demos / Propedit / PIES.PAS < prev   
Pascal/Delphi Source File  |  1999-08-11  |  3KB  |  150 lines

  1. unit Pies;
  2.  
  3. interface
  4.  
  5. uses Classes, Controls, Forms, Graphics, StdCtrls;
  6.  
  7. type
  8.   TAngles = class(TPersistent)
  9.   private
  10.     FStartAngle: Integer;
  11.     FEndAngle: Integer;
  12.     FOnChange: TNotifyEvent;
  13.     procedure SetStart(Value: Integer);
  14.     procedure SetEnd(Value: Integer);
  15.   public
  16.     procedure Assign(Value: TAngles);
  17.     procedure Changed;
  18.   published
  19.     property StartAngle: Integer read FStartAngle write SetStart;
  20.     property EndAngle: Integer read FEndAngle write SetEnd;
  21.     property OnChange: TNotifyEvent read FOnChange write FOnChange;
  22.   end;
  23.   
  24.   TPie = class(TGraphicControl)
  25.     FPen: TPen;
  26.     FBrush: TBrush;
  27.     FEdit: TEdit;
  28.     FAngles: TAngles;
  29.     constructor Create(AOwner: TComponent); override;
  30.     procedure Paint; override;
  31.     procedure SetBrush(Value: TBrush);
  32.     procedure SetPen(Value: TPen);
  33.     procedure SetAngles(Value: TAngles);
  34.     procedure StyleChanged(Sender: TObject);
  35.  
  36.   published
  37.     property Angles: TAngles read FAngles write SetAngles;
  38.     property Brush: TBrush read FBrush write SetBrush;
  39.     property Pen: TPen read FPen write SetPen;
  40.     property OnClick;
  41.     property OnDblClick;
  42.     property OnDragDrop;
  43.     property OnDragOver;
  44.     property OnEndDrag;
  45.     property OnMouseDown;
  46.     property OnMouseMove;
  47.     property OnMouseUp;
  48.   end;
  49.  
  50. implementation
  51.  
  52. uses Windows;
  53.  
  54. procedure TAngles.Assign(Value: TAngles);
  55. begin
  56.   StartAngle := Value.StartAngle;
  57.   EndAngle := Value.EndAngle;
  58. end;
  59.  
  60. procedure TAngles.SetStart(Value: Integer);
  61. begin
  62.   if Value <> FStartAngle then
  63.   begin
  64.     FStartAngle := Value;
  65.     Changed;
  66.   end;
  67. end;
  68.  
  69. procedure TAngles.SetEnd(Value: Integer);
  70. begin
  71.   if Value <> FEndAngle then
  72.   begin
  73.     FEndAngle := Value;
  74.     Changed;
  75.   end;
  76. end;
  77.  
  78. procedure TAngles.Changed;
  79. begin
  80.   if Assigned(FOnChange) then FOnChange(Self);
  81. end;
  82.  
  83. constructor TPie.Create(AOwner: TComponent);
  84. begin
  85.   inherited Create(AOwner);
  86.   Width := 100;
  87.   Height := 100;
  88.   FPen := TPen.Create;
  89.   FPen.OnChange := StyleChanged;
  90.   FBrush := TBrush.Create;
  91.   FBrush.OnChange := StyleChanged;
  92.   FAngles := TAngles.Create;
  93.   FAngles.OnChange := StyleChanged;
  94.   FAngles.StartAngle := 180;
  95.   FAngles.EndAngle := 90;
  96. end;
  97.  
  98. procedure TPie.StyleChanged(Sender: TObject);
  99. begin
  100.   Invalidate;
  101. end;
  102.  
  103. procedure TPie.SetBrush(Value: TBrush);
  104. begin
  105.   FBrush.Assign(Value);
  106. end;
  107.  
  108. procedure TPie.SetPen(Value: TPen);
  109. begin
  110.   FPen.Assign(Value);
  111. end;
  112.  
  113. procedure TPie.SetAngles(Value: TAngles);
  114. begin
  115.   FAngles.Assign(Value);
  116.   Invalidate;
  117. end;
  118.  
  119. procedure TPie.Paint;
  120. var
  121.   StartA, EndA: Integer;
  122.   midX, midY, stX, stY, endX, endY: Integer;
  123.   sX, sY, eX, eY: Real;
  124.  
  125. begin
  126.   StartA := FAngles.StartAngle;
  127.   EndA := FAngles.EndAngle;
  128.   midX := Width div 2;
  129.   midY := Height div 2;
  130.  
  131.   sX := Cos((StartA / 180.0) * pi);
  132.   sY := Sin((StartA / 180.0) * pi);
  133.   eX := Cos((EndA / 180.0) * pi);
  134.   eY := Sin((EndA / 180.0) * pi);
  135.  
  136.   stX := Round(sX * 100);
  137.   stY := Round(sY * 100);
  138.   endX := Round(eX * 100);
  139.   endY := Round(eY * 100);
  140.  
  141.   with Canvas do
  142.   begin
  143.     Pen := FPen;
  144.     Brush := FBrush;
  145.     Pie(0,0, Width,Height, midX + stX, midY - stY, midX + endX, midY - endY);
  146.   end;
  147. end;
  148.  
  149. end.
  150.