Я должен кодировать класс TExpandedShape, унаследованный от TShape. 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, в разделе case, а затем решает, что рисовать. Когда в моем коде вызывается унаследованный метод Paint, он проверяет, что значение FShape видит значение по умолчанию 0 [stRectangle] и рисует его.
PS: я решил это с помощью blackmagic способом, используя свойство Shape1 вместо Shape one, и если значение Shape1 не stPolygon или stStar, я делаю так: begin Shape: = TShapeType (Shape1); наследственный конец; Но этот вариант на самом деле не вариант. Мне нужен хороший короткий красивый.