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

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

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?

  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

3. Tipos de decisiones

3.1 EnumDecisionType

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

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í / 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

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