PieReg.pas
上传用户:psxgmh
上传日期:2013-04-08
资源大小:15112k
文件大小:4k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit PieReg;
  2. interface
  3. uses Windows, Classes, Graphics, Forms, Controls, Pies, Buttons, DesignIntf,
  4.   DesignWindows, StdCtrls, ComCtrls, DesignEditors;
  5. type
  6.   //属性、组件的编辑窗体
  7.   TAngleEditorDlg = class(TForm)
  8.     EAngleLabel: TLabel;
  9.     OKButton: TButton;
  10.     CancelButton: TButton;
  11.     SAngleLabel: TLabel;
  12.     STrackBar: TTrackBar;
  13.     ETrackBar: TTrackBar;
  14.     procedure CancelClick(Sender: TObject);
  15.     procedure STrackBarChange(Sender: TObject);
  16.     procedure ETrackBarChange(Sender: TObject);
  17.   private
  18.     FOrigStart, FOrigEnd: Integer;//记录原始角度
  19.     FAngles: TAngles;
  20.     procedure SetStartAngle(Value: Integer);
  21.     procedure SetEndAngle(Value: Integer);
  22.     procedure SetAngles(Value: TAngles);
  23.   public
  24.     property EditorAngles: TAngles read FAngles write SetAngles;
  25.   end;
  26.   //Angle属性编辑类
  27.   TAnglesProperty = class(TClassProperty)
  28.   public
  29.     procedure Edit; override;
  30.     function GetAttributes: TPropertyAttributes; override;
  31.   end;
  32.   //组件编辑类
  33.   TPieEditor = class(TDefaultEditor)
  34.   protected
  35.     procedure EditProperty(const PropertyEditor: IProperty;
  36.       var Continue: Boolean); override;
  37.   public
  38.     procedure ExecuteVerb(Index: Integer); override;
  39.     function GetVerb(Index: Integer): string; override;
  40.     function GetVerbCount: Integer; override;
  41.   end;
  42. procedure Register;
  43. implementation
  44. uses SysUtils;
  45. {$R *.dfm}
  46. { TAngleEditorDlg }
  47. //===========属性对话框实现==================//
  48. //设置开始角度
  49. procedure TAngleEditorDlg.SetStartAngle(Value: Integer);
  50. begin
  51.   STrackBar.Position := Value;
  52.   SAngleLabel.Caption := 'StartAngle = '+ IntToStr(Value);
  53.   FAngles.StartAngle := Value;
  54. end;
  55. //设置结束角度
  56. procedure TAngleEditorDlg.SetEndAngle(Value: Integer);
  57. begin
  58.   ETrackBar.Position := Value;
  59.   EAngleLabel.Caption := 'EndAngle = '+ IntToStr(Value);
  60.   FAngles.EndAngle := Value;
  61. end;
  62. //当开始角度变化时,调用SetStartAngle方法来设置FAngles
  63. procedure TAngleEditorDlg.STrackBarChange(Sender: TObject);
  64. begin
  65.   SetStartAngle(STrackBar.Position);
  66. end;
  67. //当结束角度变化时,调用SetStartAngle方法来设置FAngles
  68. procedure TAngleEditorDlg.ETrackBarChange(Sender: TObject);
  69. begin
  70.   SetEndAngle(ETrackBar.Position);
  71. end;
  72. //设置角度,
  73. procedure TAngleEditorDlg.SetAngles(Value: TAngles);
  74. begin
  75.   FAngles := Value;
  76.   //将原有角度存起来,以便恢复
  77.   FOrigStart := Value.StartAngle;
  78.   FOrigEnd := Value.EndAngle;
  79.   //设置开始、结束角度
  80.   SetStartAngle(Value.StartAngle);
  81.   SetEndAngle(Value.EndAngle);
  82. end;
  83. //取消时,恢复原先角度
  84. procedure TAngleEditorDlg.CancelClick(Sender: TObject);
  85. begin
  86.   SetStartAngle(FOrigStart);
  87.   SetEndAngle(FOrigEnd);
  88. end;
  89. //========属性编辑类实现============//
  90. procedure TAnglesProperty.Edit;
  91. var
  92.   Angles: TAngles;
  93.   AngleEditor: TAngleEditorDlg;
  94. begin
  95.   //得到馅饼的原始角度
  96.   Angles := TAngles(GetOrdValue);
  97.   //打开属性编辑窗口
  98.   AngleEditor := TAngleEditorDlg.Create(Application);
  99.   try
  100.     //将原始角度赋给窗体的EditorAngles属性
  101.     AngleEditor.EditorAngles := Angles;
  102.     AngleEditor.ShowModal;
  103.   finally
  104.     AngleEditor.Free;
  105.   end;
  106. end;
  107. function TAnglesProperty.GetAttributes: TPropertyAttributes;
  108. begin
  109.   Result := [paDialog, paSubProperties];
  110. end;
  111. //============组件编辑类的实现=============//
  112. procedure TPieEditor.EditProperty(const PropertyEditor: IProperty;
  113.   var Continue: Boolean);
  114. var
  115.   PropName: string;
  116. begin
  117.   PropName := PropertyEditor.GetName;
  118.   if (CompareText(PropName, 'ANGLES') = 0) then
  119.   begin
  120.     PropertyEditor.Edit;
  121.     Continue := False;
  122.   end;
  123. end;
  124. //检索组件的快捷菜单上有几个命令
  125. function TPieEditor.GetVerbCount: Integer;
  126. begin
  127.   Result := 1;
  128. end;
  129. //根据I n d e x整型参数返回字符串形式的菜单项文本
  130. function TPieEditor.GetVerb(Index: Integer): string;
  131. begin
  132.   if Index = 0 then
  133.     Result := 'Edit Angles'
  134.   else Result := '';
  135. end;
  136. procedure TPieEditor.ExecuteVerb(Index: Integer);
  137. begin
  138.   if Index = 0 then Edit;
  139. end;
  140. //组件注册、属性编辑器注册、组件编辑器注册
  141. procedure Register;
  142. begin
  143.   RegisterComponents('Samples',[TPie]);
  144.   RegisterComponentEditor(TPie, TPieEditor);
  145.   RegisterPropertyEditor(TypeInfo(TAngles), nil, '', TAnglesProperty);
  146. end;
  147. end.