Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Optimizar con Case XXX of (https://www.clubdelphi.com/foros/showthread.php?t=419)

TIKIMORE 14-05-2003 11:24:47

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.

u1025425 14-05-2003 12:04:24

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;

gatosoft 14-05-2003 23:54:46

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

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

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

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


chao.

roman 15-05-2003 04:13:35

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

Ruben_Cu 15-05-2003 04:22:55

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

u1025425 15-05-2003 08:23:41

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.

TIKIMORE 16-05-2003 09:35:52

Bueno muchach@s.

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

Saludossssssssssssss.

jg_gutierrez 10-07-2010 17:09:52

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;

jg_gutierrez 10-07-2010 17:11:23

es una mejora del la del colega gatosoft;

Gracias, por la base.

jg_gutierrez 10-07-2010 17:21:20

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;


La franja horaria es GMT +2. Ahora son las 20:49:41.

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