Ver Mensaje Individual
  #3  
Antiguo 21-11-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡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);   { <-- Self es la instancia TNewADOQuery }
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.

Última edición por Al González fecha: 21-11-2007 a las 17:36:28.
Responder Con Cita