Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   'Cast' basado en un arreglo. (https://www.clubdelphi.com/foros/showthread.php?t=83864)

TiammatMX 07-08-2013 22:07:36

'Cast' basado en un arreglo.
 
Buen día/tarde/noche según aplique, jóvenes.

A ver si ustedes ven el problema donde yo no lo encuentro. Tengo el siguiente código:
Código Delphi [-]
procedure TformReporteadorV2.ImprimeExportaSIS;
var
   ElReporte : TqckrprtPadre;
   wsNombreArchivo : WideString;
   iIndiceI: Integer;
   aReportes: array of TqckrprtPadre;
begin
   SetLength(aReportes,6);
   aReportes[00] := TqrpSIS_SS_PSQ_001;
   aReportes[01] := TqrpSIS_SS_PSQ_012;
   aReportes[02] := TqrpSIS_SS_PSQ_128;
   aReportes[03] := TqrpSIS_SS_PSQ_129;
   aReportes[04] := TqrpSIS_SS_PSQ_130;
   aReportes[05] := TqrpSIS_SS_PSQ_131;
   for iIndiceI := 0 to Length(aReportes) do
   try
      ElReporte := (aReportes[iIndiceI] as TqckrprtPadre).Create(Self);
      MessageDlg('Reporte '+ElReporte.Name+' creado y funcionando.', mtInformation, [mbOK], 0);
   finally
      ElReporte := nil;
   end;
end;

en el cual intento tomar el reporte que corresponda de acuerdo a un índice que apunta a un elemento de un arreglo, pero aparentemente estoy haciendo algo que no debo por que me manda éste error:

[Error] uformReporteadorV2.pas(5364): Incompatible types: 'TqckrprtPadre' and 'Class reference'

Agradeciendo de antemano. ¿Alguna idea que puedan darme para solucionar ésto?

Casimiro Notevi 07-08-2013 22:45:30

En principio, ahí falta el -1
Código Delphi [-]
for iIndiceI := 0 to Length(aReportes) -1 do

Caminante 07-08-2013 23:21:11

Hola

Me parece que debes declarar la referencia de clase para TqckrprtPadre

Código Delphi [-]
TqckrprtPadreclass= class of TqckrprtPadre;

y luego

Código Delphi [-]
aReportes: array of TqckrprtPadreclass;

Luego

Código Delphi [-]
for iIndiceI := 0 to Length(aReportes) -1 do
   try
      ElReporte := TqckrprtPadreclass(aReportes[iIndiceI]).Create(nil);
      MessageDlg('Reporte '+ElReporte.Name+' creado y funcionando.', mtInformation, [mbOK], 0);
   finally
      ElReporte.free;
      ElReporte := nil
   end;

Espero que sea util

Saludos

cloayza 08-08-2013 00:53:20

Sugiero este pequeño cambio al código de Caminante

Código Delphi [-]
for iIndiceI := 0 to Length(aReportes) -1 do
   try
      //ElReporte := TqckrprtPadreclass(aReportes[iIndiceI]).Create(nil);
     ElReporte := aReportes[iIndiceI].Create(nil);
      MessageDlg('Reporte '+ElReporte.Name+' creado y funcionando.', mtInformation, [mbOK], 0);
   finally
      ElReporte.free;
      ElReporte := nil
   end;

Saludos cordiales

Caminante 08-08-2013 01:02:21

Me parece que si.

Saludos

mamcx 08-08-2013 04:26:58

Si tienes una version de dephi mas moderna, el uso de genericos es mejor.

Ademas, "caminar" una enumeracion es mucho mejor asi:

http://delphi.about.com/od/beginners/a/delphi_loops.htm

Código Delphi [-]
for varName in enumName do
begin
    
end;


Y pusiste el error, pero no cual de todas las lineas lo saco!

TiammatMX 08-08-2013 18:31:12

Cita:

Empezado por mamcx (Mensaje 465189)
...Y pusiste el error, pero no cual de todas las lineas lo saco!...

¿El número entre paréntesis no es el número de línea?
[Error] uformReporteadorV2.pas(5364): Incompatible types: 'TqckrprtPadre' and 'Class reference'

Y de hecho, el error es para cada una de las líneas que se añaden a la matriz.

mamcx 08-08-2013 18:52:12

Si pero la linea 5364 es cual en el codigo que pusiste de ejemplo?

Uno deduce que es

Código Delphi [-]
ElReporte := (aReportes[iIndiceI] as TqckrprtPadre).Create(Self);

Pero es mejor ser explicito.

ecfisa 08-08-2013 21:22:57

Hola Tiammat.

Hay algo que no me quedo claro, ¿ Cual es la declaración de la clase TqckrprtPadre ? (de quién deriva, etc)

Saludos. :)

ozsWizzard 09-08-2013 12:46:05

Yo creo que falta algo así... (Casteo a TQckRptPadre al asignar a ELReporte)

Cita:

Empezado por cloayza (Mensaje 465181)
Sugiero este pequeño cambio al código de Caminante

Código Delphi [-]
for iIndiceI := 0 to Length(aReportes) -1 do
   try
      //ElReporte := TqckrprtPadreclass(aReportes[iIndiceI]).Create(nil);
     ElReporte := TQckRptPadre(aReportes[iIndiceI].Create(nil));
      MessageDlg('Reporte '+ElReporte.Name+' creado y funcionando.', mtInformation, [mbOK], 0);
   finally
      ElReporte.free;
      ElReporte := nil
   end;

Saludos cordiales



En cualquier caso, Caminante ha indicado el camino correcto, en mi opinión.

Yo tengo una unidad donde abro varios Quick report que descienden del mismo y hago lo siguiente:

En una unidad uFrmQR tengo algo así.
Código Delphi [-]
  TFrmQRClass = class of TFrmQR;


pPraram es un parámtetro que tiene el Create de TFrmQr.
Código Delphi [-]
procedure CrearQR(const pClassQr, pParam: String);
var
   i: Integer;
   fc: TFrmQRClass;
   f: TFrmQr;
   Qr: TQuickRep;
   Encontrado: Boolean;
begin
   fc := TFrmQRClass(FindClass(ClassQr));
   f := TFrmQr(fc.Create(Self, pParam));
   try
      i := 0;
      Encontrado := false;
      repeat
         if f.Components[i] is TQuickRep then
         begin
            Qr := (f.Components[i] as TQuickRep);
            Qr.PreviewModal;
            Encontrado := true;
         end;
         inc(i);
      until  (i >= f.ComponentCount) or Encontrado;
   finally
      f.Free;
   end;
end;

Espero te pueda servir de ayuda. Un saludo


La franja horaria es GMT +2. Ahora son las 13:41:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi