Capítulo 29: Cambiar el cursor en formularios EPLAN
5 min de lectura
Parte VIII: Windows Forms - Sección 16: Interfaces gráficas - Nivel: Intermedio
Objetivos de aprendizaje
Al finalizar este capítulo serás capaz de:
- Usar
Cursors.WaitCursorpara indicar que el sistema está ocupado - Entender el patrón
try-finallyaplicado a interfaces gráficas - Mejorar la experiencia de usuario (UX) en operaciones de duración media
Requisitos previos
- Capítulo 28 (Formulario completo)
- Concepto de Try-Finally (Capítulo 11)
Introducción: Feedback Visual
Si el usuario hace clic en "Procesar" y el programa se congela por 3 segundos sin feedback, pensará que se bloqueó. Para operaciones cortas (1-4 segundos), una barra de progreso es excesiva. La solución estándar: Cambiar el cursor del mouse a un reloj de arena (o círculo giratorio).
1. La clase Cursor
Windows Forms proporciona la clase estática Cursor y la propiedad Current.
using System.Windows.Forms;
// Cambiar a "Cargando"
Cursor.Current = Cursors.WaitCursor;
// Volver a "Flecha normal"
Cursor.Current = Cursors.Default;
2. El patrón Try-Finally (CRÍTICO)
Si cambias el cursor y tu código falla antes de restaurarlo, el usuario se quedará con el reloj de arena para siempre (o hasta que reinicie EPLAN).
Por eso, SIEMPRE debes usar try-finally.
2.1 Estructura correcta
private void BtnProcesar_Click(object sender, EventArgs e)
{
try
{
// 1. Cambiar cursor
Cursor.Current = Cursors.WaitCursor;
// 2. Operación pesada
RealizarTrabajo();
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
}
finally
{
// 3. Restaurar cursor (SIEMPRE se ejecuta)
Cursor.Current = Cursors.Default;
}
}
3. Ejemplo práctico: Script con feedback
Vamos a mejorar nuestro formulario anterior. Cuando el usuario exporta, cambiamos el cursor.
Basado en EPLAN-Scripting-4.0/09_Forms/03_Cursor.cs:
using System;
using System.Drawing;
using System.Threading; // Para simular delay
using System.Windows.Forms;
using Eplan.EplApi.Scripting;
public class FormularioCursor : Form
{
private Button btnProcess;
public FormularioCursor()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.Text = "Ejemplo de Cursor";
this.Size = new Size(300, 150);
this.StartPosition = FormStartPosition.CenterScreen;
btnProcess = new Button();
btnProcess.Text = "Procesar Datos";
btnProcess.Location = new Point(80, 40);
btnProcess.Size = new Size(120, 30);
btnProcess.Click += new EventHandler(BtnProcess_Click);
this.Controls.Add(btnProcess);
}
private void BtnProcess_Click(object sender, EventArgs e)
{
// Deshabilitar botón para evitar doble clic
btnProcess.Enabled = false;
try
{
// CAMBIAR CURSOR
Cursor.Current = Cursors.WaitCursor;
// Simular trabajo pesado (3 segundos)
// En la vida real, aquí iría tu lógica de EPLAN
Thread.Sleep(3000);
MessageBox.Show("Proceso terminado correctamente.");
}
finally
{
// RESTAURAR CURSOR Y BOTÓN
Cursor.Current = Cursors.Default;
btnProcess.Enabled = true;
}
}
[Start]
public void Function()
{
FormularioCursor frm = new FormularioCursor();
frm.ShowDialog();
}
}
4. Tipos de Cursores útiles
Cursors.WaitCursor: Reloj de arena. Sistema bloqueado.Cursors.AppStarting: Flecha + Reloj. Trabajando en segundo plano, pero interactivo.Cursors.Hand: Mano. Usar sobre enlaces o botones especiales.Cursors.Help: Flecha + Interrogación. Para modo de ayuda.
Resumen
- Usa
Cursor.Current = Cursors.WaitCursorpara operaciones de 1 a 4 segundos. - Para operaciones más largas, usa
Progress(Capítulo 26). - Siempre restaura el cursor en un bloque
finally. - Deshabilitar el botón que inició la acción (
Enabled = false) es una buena práctica complementaria.
Conexiones
Capítulo anterior
Capítulo 28: Formulario completo
Próximo capítulo
Ver capítulos siguientes
Pondremos todo en práctica con una aplicación real para buscar y abrir proyectos.