Capítulo 24: Decider, preguntar al usuario en EPLAN
6 min de lectura
Parte V: Interacción con usuario - Sección 10: Decisiones interactivas - Nivel: Principiante
Objetivos de aprendizaje
Al finalizar este capítulo serás capaz de:
- Entender qué es Decider y por qué existe
- Comprender la diferencia entre Decider y MessageBox
- Usar Decider para hacer preguntas al usuario
- Conocer los diferentes tipos de decisiones (OK, Yes/No, Yes to All/No to All, etc.)
- Procesar la respuesta del usuario con switch
- Aplicar Decider en flujos de trabajo EPLAN
Requisitos previos
- Conocer MessageBox.Show()
- Entender if y switch
- Saber usar enums
- Conocer métodos con valor de retorno
Introducción: Más allá de MessageBox
Hasta ahora has usado MessageBox.Show() para interactuar con el usuario:
DialogResult resultado = MessageBox.Show(
"¿Continuar?",
"Pregunta",
MessageBoxButtons.YesNo
);
if (resultado == DialogResult.Yes)
{
// Continuar
}
Esto funciona, pero Decider ofrece funcionalidades adicionales específicas de EPLAN:
- Opciones "Sí a todo" y "No a todo" para procesamiento en lote
- Checkbox "No volver a mostrar este mensaje"
- Mejor integración con el sistema de settings de EPLAN
- Iconos personalizables
Decider es la forma nativa de EPLAN para hacer preguntas al usuario.
1. ¿Qué es Decider?
1.1 Definición
Decider es una clase de EPLAN API que muestra diálogos de decisión al usuario y retorna su elección.
¿Dónde se define?
using Eplan.EplApi.Base;
1.2 Diferencias con MessageBox
| Aspecto | MessageBox | Decider |
|---|---|---|
| Origen | .NET Framework | EPLAN API |
| Integración | Windows genérico | EPLAN específico |
| Opciones | OK, Yes/No, Yes/No/Cancel | + Yes to All, No to All |
| Checkbox | No | Sí ("No volver a mostrar") |
| Settings | No persiste | Puede persistir preferencias |
| Iconos | Estándar Windows | EPLAN personalizables |
Cuándo usar cada uno:
- MessageBox: Mensajes simples, confirmaciones básicas
- Decider: Procesos en lote, opciones "para todo", configuraciones persistentes
2. Cómo usar Decider
2.1 Sintaxis básica
Decider decider = new Decider();
EnumDecisionReturn respuesta = decider.Decide(
tipoDecision, // Tipo de diálogo (OK, Yes/No, etc.)
"Mensaje", // Texto a mostrar
"Título", // Título del diálogo
valorPorDefecto, // Qué botón está seleccionado por defecto
valorSiEscPressed // Qué retornar si se presiona Esc
);
Retorno: Un enum EnumDecisionReturn que indica qué botón presionó el usuario.
2.2 Ejemplo básico del script oficial
Basado en EPLAN-Scripting-4.0/04_CodeFlow/08_Decider.cs:
using System.Windows.Forms;
using Eplan.EplApi.Base;
using Eplan.EplApi.Scripting;
public class DeciderBasico
{
[Start]
public void Function()
{
// Crear instancia de Decider
Decider decider = new Decider();
// Mostrar diálogo Yes/No
EnumDecisionReturn respuesta = decider.Decide(
EnumDecisionType.eYesNoDecision, // Tipo: Yes/No
"¿Desea continuar?", // Mensaje
"Confirmación", // Título
EnumDecisionReturn.eYES, // Botón por defecto: Yes
EnumDecisionReturn.eNO // Si presiona Esc: No
);
// Procesar la respuesta
switch (respuesta)
{
case EnumDecisionReturn.eYES:
MessageBox.Show("Usuario eligió: Sí");
break;
case EnumDecisionReturn.eNO:
MessageBox.Show("Usuario eligió: No");
break;
}
}
}
¿Qué hace?
- Crea una instancia de
Decider - Muestra un diálogo con botones "Sí" y "No"
- El usuario elige
- Retorna
EnumDecisionReturn.eYESoEnumDecisionReturn.eNO - El código procesa la respuesta con
switch
3. Tipos de decisiones
3.1 EnumDecisionType
EPLAN ofrece varios tipos de diálogos:
| Tipo | Botones que muestra | Cuándo usar |
|---|---|---|
eOkDecision | OK | Solo informar (sin decisión real) |
eYesNoDecision | Sí, No | Pregunta simple con dos opciones |
eYesNoCancelDecision | Sí, No, Cancelar | Tres opciones (guardar/no guardar/cancelar) |
eYesAllNoAllDecision | Sí, No, Sí a todo, No a todo | Procesar múltiples elementos |
eRetryCancelDecision | Reintentar, Cancelar | Después de un error |
eOkCancelDecision | OK, Cancelar | Confirmación de acción |
3.2 Ejemplo: Solo OK (informativo)
Decider decider = new Decider();
decider.Decide(
EnumDecisionType.eOkDecision,
"El proceso se ha completado correctamente.",
"Información",
EnumDecisionReturn.eOK,
EnumDecisionReturn.eOK
);
Uso: Similar a MessageBox pero con estilo EPLAN.
3.3 Ejemplo: Yes to All / No to All
Decider decider = new Decider();
EnumDecisionReturn respuesta = decider.Decide(
EnumDecisionType.eYesAllNoAllDecision,
"¿Procesar este elemento?",
"Procesando lote",
EnumDecisionReturn.eYES,
EnumDecisionReturn.eNO
);
switch (respuesta)
{
case EnumDecisionReturn.eYES:
// Procesar este elemento solamente
break;
case EnumDecisionReturn.eNO:
// Saltar este elemento solamente
break;
case EnumDecisionReturn.eYES_ALL:
// Procesar este Y todos los siguientes sin preguntar
break;
case EnumDecisionReturn.eNO_ALL:
// Saltar este Y todos los siguientes sin preguntar
break;
}
Uso: Procesar listas o lotes donde el usuario puede querer aplicar la misma decisión a todos.
4. Parámetros avanzados de Decide()
4.1 Versión completa con todos los parámetros
EnumDecisionReturn respuesta = decider.Decide(
tipoDecision, // EnumDecisionType
mensaje, // string: Texto a mostrar
titulo, // string: Título del diálogo
valorPorDefecto, // EnumDecisionReturn: Botón seleccionado por defecto
valorSiEsc, // EnumDecisionReturn: Qué retornar si presiona Esc
nombreSetting, // string: Nombre del setting para persistir (opcional)
mostrarCheckbox, // bool: Mostrar checkbox "No volver a mostrar" (opcional)
icono // EnumDecisionIcon: Icono a mostrar (opcional)
);
4.2 Ejemplo con icono y checkbox
Del script oficial:
Decider decider = new Decider();
EnumDecisionReturn respuesta = decider.Decide(
EnumDecisionType.eRetryCancelDecision,
"Se produjo un error al conectar.\n\n¿Reintentar?",
"Error de conexión",
EnumDecisionReturn.eRETRY,
EnumDecisionReturn.eCANCEL,
"ConexionErrorSetting", // Nombre del setting
true, // Mostrar checkbox
EnumDecisionIcon.eQUESTION // Icono de pregunta
);
if (respuesta == EnumDecisionReturn.eRETRY)
{
// Reintentar conexión
}
else
{
// Cancelar operación
}
Ventajas:
- Checkbox: Si el usuario marca "No volver a mostrar", EPLAN recuerda su elección
- Icono: Personaliza el icono (Question, Warning, Error, Information)
- Setting: La preferencia se guarda con nombre
ConexionErrorSetting
5. Aplicación práctica en EPLAN
5.1 Confirmar antes de ejecutar acción destructiva
using Eplan.EplApi.Base;
using Eplan.EplApi.ApplicationFramework;
using Eplan.EplApi.Scripting;
using System.Windows.Forms;
public class ConfirmarAccion
{
[Start]
public void Function()
{
// Preguntar al usuario
Decider decider = new Decider();
EnumDecisionReturn respuesta = decider.Decide(
EnumDecisionType.eYesNoDecision,
"Esta acción eliminará la numeración del proyecto.\n\n¿Desea continuar?",
"Confirmación",
EnumDecisionReturn.eNO, // Por defecto: No (seguro)
EnumDecisionReturn.eNO
);
if (respuesta == EnumDecisionReturn.eYES)
{
// Usuario confirmó, ejecutar acción
CommandLineInterpreter cli = new CommandLineInterpreter();
cli.Execute("XPrjActionRemoveNumerations");
MessageBox.Show(
"Numeración eliminada correctamente",
"Éxito",
MessageBoxButtons.OK,
MessageBoxIcon.Information
);
}
else
{
// Usuario canceló
MessageBox.Show("Acción cancelada por el usuario");
}
}
}
5.2 Procesar lote con "Yes to All"
using Eplan.EplApi.Base;
using Eplan.EplApi.Scripting;
using System.Windows.Forms;
public class ProcesarLote
{
[Start]
public void Function()
{
string[] paginas = { "Página 1", "Página 2", "Página 3", "Página 4", "Página 5" };
bool procesarTodas = false;
bool saltarTodas = false;
foreach (string pagina in paginas)
{
// Si el usuario ya eligió "Sí a todo" o "No a todo", no preguntar más
if (!procesarTodas && !saltarTodas)
{
Decider decider = new Decider();
EnumDecisionReturn respuesta = decider.Decide(
EnumDecisionType.eYesAllNoAllDecision,
"¿Procesar " + pagina + "?",
"Procesando lote",
EnumDecisionReturn.eYES,
EnumDecisionReturn.eNO
);
switch (respuesta)
{
case EnumDecisionReturn.eYES:
// Procesar solo esta
ProcesarPagina(pagina);
break;
case EnumDecisionReturn.eNO:
// Saltar solo esta
break;
case EnumDecisionReturn.eYES_ALL:
// Procesar esta y todas las siguientes
procesarTodas = true;
ProcesarPagina(pagina);
break;
case EnumDecisionReturn.eNO_ALL:
// Saltar esta y todas las siguientes
saltarTodas = true;
break;
}
}
else if (procesarTodas)
{
// Usuario eligió "Sí a todo", procesar sin preguntar
ProcesarPagina(pagina);
}
// Si saltarTodas == true, simplemente no hacer nada
}
MessageBox.Show("Procesamiento de lote completado");
}
private void ProcesarPagina(string pagina)
{
new BaseException(
"Procesando: " + pagina,
MessageLevel.Message
).FixMessage();
// Aquí iría la lógica real de procesamiento
System.Threading.Thread.Sleep(500);
}
}
Ventaja: El usuario puede procesar todo el lote sin tener que confirmar cada elemento individualmente.
6. Buenas prácticas
6.1 Valor por defecto seguro
// ✅ Bien - Acción destructiva: Por defecto NO
decider.Decide(
EnumDecisionType.eYesNoDecision,
"¿Eliminar todos los datos?",
"Advertencia",
EnumDecisionReturn.eNO, // Por defecto: No
EnumDecisionReturn.eNO
);
// ❌ Mal - Acción destructiva: Por defecto SÍ (peligroso)
decider.Decide(
EnumDecisionType.eYesNoDecision,
"¿Eliminar todos los datos?",
"Advertencia",
EnumDecisionReturn.eYES, // ⚠️ Peligroso
EnumDecisionReturn.eYES
);
Regla: Para acciones destructivas o irreversibles, el botón por defecto debe ser el más seguro (No/Cancelar).
6.2 Mensajes claros y concisos
// ✅ Bien - Mensaje claro y específico
decider.Decide(
EnumDecisionType.eYesNoDecision,
"Se eliminarán 15 páginas sin componentes.\n\n¿Continuar?",
"Confirmar eliminación",
EnumDecisionReturn.eNO,
EnumDecisionReturn.eNO
);
// ❌ Mal - Mensaje vago
decider.Decide(
EnumDecisionType.eYesNoDecision,
"¿Continuar?", // ¿Continuar con qué?
"Pregunta",
EnumDecisionReturn.eYES,
EnumDecisionReturn.eNO
);
6.3 Usar switch para múltiples opciones
// ✅ Bien - Switch completo
switch (respuesta)
{
case EnumDecisionReturn.eYES:
// ...
break;
case EnumDecisionReturn.eNO:
// ...
break;
case EnumDecisionReturn.eYES_ALL:
// ...
break;
case EnumDecisionReturn.eNO_ALL:
// ...
break;
}
// ❌ Mal - Solo if (puede olvidar casos)
if (respuesta == EnumDecisionReturn.eYES)
{
// ¿Qué pasa con YES_ALL?
}
Resumen
Decider es la forma nativa de EPLAN para mostrar diálogos de decisión al usuario.
Conceptos clave:
- Alternativa a MessageBox con funcionalidades EPLAN-específicas
- Creas una instancia:
Decider decider = new Decider(); - Muestras diálogo:
EnumDecisionReturn respuesta = decider.Decide(...); - Procesas respuesta con
switch (respuesta)
Tipos de decisiones:
eOkDecision: Solo OK (informativo)eYesNoDecision: Sí / NoeYesAllNoAllDecision: Sí / No / Sí a todo / No a todo (para lotes)eRetryCancelDecision: Reintentar / CancelareOkCancelDecision: OK / Cancelar
Parámetros avanzados:
- Checkbox "No volver a mostrar"
- Iconos personalizables
- Persistencia en settings de EPLAN
Uso típico en EPLAN:
- Confirmar acciones destructivas
- Procesar lotes con "Sí a todo" / "No a todo"
- Preguntas con opciones persistentes
Preguntas frecuentes
P: ¿Decider reemplaza completamente a MessageBox?
R: No. Para mensajes simples y confirmaciones básicas, MessageBox sigue siendo válido. Usa Decider cuando necesites:
- Opciones "a todo"
- Checkbox de persistencia
- Mejor integración con settings de EPLAN
P: ¿Qué pasa si el usuario cierra el diálogo con la X?
R: Retorna el valor especificado en el parámetro valorSiEsc.
P: ¿Puedo usar Decider en scripts DeclareAction?
R: Sí, funciona igual en [Start] y [DeclareAction].
P: ¿Cómo funciona el checkbox "No volver a mostrar"?
R: Si proporcionas un nombre de setting, EPLAN guarda la preferencia del usuario. La próxima vez, no mostrará el diálogo y retornará directamente la elección guardada.
Conexiones
Capítulo anterior
Capítulo 23: Sobrecarga de métodos
Próximo capítulo
Capítulo 25: ListSelectDecisionContext - Selección de lista
En el próximo capítulo aprenderás a mostrar listas de opciones al usuario para que seleccione una o varias.
Última actualización: Enero 2025
Tiempo de lectura estimado: 20 minutos
Código de ejemplo: code/cap-24/Script de referencia: EPLAN-Scripting-4.0/04_CodeFlow/08_Decider.cs