我要编写一个继承自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);继承结束;但这个选项并不是一个真正的选择。我需要一个好看的好看的。
答案 0 :(得分:1)
在继承....之前添加此继承的行
inherited Shape := TShapeType(Shape); // ** add this line **
inherited;
答案 1 :(得分:1)
Here in my web你可以在Delphi找到一篇关于PlugIns的文章 该文章的示例代码实现了TShape的后代类。包含所有代码。您可以下载并查看课程代码。
另一个后裔类实现数字lile Stars,Arrows,...
在这里你可以看到TShape实施的一些数字后代。
Neftalí
P.D:请原谅我的英语错误。