¡Muy buen día a todos!
Hola
Hades2600. De antemano te recomiendo que cuando aparezca una excepción en pantalla presiones Ctrl+C para copiar el mensaje al portapapeles y así poder mostrarlo completo.
Cita:
…raised exception class EInvalidCast with message 'Invalid class typecast'…
|
La excepción EInvalidCast corresponde a un molde de tipo inválido hecho con el operador
As. Hice una prueba similar que me dio el mismo error, pero a simple vista no encontré nada en el código fuente, así que marqué la opción
Project-Options-Compiler-Use Debug DCUs para que el depurador se metiera
hasta la cocina.
De esta forma encontré que la excepción se origina en el método TParameters.GetCommand.
Código Delphi
[-]
function TParameters.GetCommand: TADOCommand;
begin
Result := GetOwner as TADOCommand;
end;
GetOwner es un método de toda colección que devuelve el dueño de la misma, es decir, el primer parámetro que es dado cuando se instancia una colección. Como se ve en el código, se asume que el dueño de la colección es un objeto TADOCommand, pero en tu componente usas el propio componente consulta como dueño:
Código Delphi
[-]
constructor TNewADOQuery.Create(aOwner: TComponent); override;
begin
inherited Create(aOwner);
FcpyParams := TParameters.Create(Self, TParameter);
end;
He ahí la causa de la excepción: TParameters.GetCommand trata de moldear un TNewADOQuery como si fuese un TADOCommand. Cabe mencionar que este uso del operador As es necesario porque el método GetOwner está ascendentemente declarado como una función que devuelve un TPersistent. No obstante se espera que el dueño de la colección sea un TADOCommand.
Revisando un poco más el código fuente de ADODB.pas, encontré que el dueño de la propiedad Parameters de un TADOQuery no es el propio componente consulta, sino un subcomponente (componente interno) que la clase declara como propiedad protegida "
Command".
Así pues, la solución a tu caso es que uses tal objeto como primer parámetro en la instanciación del objeto TParameters:
Código Delphi
[-]
FcpyParams := TParameters.Create(Command, TParameter);
No olvides redefinir el destructor Destroy para liberar el objeto FcpyParams, y no dejes de contarnos sobre tus avances.
Al González.
P.D. Concuerdo con
Lepe en que deberías plantearnos el propósito de todo esto.