Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Excepcion al comparar una clase en un if (https://www.clubdelphi.com/foros/showthread.php?t=11970)

nefy 01-07-2004 01:55:05

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.

roman 01-07-2004 02:58:05

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

nefy 01-07-2004 03:15:26

La excepcion es como "Invalid ClassType" (no tengo la excepcion aqui) pero es de EInvalidClassType.

Salu2.

delphi.com.ar 01-07-2004 15:56:12

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.

roman 01-07-2004 16:33:26

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 :p

// Saludos

nefy 01-07-2004 17:41:27

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.

delphi.com.ar 01-07-2004 17:43:30

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.

roman 01-07-2004 17:47:35

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.

:D

delphi.com.ar 01-07-2004 17:48:36

Cita:

Empezado por roman
En cuyo caso yo cambiaría el nombre de la rutina de CerrarDataSets a CerrarTablesYQuerys.

:D

:D!... ¡No me percaté de ese detalle!


La franja horaria es GMT +2. Ahora son las 01:03:57.

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