重写Shape属性后,继承的TShape.Paint不起作用

时间:2010-03-30 13:00:23

标签: delphi override vcl delphi-2007

我要编写一个继承自TShape的TExpandedShape类。 TExpandedShape必须像TShape一样,并能够绘制额外的形状:Polygon和Star。 这是我的代码

unit ExpandedShape;
interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs,          ExtCtrls, Windows;

type
  TExpandedShapeType = (
            stRectangle, stSquare, stRoundRect, stRoundSquare, stEllipse, stCircle,
            stPolygon,
            stStar
           );
 TExpandedShape = class(TShape)
 private
       FShape: TExpandedShapeType;
       FEdgeCount: integer;
       procedure SetShape(const Value: TExpandedShapeType);
       procedure SetEdgeCount(const Value: integer);
 public
       procedure Paint; override;
 published
       property Shape : TExpandedShapeType read FShape write SetShape;// default   stPolygon;
       property EdgeCount : integer read FEdgeCount write SetEdgeCount default 5;

 end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Course', [TExpandedShape]);
end;

// TExpandedShape 

procedure TExpandedShape.Paint;
begin
  case Shape of
    stStar :    begin {Draw Star}
                end;
    stPolygon : begin {Draw Polygon}                 
                end;
    else  begin 

{它应该绘制圆形,矩形等,但它不会}

          inherited; 
          end;
   end;
  end;

procedure TExpandedShape.SetEdgeCount(const Value: integer);
begin
  FEdgeCount := Value;
  Repaint;
end;

procedure TExpandedShape.SetShape(const Value: TExpandedShapeType);
begin
  FShape := Value;
  Repaint;
end;
end.

那么,出了什么问题? IMO TShape.Paint在案例部分中检查私有值,如FShape,然后决定要绘制的内容。当在我的代码中调用继承的Paint方法时,它会检查FShape值,并在其中看到默认值0 [stRectangle]并绘制它。

PS:我确实用blackmagic方式使用Shape1属性而不是Shape 1来解决它,如果Shape1值不是stPolygon或stStar我喜欢这样:begin Shape:= TShapeType(Shape1);继承结束;但这个选项并不是一个真正的选择。我需要一个好看的好看的。

2 个答案:

答案 0 :(得分:1)

在继承....之前添加此继承的行

  inherited Shape := TShapeType(Shape);  // ** add this line **  
  inherited;   

答案 1 :(得分:1)

Here in my web你可以在Delphi找到一篇关于PlugIns的文章 该文章的示例代码实现了TShape的后代类。包含所有代码。您可以下载并查看课程代码。

另一个后裔类实现数字lile Stars,Arrows,...

alt text

在这里你可以看到TShape实施的一些数字后代。

alt text


Neftalí

P.D:请原谅我的英语错误。