PDA

Ver la Versión Completa : Optimizar con Case XXX of


TIKIMORE
14-05-2003, 11:24:47
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


{**************************************}
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:


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:


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
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".


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í.

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.

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;