Inherited TShape.Paint does not work after overriding Shape property

Posted by DarkWalker on Stack Overflow See other posts from Stack Overflow or by DarkWalker
Published on 2010-03-30T13:00:23Z Indexed on 2010/03/30 13:03 UTC
Read the original article Hit count: 393

Filed under:
|
|

I'm to code a TExpandedShape class inherited from TShape. TExpandedShape must act like TShape and be able to draw extra shapes: Polygon and Star. Here is my code

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 

{It is supposed to draw Circle, Rectangle etc, but it does not}

          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.

So, what is wrong?
IMO TShape.Paint checks private value like FShape in case section and then decides what to draw. When inherited Paint method is called in my code it checks FShape value sees default 0 value [stRectangle] in there and draws it.

PS: I did solve it with blackmagic way using Shape1 property instead of Shape one and if Shape1 value is not stPolygon or stStar i do like this: begin Shape := TShapeType(Shape1); inherited end; But this option is not really an option. I need a good short nice-looking one.

© Stack Overflow or respective owner

Related posts about delphi-2007

Related posts about override