Ver Mensaje Individual
  #1  
Antiguo 04-05-2018
QuiqueSalamanca QuiqueSalamanca is offline
Miembro
 
Registrado: mar 2014
Posts: 35
Reputación: 0
QuiqueSalamanca Va por buen camino
Migración QReport 3 a QReport 6

Buenos días a todos, hacía mucho que no pasaba por aquí.

Estoy migrando una aplicación desde Delphi 7 a Delphi 10.2.3 Tokyo.

Os pongo primero en antecendentes, conseguí migrar dicha aplicación a Delphi XE7, compilada perfectamente (con el QuickReport 5.05). Ahora la empresa para la que trabajo ha comprado la versión 10.2.3 y ando en la migración (que no debería dar ningún problema, excepto algunos componentes nuevos...).

Todos los componentes de terceros están instalados y migrados (los gratuitos y antiguos que vienen desde D7) correctamente (de hecho los he probado en aplicaciones independientes). El problema me surge a la hora de compilar, me lleva a la unit qrpcontrols y me da un error de incompatibilidad de tipos.

Lo raro es que la incompatibilidad de tipos que me da es "TField" y "TBlobField", aquí me descuadra todo porque un "TBlobField" hereda de "TField".

Este código me compila y entra en el IF correspondiente sin problemas:

Código Delphi [-]
var
   oField     : TField;
   oBlobField : TBlobField;
begin  
  oField     := TField.Create( Self );
  oBlobField := TBlobField.Create( Self );

  if oBlobField is TField then
     ShowMessage( 'Entra en TField' );

  if oField is TBlobField then
    ShowMessage( 'No debe entrar nunca.' );

  oField.Free;
  oBlobField.Free;
end;

Pues en la unit de qrpcontrols me da el error en esta parte:

Código Delphi [-]
procedure TQRPDBImage.LoadPicture;
var
  S: String;
begin
  if (DataField<>'') and (Dataset<>NIL) then
    begin
      try
        If Not (DataSet.FindField(DataField) is TBlobField) Then // --> En esta linea me da el error
          begin
            S:=ExpandFileName(Dataset.FindField(DataField).AsString);
            If ExtractFileExt(S)='' Then S:=ChangeFileExt(S,'.BMP');
            If FileExists(S) Then Picture.LoadFromFile(S);
          end
        Else
          Picture.Assign(Dataset.FindField(DataField));
      except
      end;
    end;
end;

Os pongo la clase TQRPDBImage:

Código Delphi [-]
TQRPDBImage = class(TQRDBImage)
  private
    FFixBottomPosition       : Boolean;
    FStretchHeightWithBand   : Boolean;
  protected
    procedure Print(OfsX, OfsY : integer); override;
  public
    procedure LoadPicture;
  published
    property FixBottomPosition: Boolean Read FFixBottomPosition
                                        Write FFixBottomPosition;
    property StretchHeightWithBand: Boolean Read FStretchHeightWithBand
                                            write FStretchHeightWithBand;
  end;

Hereda de esta que está en la unit QRCtrls:

Código Delphi [-]
  TQRDBImage = class(TQRPrintable)
  private
    FField : TField;
    FDataSet : TDataSet;
    FDataField : string;
    FPicture: TPicture;
    FStretch: boolean;
    FCenter: boolean;
    FPictureLoaded: boolean;
    procedure PictureChanged(Sender: TObject);
    procedure SetCenter(Value: Boolean);
    procedure SetDataField(const Value: string);
    procedure SetDataSet(Value: TDataSet);
    procedure SetPicture(Value: TPicture);
    procedure SetStretch(Value: Boolean);
  protected
    function GetPalette: HPALETTE; override;
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
    procedure Paint; override;
    procedure Prepare; override;
    procedure Print(OfsX, OfsY : integer); override;
    procedure UnPrepare; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure GetExpandedHeight(var newheight : extended ); override;
    procedure GetFieldString( var DataStr : string); override;
    procedure LoadPicture;
    property Field: TField read FField;
    property Picture: TPicture read FPicture write SetPicture;
  published
    property Center: boolean read FCenter write SetCenter default True;
    property DataField: string read FDataField write SetDataField;
    property DataSet: TDataSet read FDataSet write SetDataSet;
    property Stretch: boolean read FStretch write SetStretch default False;
    property ActiveInPreview;
  end;

Estas funciones son idénticas y no han cambiado nada en QuickReport 5.05 y en XE7 funciona.

Me estoy volviendo un poco loco

Gracias de antemano.
Responder Con Cita