Ir al contenido

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


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

  • Conocer MessageBox.Show()
  • Entender if y switch
  • Saber usar enums
  • Conocer métodos con valor de retorno

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.


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;
AspectoMessageBoxDecider
Origen.NET FrameworkEPLAN API
IntegraciónWindows genéricoEPLAN específico
OpcionesOK, Yes/No, Yes/No/Cancel+ Yes to All, No to All
CheckboxNoSí (“No volver a mostrar”)
SettingsNo persistePuede persistir preferencias
IconosEstándar WindowsEPLAN personalizables

Cuándo usar cada uno:

  • MessageBox: Mensajes simples, confirmaciones básicas
  • Decider: Procesos en lote, opciones “para todo”, configuraciones persistentes

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.

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?

  1. Crea una instancia de Decider
  2. Muestra un diálogo con botones “Sí” y “No”
  3. El usuario elige
  4. Retorna EnumDecisionReturn.eYES o EnumDecisionReturn.eNO
  5. El código procesa la respuesta con switch

EPLAN ofrece varios tipos de diálogos:

TipoBotones que muestraCuándo usar
eOkDecisionOKSolo informar (sin decisión real)
eYesNoDecisionSí, NoPregunta simple con dos opciones
eYesNoCancelDecisionSí, No, CancelarTres opciones (guardar/no guardar/cancelar)
eYesAllNoAllDecisionSí, No, Sí a todo, No a todoProcesar múltiples elementos
eRetryCancelDecisionReintentar, CancelarDespués de un error
eOkCancelDecisionOK, CancelarConfirmación de acción
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.

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.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)
);

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.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");
}
}
}
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.


// ✅ 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).

// ✅ 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
);
// ✅ 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?
}

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í / No
  • eYesAllNoAllDecision: Sí / No / Sí a todo / No a todo (para lotes)
  • eRetryCancelDecision: Reintentar / Cancelar
  • eOkCancelDecision: 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

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.


Capítulo 23: Sobrecarga de métodos

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