Capítulo 24: Decider - Preguntar al usuario
Capítulo 24: Decider - Preguntar al usuario
Sección titulada «Capítulo 24: Decider - Preguntar al usuario»Parte V: Interacción con usuario - Sección 10: Decisiones interactivas - Nivel: Principiante
Objetivos de aprendizaje
Sección titulada «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
Sección titulada «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
Sección titulada «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?
Sección titulada «1. ¿Qué es Decider?»1.1 Definición
Sección titulada «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
Sección titulada «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
Sección titulada «2. Cómo usar Decider»2.1 Sintaxis básica
Sección titulada «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
Sección titulada «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
Sección titulada «3. Tipos de decisiones»3.1 EnumDecisionType
Sección titulada «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)
Sección titulada «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
Sección titulada «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()
Sección titulada «4. Parámetros avanzados de Decide()»4.1 Versión completa con todos los parámetros
Sección titulada «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
Sección titulada «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
Sección titulada «5. Aplicación práctica en EPLAN»5.1 Confirmar antes de ejecutar acción destructiva
Sección titulada «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”
Sección titulada «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
Sección titulada «6. Buenas prácticas»6.1 Valor por defecto seguro
Sección titulada «6.1 Valor por defecto seguro»// ✅ Bien - Acción destructiva: Por defecto NOdecider.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
Sección titulada «6.2 Mensajes claros y concisos»// ✅ Bien - Mensaje claro y específicodecider.Decide( EnumDecisionType.eYesNoDecision, "Se eliminarán 15 páginas sin componentes.\n\n¿Continuar?", "Confirmar eliminación", EnumDecisionReturn.eNO, EnumDecisionReturn.eNO);
// ❌ Mal - Mensaje vagodecider.Decide( EnumDecisionType.eYesNoDecision, "¿Continuar?", // ¿Continuar con qué? "Pregunta", EnumDecisionReturn.eYES, EnumDecisionReturn.eNO);6.3 Usar switch para múltiples opciones
Sección titulada «6.3 Usar switch para múltiples opciones»// ✅ Bien - Switch completoswitch (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
Sección titulada «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
Sección titulada «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
Sección titulada «Conexiones»Capítulo anterior
Sección titulada «Capítulo anterior»Capítulo 23: Sobrecarga de métodos
Próximo capítulo
Sección titulada «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