PDA

Ver la Versión Completa : Try Except --finally--


Caral
02-10-2006, 20:24:10
Hola de nuevo, Otra pregunta mas
Como quito todo esto que me desagrada usando try, execpt o algo asi, ya que como vereis uso demasiados if, si no, no me da el resultado que busco.
En el caso de Case of, no lo entiendo bien por eso no lo uso.
Hago esto:

if ComboBox3.Text = 'Multiplicar' Then
Edit2.Text := FloatToStr(StrToFloat(ComboBox1.Text) * StrToFloat(ComboBox2.Text));
If Edit1.Text <> Edit2.Text Then
Label1.Caption:= 'Tu Respuesta es Incorrecta';
If Edit1.Text <> Edit2.Text Then
Image1.Visible:= False;
If Edit1.Text <> Edit2.Text Then
Image2.Visible:= True;
If Edit1.Text <> Edit2.Text Then
Image3.Visible:= False;
If Edit1.Text <> Edit2.Text Then
Button2.Visible:= False;
If Edit1.Text = Edit2.Text Then
Label1.Caption:= 'Bien Hecho Respuesta Correcta';
If Edit1.Text = Edit2.Text Then
Image1.Visible:= True;
If Edit1.Text = Edit2.Text Then
Image2.Visible:= False;
If Edit1.Text = Edit2.Text Then
Image3.Visible:= False;
If Edit1.Text = Edit2.Text Then
Button2.Visible:= False;

Como veis es una repeticion de lo mismo, pero si no lo hago el if solamente ve el primer dato y obvia los demas.
Ya se codigo de principiante.:D
Saludos y Gracias
Saludos

maeyanes
02-10-2006, 20:37:01
Para simplificar algunas líneas puedes hacer:


var
Correcto: Boolean;

begin
if ComboBox3.Text = 'Multiplicar' Then
Edit2.Text := FloatToStr(StrToFloat(ComboBox1.Text) * StrToFloat(ComboBox2.Text));
Correcto := Edit1.Text = Edit2.Text;
If Correcto Then
Labe1.Caption := 'Bien Hecho Respuesta Correcta'
else
Label1.Caption:= 'Tu Respuesta es Incorrecta';
Image1.Visible := not Correcto;
Image2.Visible := Correcto;
Image3.Visible := not Correcto;
Button2.Visible := not Correcto
end



Saludos...

seoane
02-10-2006, 20:37:39
Vamos por partes, yo no veo necesario de try ... except, yo más bien te aconsejaria el uso de begin ... end. Es decir:


if ComboBox3.Text = 'Multiplicar' Then
Edit2.Text := FloatToStr(StrToFloat(ComboBox1.Text) * StrToFloat(ComboBox2.Text));
if Edit1.Text <> Edit2.Text Then
begin
Label1.Caption:= 'Tu Respuesta es Incorrecta';
Image1.Visible:= False;
Image2.Visible:= True;
Image3.Visible:= False;
end else
begin
Label1.Caption:= 'Bien Hecho Respuesta Correcta';
Image1.Visible:= True;
Image2.Visible:= False;
Image3.Visible:= False;
end;
Button2.Visible:= False;

dec
02-10-2006, 20:41:12
Hola,

A mí se me ocurre a bote pronto algo así:


Image3.Visible:= False;
Button2.Visible:= False;

if ComboBox3.Text = 'Multiplicar' then
Edit2.Text := FloatToStr(StrToFloat(ComboBox1.Text) * StrToFloat(ComboBox2.Text));

if Edit1.Text <> Edit2.Text then
begin
Label1.Caption:= 'Tu Respuesta es Incorrecta';
Image1.Visible:= False;
Image2.Visible:= True;
end
else
begin
Label1.Caption:= 'Bien Hecho Respuesta Correcta';
Image1.Visible:= True;
Image2.Visible:= False;
end;


Edito: Como sigamos "refactorizando" al final no sabremos si la respuesta fue correcta o qué. :D :D :D :D

dec
02-10-2006, 20:48:38
Hola,


Para simplificar algunas líneas [de código fuente] (...)


Yo pienso que a veces pueden y aun deben "duplicarse" ciertas líneas con el fin de conseguir cierta legilibilidad en el código fuente. Es por eso que suelo utilizar el condicional "if" en lugar del operador "ternario" en JavaScript, por ejemplo, empero, es sólo un ejemplo. En todo caso ya digo: a veces creo que es mejor "duplicar" algo (aparentemente), si esto consigue que el código fuente se entienda mejor.

Claro que es mi opinión y no pretendo decir nada en contra de ti Maeyanes, ni mucho menos. ;)

Por ejemplo, el bloque de código que he expuesto anteriormente puede "leerse" más o menos rápida y eficazmente sólo por sus comentarios:


// Siempre
Image3.Visible:= False;
Button2.Visible:= False;

// A veces
if ComboBox3.Text = 'Multiplicar' then
Edit2.Text := FloatToStr(StrToFloat(ComboBox1.Text) * StrToFloat(ComboBox2.Text));

// Depende
if Edit1.Text <> Edit2.Text then
begin
Label1.Caption:= 'Tu Respuesta es Incorrecta';
Image1.Visible:= False;
Image2.Visible:= True;
end
else
begin
Label1.Caption:= 'Bien Hecho Respuesta Correcta';
Image1.Visible:= True;
Image2.Visible:= False;
end;

maeyanes
02-10-2006, 20:52:40
Bueno, yo creo que el código que puse es perfectamente legible, al usar la variable lógica Correcto.

Pero bueno, cada quien tiene su estilo... :D


Saludos...

Caral
02-10-2006, 20:54:24
Gracias a Todos
Seoane, por alguna razon que desconozco con esta forma que me indicas, que ya intente, aveces funciona y aveces no, es estraño que pase esto ya que se supone que un codigo o funciona o no, pero pasa, voy a revisarlo denuevo ya que tal vez el begin no lo coloque en donde debia.
Muchas gracias a todos por sus respuestas.
saludos

dec
02-10-2006, 20:58:25
Hola,


Bueno, yo creo que el código que puse es perfectamente legible, al usar la variable lógica Correcto.


Conste que yo no dije lo contrario. Aunque, no lo voy a negar, acaso fue la comparación de tu código con el mío lo que me llevó a pensar y a exponer mi anterior opinión. Ahora, llevas razón, que cada cual eliga: mientras no te tenga a sueldo no podré exigirte (y tú negarte, por supuesto) que escribas el código de una determinda manera. :D :D :D

De todos modos, efectivamente, una cosa es seguir un determinado "patrón" escribiendo el código y otra la "inteligibilidad" de este... en esto puede que yo no sea quién para decir que una manera es mejor que otra... únicamente puedo limitarme a exponer mi opinión y esperar que alguien no la encuentre del todo descabellada: o lo contrario, que me rebata la misma con algún argumento que me haga rectificar. ;)

Caral
02-10-2006, 21:48:17
Para seguir con la duda
La palabra (else) no significa en este caso (de lo contrario) osea que:
If x = Q then
tal cosa
else // de lo contrario
tal otra cosa
O algo asi, con esto me queda una duda en el codigo de Maeyanes:


// Varible general perfecto
var
Correcto: Boolean;



// evento perfecto
begin
if ComboBox3.Text = 'Multiplicar' Then
Edit2.Text := FloatToStr(StrToFloat(ComboBox1.Text) * StrToFloat(ComboBox2.Text));
Correcto := Edit1.Text = Edit2.Text;
If Correcto Then
Labe1.Caption := 'Bien Hecho Respuesta Correcta'

// Aqui empieza mi duda
else
// Aqui empieza el (de lo Contrario), si es asi leera ? (Not Correcto) ?
// Ya que a mi modo de ver si la opcion es correcta el else no se dara

Label1.Caption:= 'Tu Respuesta es Incorrecta';
Image1.Visible := not Correcto;
Image2.Visible := Correcto;
Image3.Visible := not Correcto;
Button2.Visible := not Correcto
end;

Lo comento porque este codigo es nuevo para mi y veo que es realmente practico, pero creo que talvez por la prisa no se vieron ciertas cosas o bien estoy equivocado, me gustaria que me lo indicaran, si son tal amables.
Gracias

dec
02-10-2006, 21:53:53
Hola,

Yo diría que lo que ocurre es que una cosa no quita la otra, es decir, efectivamente, el "else" de una condición indica "el camino alternativo a seguir", pero, dentro del bloque "else" es perfectamente posible utilizar el valor de la variable "Correcto".

Piensa además que la variable "Correcto" se "inicializa" antes de la condición, esto es, está disponible para cualquiera de los caminos que se tomen en esta. Otra cosa sería algo así:


var
correcto: boolean;
begin
if LoQueSea then
correcto := true;
else
Edit1.Visible := correcto;
end;


Creo que el propio compilador se encargaría de alertarte de que el mismo no es del todo correcto, valga la redundancia, puesto que la variable "correcto" no estaría inicializada en el bloque "else" en este caso. Ahora bien, hacer esto no implica ningún problema y puede ser lo que se precise:


var
correcto: boolean;
begin
correcto := true;

if LoQueSea then
correcto := false;
else
Edit1.Visible := correcto;

{...}
end;


¿Qué valor tendría "Visible" si llegara a ejecutarse el código del bloque "else"? Efectivamente, "true", puesto que ese es el valor que damos a la variable "correcto" anteriormente.

Bicho
02-10-2006, 21:58:14
Hola yo lo que creo que está preguntando en este caso es si ésto se ejcutará en caso de que el valor de correcto sea true

Image1.Visible := not Correcto;
Image2.Visible := Correcto;
Image3.Visible := not Correcto;
Button2.Visible := not Correcto

Para responderte, si se ejecuta, ya que esas instrucciones estan fuera del if o el else. Piensa que para que se ejecuten dentro del if o el else deben estar incluidas ademas dentro de un bloque begin..end.

else begin
Label1.Caption:= 'Tu Respuesta es Incorrecta';
Image1.Visible := not Correcto;
Image2.Visible := Correcto;
Image3.Visible := not Correcto;
Button2.Visible := not Correcto
end;

En este caso no se ejecutaria si correcto fuera true. Creo que es eso lo que querías decir.

Espero te sirva.

Saludos

Caral
02-10-2006, 22:03:37
Señores muy amables
Mi duda esta completamente evacuada y realmente he aprendido mucho
Muchisimas gracias.
Saludos

maeyanes
02-10-2006, 22:09:40
Aclarando un poco más las cosas, esto:

If Correcto Then
Label1.Caption := 'Bien Hecho Respuesta Correcta'
else
Label1.Caption:= 'Tu Respuesta es Incorrecta';

Es equivalente a esto:

If Correcto Then
begin
Label1.Caption := 'Bien Hecho Respuesta Correcta'
end
else
begin
Label1.Caption:= 'Tu Respuesta es Incorrecta'
end;


Saludos...

dec
02-10-2006, 22:12:24
Hola,

O lo que es lo mismo, no es preciso utilizar un bloque "begin .. end" si sólo se precisa una instrucción a continuación del "if" o "else" de turno. El bloque "begin .. end", precisamente, sirve para poder incluir tantas instrucciones como sean precisas. ;)