Ir al contenido


Foto

Case .. Of con ClassType


  • Por favor identifícate para responder
7 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 13 febrero 2012 - 09:59

Es posible hacer un case con ClassType?, algo como:



delphi
  1. procedure TForm1.Button1Click(sender: TObject);
  2. var idx: Integer;
  3. begin
  4. for idx := 0 to ComponentCount -1 do begin
  5.   Case Components[idx].ClassType Of
  6.     TLabel : //Algo;
  7.     TPanel : //Algo;
  8.   End;
  9. end;
  10. end;



Saludos.
  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.301 mensajes
  • LocationArgentina

Escrito 13 febrero 2012 - 10:16

Hola Fernando, no tengo Delphi a mano ahorita como para probar si funciona pero me inclino por un NO.
Que yo recuerde, el case acepta un tipo ordinal y el ClassType no es un ordinal. A menos que en las nuevas versiones de delphi le hayan dado más potencial al case no veo otra forma que llevar el código por otro lado.

Saludos,


  • 0

#3 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 13 febrero 2012 - 10:17

Y porqué no intentar algo como el case de strings, así creas el vector con las clases que necesites.


Saludos!
  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 13 febrero 2012 - 11:04

Podias meter los nombres de las clases en un tstringlist y usar algo como:



delphi
  1. case lista.indexof(miobjeto.classname) do
  2. case lista.indexof('TLabel'):
  3. ...
  4. end;



El segundo uso de indexof no se si sera válido para un case, pero bueno, usais 0, 1, 2 sabiendo en que posicion pusisteis cada uno y listo!

ojo, no le he probado...  *-)
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.301 mensajes
  • LocationArgentina

Escrito 13 febrero 2012 - 11:44

Hola,
Pues no hay otra que recurrir a "malabares" como los que te comentan. A menos que logres llevar el proceso o funcionalidad que requieras de otra forma... tal vez descomponiendo el problema de una nueva perspectiva.

Si ese "algo" a hacer se pudiera expresar en algo común a todas las clases que intervienen (método virtual y/o abstracto), y cada clase del case fuera una extensión de esa clase base (y redefiniendo el método en cuestión) entonces se podría hacer uso de las referencias de clases:

1) Declarar, un tipo de clase de la clase base y común a todas:


delphi
  1. type
  2. TMyTypeClass = class of TClaseBase;



2) Dispones de una variable de la clase base:


delphi
  1. var TypeClass: TMyTypeClass;



3) Luego simplemente itero extrayendo la referencia a la clase y utilizando dicho objeto:



delphi
  1. for idx := 0 to ComponentCount - 1 do
  2. begin
  3. TypeClass := TMyTypeClass(Components[ibx]);
  4. TProductoBase(TypeClass).HacerAlgo;
  5. end;



Siendo este HacerAlgo el método en cuestión  ;)

No he probado el código que expuse. Lo escribí de memoria pero la idea se entiende.

El problema es que para el caso de Fernando no resulta tan sencillo de llevarlo a cabo ya que en última sigue teniendo el mismo problema y debería hacer tantos casts sobre TypeClass como clases que tuviera en el case:


delphi
  1. TLabel().xxxx;
  2. TPanel().xxx;



Por más que se utilizara un:



delphi
  1. TComponentClass = class of TComponent;



Y no hay modo directo, al menos que yo conozca, de saber que clase utilizar para el cast.

La única vía que se me ocurre es aprovechar el ClassName ya del componente, e ingenierarselas para asociar ese nombre, con cada valor del case, como por ejemplo la de utilizar listas de strings.

Saludos,
  • 0

#6 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 14 febrero 2012 - 02:12

Buenas,

Con el ClassName (que retorna un string) y este truquillo no tendrías que tener problema en hacer el case que quieres

Nos leemos

  • 0

#7 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 14 febrero 2012 - 07:23

Buenas,

Con el ClassName (que retorna un string) y este truquillo no tendrías que tener problema en hacer el case que quieres

Nos leemos


A ese mismo me referí (y)


Saludos!
  • 0

#8 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 14 febrero 2012 - 08:47

Vaya que se me ha pasado el truco del case of string :s, gracias amigo cadetill.

@Delphius: gracias por la excelente explicación (y).

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.