Wednesday, 9 September 2009

Implementación de un Canvas para modificar Objetos en Delphi parte X

En éste décimo post (tendré que cambiar el título y empezar otro nuevo, ya que se empieza a alargar un montón) comento las mejoras sobre el diseño de dibujo de las líneas sobre el canvas. He mejorado bastante el diseño anterior utilizando Interfaces para mejorar la claridad del código y de su extensibilidad posterior. Podréis ver como dispongo de las interfaces IArrow, ILine y IDottedLine y que las extiende la clase TDrawable. Luego nuestra clase abstracta hereda y extiende la clase TDrawable y se monta la factoría abstracta a partir de éste.

En el siguiente diagrama UML veréis las modificaciones hechas sobre el concepto línea:

Ahora tanto el diagrama como el código es mucho más entendible y fácil de seguir, sin un diseño rebuscado y sin pensar en el flujo de control.

Al igual que en la novena entrega, el diagrama es el mismo pero las tripas de la aplicación han cambiado substancialmente para un mejor diseño:

El código fuente del diseño de la jerarquía de clases, es el que sigue a continuación:

type
    TPointEx = packed record
        X: Extended;
        Y: Extended;
    end;

    TTypeLine = (SimpleLine, SimpleArrowLine, SimpleDoubleArrowLine, DottedLine, DottedArrowLine, DottedDoubleArrowLine, noLine);

    IArrow = interface(IInterface)
    ['{5A1664E5-C09F-45E4-B90E-19EE1625AFF3}']
        procedure DrawArrow(Source, Target: TPoint; LenArrow: integer; Filled: boolean; Color: TColor);
    end;

    ILine = interface(IInterface)
    ['{B18EAAFF-30DA-4556-91A7-FC15720997E5}']
        procedure DrawLine(Source, Target: TPoint; Color: TColor);
    end;

    IDottedLine = interface(IInterface)
    ['{F989821E-10F1-4A25-AB3F-D4F3720D9409}']
        procedure DrawDottedLine(Source, Target: TPoint; Color: TColor);
    end;

    TDrawable = class(TInterfacedObject, IArrow, ILine, IDottedLine)
        procedure DrawArrow(Source, Target: TPoint; LenArrow: integer; Filled: boolean; Color: TColor); virtual; abstract;
        procedure DrawLine(Source, Target: TPoint; Color: TColor); virtual; abstract;
        procedure DrawDottedLine(Source, Target: TPoint; Color: TColor); virtual; abstract;
    end;

    TAbstractLine = class(TDrawable)
        FCanvas: TCanvas;
        procedure Draw(Source, Target: TPoint; SourceI, TargetI: TPoint; LenArrow: integer; Filled: boolean; Color: TColor); virtual; abstract;
        constructor Create(Canvas: TCanvas);
        //Interface methods
        procedure DrawArrow(Source, Target: TPoint; LenArrow: integer; Filled: boolean; Color: TColor); override;
        procedure DrawLine(Source, Target: TPoint; Color: TColor); override;
        procedure DrawDottedLine(Source, Target: TPoint; Color: TColor); override;
    end;

    TAbstractSimpleLine = class(TAbstractLine)
        procedure Draw(Source, Target: TPoint; SourceI, TargetI: TPoint; LenArrow: integer; Filled: boolean; Color: TColor); override;
    end;

    TAbstractSimpleArrowLine = class(TAbstractLine)
        procedure Draw(Source, Target: TPoint; SourceI, TargetI: TPoint; LenArrow: integer; Filled: boolean; Color: TColor); override;
    end;

    TAbstractSimpleDoubleArrowLine = class(TAbstractLine)
        procedure Draw(Source, Target: TPoint; SourceI, TargetI: TPoint; LenArrow: integer; Filled: boolean; Color: TColor); override;
    end;

    TAbstractDottedLine = class(TAbstractLine)
        procedure Draw(Source, Target: TPoint; SourceI, TargetI: TPoint; LenArrow: integer; Filled: boolean; Color: TColor); override;
    end;

    TAbstractDottedArrowLine = class(TAbstractLine)
        procedure Draw(Source, Target: TPoint; SourceI, TargetI: TPoint; LenArrow: integer; Filled: boolean; Color: TColor); override;
    end;

    TAbstractDottedDoubleArrowLine = class(TAbstractLine)
        procedure Draw(Source, Target: TPoint; SourceI, TargetI: TPoint; LenArrow: integer; Filled: boolean; Color: TColor); override;
    end;

    TAbstractFactory = class(TObject)
    public
        constructor Create;
        destructor Destroy; override;
        function GetLine(Canvas: TCanvas): TAbstractLine; virtual; abstract;
        function GetLineArrow(Canvas: TCanvas): TAbstractLine; virtual; abstract;
        function GetLineDoubleArrow(Canvas: TCanvas): TAbstractLine; virtual; abstract;
    end;

    TSimpleLinesFactory = class(TAbstractFactory)
    public
        constructor Create;
        destructor Destroy; override;
        function GetLine(Canvas: TCanvas): TAbstractLine; override;
        function GetLineArrow(Canvas: TCanvas): TAbstractLine; override;
        function GetLineDoubleArrow(Canvas: TCanvas): TAbstractLine; override;
    end;

    TDottedLinesFactory = class(TAbstractFactory)
    public
        constructor Create;
        destructor Destroy; override;
        function GetLine(Canvas: TCanvas): TAbstractLine; override;
        function GetLineArrow(Canvas: TCanvas): TAbstractLine; override;
        function GetLineDoubleArrow(Canvas: TCanvas): TAbstractLine; override;
    end;

La última aplicación disponible es la siguiente: ThundaxBoxManager v1.0.0 build 44.exe.

0 comments:

Post a Comment