Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-07-2004
Avatar de nefy
nefy nefy is offline
No confirmado
 
Registrado: nov 2003
Posts: 171
Poder: 0
nefy Va por buen camino
Excepcion al comparar una clase en un if

Hola se genera una excepcion en la siguiente rutina:
Código:
procedure CerrarDatasets(ADM: TDataModule);
var j:Integer;
begin
with ADM do
  begin
  for j := 0 to ComponentCount - 1 do
    begin
    ShowMessage(Components[j].ClassName);
    if (components[j] is TTable) then  //Aqui al comparar truena
      begin
      (components[j] as TTable).Close;
      end;
    if (components[j] TQuery) then
      (components[j] as TQuery).Close;
    end;
  end;
end;
Lo extraño es q tengo otra rutina q tiene la misma sintaxis solo q aquella abre los TTables y Querys existentes en el modulo de datos indicado en el parametro de la funcion.

Asi q obviamente existe un error pero no lo ubico, espero ustedes lo puedan ver.

Salu2.
Responder Con Cita
  #2  
Antiguo 01-07-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Sería interesante que nos contaras qué tipo de excepción se genera.

Mientras tanto te comento que siendo TTable y TQuery descendientes de TDataSet y dado que el método Close (así como Open) está definido desde este ancestro común, puedes simplificar tu rutina:

Código Delphi [-]
procedure CerrarDatasets(ADM: TDataModule);
var j:Integer;
begin
with ADM do
  begin
  for j := 0 to ComponentCount - 1 do
    begin
    ShowMessage(Components[j].ClassName);

    if (components[j] is TDataSet) then
      TDataSet(components[j]).Close;
    end;
  end;
end;

Nota además que el uso del operador as es innecesario ya que este operador básicamente es una combinación del operador is con el moldeo de tipos normal, y dado que previamente usas is estarías haciendo una doble verificación.

// Saludos

Última edición por roman fecha: 01-07-2004 a las 03:02:05.
Responder Con Cita
  #3  
Antiguo 01-07-2004
Avatar de nefy
nefy nefy is offline
No confirmado
 
Registrado: nov 2003
Posts: 171
Poder: 0
nefy Va por buen camino
La excepcion es como "Invalid ClassType" (no tengo la excepcion aqui) pero es de EInvalidClassType.

Salu2.
Responder Con Cita
  #4  
Antiguo 01-07-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por nefy
Código:
if (components[j] TQuery) then
¿Esa línea te compila?... simplemente te falta el is!
Por otor lado... ¿En qué línea te da el error?


Cita:
Empezado por roman
Nota además que el uso del operador as es innecesario ya que este operador básicamente es una combinación del operador is con el moldeo de tipos normal, y dado que previamente usas is estarías haciendo una doble verificación.
Mmmmm... en tu código cambiaste el as por un cast del tipo TClase(Variable), pero la finalidad es la misma.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 01-07-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por delphi.com.ar
Mmmmm... en tu código cambiaste el as por un cast del tipo TClase(Variable), pero la finalidad es la misma.
Lo cambié precisamente por ser innecesario

// Saludos
Responder Con Cita
  #6  
Antiguo 01-07-2004
Avatar de nefy
nefy nefy is offline
No confirmado
 
Registrado: nov 2003
Posts: 171
Poder: 0
nefy Va por buen camino
Solo una duda, no causara problemas con otros componentes q tambien sean descendientes de TDataSet??. De hecho ya habia pensado de esa manera (usar TDataset como clase a compara), sin embargo como no tengo mucha experiencia al respecto decidi copiar el metodo del Moderador Loco Juan Antonio pues él en otro hilo me habia propuesto dicha rutina.
Responder Con Cita
  #7  
Antiguo 01-07-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Eso lo tienes que evaluar vos... si querés cerrar todos los datasets, el código de roman, si quieres solamente cerrar los TTable y TQuery´s y sus descendientes, tu código.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #8  
Antiguo 01-07-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por delphi.com.ar
si quieres solamente cerrar los TTable y TQuery´s y sus descendientes, tu código.
En cuyo caso yo cambiaría el nombre de la rutina de CerrarDataSets a CerrarTablesYQuerys.

Responder Con Cita
  #9  
Antiguo 01-07-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por roman
En cuyo caso yo cambiaría el nombre de la rutina de CerrarDataSets a CerrarTablesYQuerys.

!... ¡No me percaté de ese detalle!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 08:17:15.


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
Copyright 1996-2007 Club Delphi