home *** CD-ROM | disk | FTP | other *** search
/ PC Format Collection 48 / SENT14D.ISO / tech / delphi / disk15 / propedit.pak / PIES.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1995-08-24  |  3.4 KB  |  159 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. procedure Register;
  51.  
  52. implementation
  53.  
  54. uses WinTypes, WinProcs, DsgnIntf, AnglEdit;
  55.  
  56. procedure TAngles.Assign(Value: TAngles);
  57. begin
  58.   StartAngle := Value.StartAngle;
  59.   EndAngle := Value.EndAngle;
  60. end;
  61.  
  62. procedure TAngles.SetStart(Value: Integer);
  63. begin
  64.   if Value <> FStartAngle then
  65.   begin
  66.     FStartAngle := Value;
  67.     Changed;
  68.   end;
  69. end;
  70.  
  71. procedure TAngles.SetEnd(Value: Integer);
  72. begin
  73.   if Value <> FEndAngle then
  74.   begin
  75.     FEndAngle := Value;
  76.     Changed;
  77.   end;
  78. end;
  79.  
  80. procedure TAngles.Changed;
  81. begin
  82.   if Assigned(FOnChange) then FOnChange(Self);
  83. end;
  84.  
  85. constructor TPie.Create(AOwner: TComponent);
  86. begin
  87.   inherited Create(AOwner);
  88.   Width := 100;
  89.   Height := 100;
  90.   FPen := TPen.Create;
  91.   FPen.OnChange := StyleChanged;
  92.   FBrush := TBrush.Create;
  93.   FBrush.OnChange := StyleChanged;
  94.   FAngles := TAngles.Create;
  95.   FAngles.OnChange := StyleChanged;
  96.   FAngles.StartAngle := 180;
  97.   FAngles.EndAngle := 90;
  98. end;
  99.  
  100. procedure TPie.StyleChanged(Sender: TObject);
  101. begin
  102.   Invalidate;
  103. end;
  104.  
  105. procedure TPie.SetBrush(Value: TBrush);
  106. begin
  107.   FBrush.Assign(Value);
  108. end;
  109.  
  110. procedure TPie.SetPen(Value: TPen);
  111. begin
  112.   FPen.Assign(Value);
  113. end;
  114.  
  115. procedure TPie.SetAngles(Value: TAngles);
  116. begin
  117.   FAngles.Assign(Value);
  118.   Invalidate;
  119. end;
  120.  
  121. procedure TPie.Paint;
  122. var
  123.   StartA, EndA: Integer;
  124.   midX, midY, stX, stY, endX, endY: Integer;
  125.   sX, sY, eX, eY: Real;
  126.  
  127. begin
  128.   StartA := FAngles.StartAngle;
  129.   EndA := FAngles.EndAngle;
  130.   midX := Width div 2;
  131.   midY := Height div 2;
  132.  
  133.   sX := Cos((StartA / 180.0) * pi);
  134.   sY := Sin((StartA / 180.0) * pi);
  135.   eX := Cos((EndA / 180.0) * pi);
  136.   eY := Sin((EndA / 180.0) * pi);
  137.  
  138.   stX := Round(sX * 100);
  139.   stY := Round(sY * 100);
  140.   endX := Round(eX * 100);
  141.   endY := Round(eY * 100);
  142.  
  143.   with Canvas do
  144.   begin
  145.     Pen := FPen;
  146.     Brush := FBrush;
  147.     Pie(0,0, Width,Height, midX + stX, midY - stY, midX + endX, midY - endY);
  148.   end;
  149. end;
  150.  
  151. procedure Register;
  152. begin
  153.   RegisterComponents('Samples',[TPie]);
  154.   RegisterComponentEditor(TPie, TPieEditor);
  155.   RegisterPropertyEditor(TypeInfo(TAngles), nil, '', TAnglesProperty);
  156. end;
  157.  
  158. end.
  159.