anchor.diff:    TAxisKind = (Vertical,Horizontal);
   
     TDragSubject = (MapObject, MapTemplate);
  -
  +  TfMain = class;
     { TDragProxy }
   
     TDragProxy = class(TDragObject)
  +  protected
  +    FOwner: TFMain;
     public
  +    constructor Create(AOwner: TfMain); reintroduce;
  +    destructor Destroy; override;
       procedure Drop; virtual; abstract;
       procedure Render(x,y: integer); virtual; abstract;
     end;
  
positive.code: procedure TfMain.DoStartDrag(var DragObject: TDragObject);
  begin
    case FNextDragSubject of
      TDragSubject.MapObject: DragObject := TObjectDragProxy.Create(FSelectedObject, FMouseTileX, FMouseTileY);
      TDragSubject.MapTemplate: DragObject := TTemplateDragProxy.Create(FSelectedTemplate);
    else
    inherited DoStartDrag(DragObject);
    end;
  
negative.code:     FShiftX, FShiftY: Integer;
      FDraggingObject: TMapObject;
    public
      constructor Create(AOwner: TfMain;ADraggingObject: TMapObject; CurrentX, CurrentY: integer);
      procedure Drop; override;
      procedure Render(x, y: integer); override;
    end;
  