Унаследованный TShape.Paint не работает после переопределения свойства Shape - PullRequest
0 голосов
/ 30 марта 2010

Я должен кодировать класс 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); наследственный конец; Но этот вариант на самом деле не вариант. Мне нужен хороший короткий красивый.

Ответы [ 2 ]

1 голос
/ 06 апреля 2010

Здесь, в моем Интернете , вы можете найти статью о подключаемых модулях в Delphi.
В примере кода статьи реализован класс-потомок TShape. Весь код включен. Вы можете скачать и посмотреть код класса.

Еще один потомок классов реализует фигуры Лиле Звезды, Стрелы, ...

alt text

Здесь вы можете увидеть некоторые реализованные потомки фигуры TShape.

alt text


Neftali

P.D: Извините за ошибки с английским.

1 голос
/ 31 марта 2010

добавить эту унаследованную строку перед вашей унаследованной ....

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