Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-05-2003
TIKIMORE TIKIMORE is offline
Miembro
 
Registrado: may 2003
Ubicación: Albacete
Posts: 28
Poder: 0
TIKIMORE Va por buen camino
Optimizar con Case XXX of

Hola a tod@s.

Sé que la pregunta es un poco chorra pero si uno no sabe pues duplica código por un tubo.

Tengo una serie de sentencias "If/then" y quiero agruparlas todas en un "Case/of".

El código sería algo así:

With FormVentas do begin

if ActiveControl =DBEdit1 then
"Lo que sea";
if ActiveControl =DBEdit2 then
"Lo que sea";
.
.
.
.
end;

¿Como sería con un "Case/Of"?, porque son unas 10 sentencias "If/then" y aunque funciona bien se optimizaría con un "Case/Of".

Saludossssssssssssss.
__________________
Saludos a tod@s y no os olvideis de ser felices.
Responder Con Cita
  #2  
Antiguo 14-05-2003
u1025425 u1025425 is offline
Registrado
 
Registrado: may 2003
Ubicación: Girona
Posts: 8
Poder: 0
u1025425 Va por buen camino
En este caso no será posible la utilización de case, ya que éste sólo funciona con tipos ordinales.

Es decir, puedes hacer:

case UnEntero of
1: Algo;
2: OtraCosa;
else LoQueSea;
end;

case UnCaracter of
'a': Algo;
'c': Otro;
end;

pero no puedes hacer:

case objeto of
1: Algo;
2: OtraCosa;
else LoQueSea;
end;

De todos modos, puedes usar "else if" para arreglar un poco el código.

if Objeto = MiObjeto1 then
DoSomething
else if Objeto = MiObjeto2 then
DoSomethingElse
else if Objeto = MiObjeto3 then
CañaAlMonoQueEsDeGoma {I.M.}
else LoQueSea;
Responder Con Cita
  #3  
Antiguo 15-05-2003
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
Lightbulb

Para este tipo de casos, yo tengo esta función:

Código:
{**************************************}
Function MyCase(aCadena:string; aLista: array of String):Integer;
var i:Integer;
begin
 Result:=-1;
 for i:=Low(aLista) to High(aLista) do
    begin
      if Uppercase(aCadena)=Uppercase(aLista[i]) then
         begin
         result:=i;
         break;
         end;
    end;//for
end;
{***************************************}

Y la utilizo de la sigiente manera:

Código:
case MyCase(VariableTexto,['perro','gato','canario']) of
  0:do_perro;
  1:do_gato;
  2:do_canario;
end; //case

para el caso que plantea TikiMore, seria:

Código:
case MyCase(ActiveControl.name,['DBEdit1','dbEdit2','dBeDiT3']) of
0:...
1:...
2:...
end; //case

No es la gran cosa, pero ayuda por lo menos a ordenar el codigo.


Nota: La funcion no es sensible a mayusculas....


chao.
Responder Con Cita
  #4  
Antiguo 15-05-2003
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:
Tikimore escribió
¿Como sería con un "Case/Of"?, porque son unas 10 sentencias "If/then" y aunque funciona bien se optimizaría con un "Case/Of".
Cita:
Gatosoft respondió
No es la gran cosa, pero ayuda por lo menos a ordenar el codigo.
En efecto, hay que tener en cuenta que el uso del case es más que nada para legibilidad del código pero no necesariamente es más eficiente. Hagan una prueba poniendo los mismos casos con if-then-else y con case y miren la ventana del CPU y quizá noten que el case pone más instrucciones.

La solución de Gatosoft es muy elegante pero debe usarse sólo para casos peqeños. Si se coloca en rutinas que se usan muchas veces durante el programa y con muchos casos puede ser contraproducente en cuanto al rendimiento de la aplicación.

// Saludos
Responder Con Cita
  #5  
Antiguo 15-05-2003
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
Hola muchachos, yo pondría el uso de la olvidada propiedad Tag.
Esto es; asignaría a los 10 edit los valores de tag desde 1 hasta 10, y entonces usaría el Case..of mas o menos así.
Código:
With FormVentas do
   Case ActiveControl.tag of 
      1: "Lo que sea";
      2: "Lo que sea";
.
.
.
.
    10:"Lo que sea";
    end;
Espero te sea útil y simplifique tus códigos.
Saludos
Responder Con Cita
  #6  
Antiguo 15-05-2003
u1025425 u1025425 is offline
Registrado
 
Registrado: may 2003
Ubicación: Girona
Posts: 8
Poder: 0
u1025425 Va por buen camino
Pues sí, al fin y al cabo la property Tag sirve para hacer cosas de estas (lo dice en el propio help de Delphi).

Simplemente debes andar con cuidado, porque como te despistes te puedes volver loco revisando Tags, etc...

De todos modos, a mi el "case" nunca me ha gustado demasiado, y menos desde que me acostumbré al "else if".

Para gustos...... los bucles! (que malo :__)

Saludos.
Responder Con Cita
  #7  
Antiguo 16-05-2003
TIKIMORE TIKIMORE is offline
Miembro
 
Registrado: may 2003
Ubicación: Albacete
Posts: 28
Poder: 0
TIKIMORE Va por buen camino
Bueno muchach@s.

Gracias por vuestros consejos ante todo.
Probaré con la propiedad "Tag" a ver que tal resulta.

Saludossssssssssssss.
__________________
Saludos a tod@s y no os olvideis de ser felices.
Responder Con Cita
  #8  
Antiguo 10-07-2010
jg_gutierrez jg_gutierrez is offline
Registrado
 
Registrado: mar 2009
Posts: 5
Poder: 0
jg_gutierrez Va por buen camino
Para este cayo tengo esta otra funcion que podria ser muy ùtil:


{-------------------------------------------------------------------------------------------------
esta funcion es original de Foxpro/Visual Foxpro, le agregas una lista de elementos y te devuelve
true si la cadena contiene alguno de los elementos de la lista y false si no lo tiene.
ejemplo de uso:

VariableTexto:='gato';
if Inlist(VariableTexto,['perro','gato','canario'])=true then
begin
//es un gato
.....
end;
--------------------------------------------------------------------------------------------------}
Function Inlist(aCadena:string; aLista: array of String):boolean;
var i:Integer;
begin
Result:=false;
for i:=Low(aLista) to High(aLista) do
begin
if Uppercase(aCadena)=Uppercase(aLista[i]) then
begin
result:=true;
break;
end;
end;
end;
Responder Con Cita
  #9  
Antiguo 10-07-2010
jg_gutierrez jg_gutierrez is offline
Registrado
 
Registrado: mar 2009
Posts: 5
Poder: 0
jg_gutierrez Va por buen camino
es una mejora del la del colega gatosoft;

Gracias, por la base.
Responder Con Cita
  #10  
Antiguo 10-07-2010
jg_gutierrez jg_gutierrez is offline
Registrado
 
Registrado: mar 2009
Posts: 5
Poder: 0
jg_gutierrez Va por buen camino
si lo que quirees en hacer validaciones dependiento el tipo de objeto, este procedimiento les puede ser muy util.

Para este ejemplo yo lo uso para limpiar todos los objetos en un form, y yo especifico que objetos quiero validar, pero usando tag se pueden implementar otras utilizaciones.
Código Delphi [-]
procedure Tform1.Blank_Screen;
var
   i: Word;
begin
   for i := 0 to self.ComponentCount - 1 do
   begin
      if (self.Components[i] is TEdit) then
         TEdit(self.Components[i]).text := '';
      if (self.Components[i] is TMemo) then
         TMemo(self.Components[i]).text := '';
      if (self.Components[i] is TDateEdit) then
         TDateEdit(self.Components[i]).text := '';
      if (self.Components[i] is TDBLookupComboboxEh) then
         TDBLookupComboboxEh(self.Components[i]).text := '';
      if (self.Components[i] is TRxCalcEdit) then
         TRxCalcEdit(self.Components[i]).text := '';
      if (self.Components[i] is TCurrencyEdit) then
         TCurrencyEdit(self.Components[i]).text := '';
   end;
end;

Última edición por marcoszorrilla fecha: 10-07-2010 a las 19:26:35.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 06:40:19.


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