Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   .NET (https://www.clubdelphi.com/foros/forumdisplay.php?f=17)
-   -   Mejor forma de pasar conjunto de funciones (https://www.clubdelphi.com/foros/showthread.php?t=96896)

REHome 13-10-2024 09:20:16

Mejor forma de pasar conjunto de funciones
 
Hola:

Antes usaba el uso de void sin devolver valor. Un amigo me dijo en esta semana que mejor que te devuelva un valor, un número al acabar una función con argumento tipo int, que te devuelva un número en Return. Es para salir de la función con un valor en vez de usar void (vacío).

Con este valor sales de la función y va hacia un Swtich Case, para elegir menús.

Por ejemplo en este vídeo. Hay partes del menú con submenú donde dice > ATRÁS INICIO.

Ver vídeo.

Si pulsa > ATRÁS, sale de la función. Si pulso > INICIO, voy a otra función sin salir de esta, en el cual crea una pila de memoria y esto no interesa, porque se gasta, y también tiene comportamientos no deseados cuando usa variables estáticas ya que vuelve a la función por donde iba al salir.

Es decir, a la hora de crear menús y menús, lo hacía como si estuviera haciendo una página Web html, poniendo enlaces en una ventana a otra o archivos.html en el cual no hay ningún problema de pilas de memoria o StackOverflow.

Da igual en que menú o submenú estés, también funciona el puerto serie como entrada de datos y esto debe almacenarse en variables internas, luego voy a mirar por el menú y veo sus datos.

¿Algún consejo sobre diseño con C# modo consola?

Saludos.

navbuoy 13-10-2024 20:17:37

puedes hacer las funciones de menus de esta forma

void Menu_Principal(void)
{
//muestras con printf() o lo que sea las opciones en la consola

//coges con getch() o con Scanf() la opcion que elige el usuario

//finalmente llamas a la funcion que corresponda a esa opcion de menu con un switch o con varios IF (Altas, Bajas, Modificaciones o lo que sea)
}

navbuoy 14-10-2024 12:30:26

te pongo un ejemplo en C++ Builder

(las funciones textattr(), gotoxy(), cprintf() y clrscr() podrian ser especificas de C++ Builder recuerda eso




Código:

#include <iostream>
#include <tchar.h>
#include <stdio.h>
#include <conio.h>

int Menu_Principal(void);


int _tmain(int argc, _TCHAR* argv[])
{
  int valor = 0;

  valor = Menu_Principal();

  printf("\r\n\r\nSe selecciono la opcion %d del Menu Principal", valor);

  printf("\r\nEl programa ha terminado");
  getch();  //Esperamos pulsacion de tecla para terminar y cerrar ventana de consola
  exit(0);
}

int Menu_Principal(void)
{
  char opcion = ' ';

  INICIO_MENU:

  textattr(2);
  clrscr();


  gotoxy(10,8); cprintf(" oOo[ MENU PRINCIPAL ]oOo ");
  gotoxy(10,10); cprintf("[1].- ALTAS");
  gotoxy(10,11); cprintf("[2].- BAJAS");
  gotoxy(10,12); cprintf("[3].- MODIFICACIONES");
  gotoxy(10,13); cprintf("");
  gotoxy(10,14); cprintf("[0].- SALIR");
  gotoxy(10,16); cprintf("INTRODUCE OPCION: ");

  opcion = getch();  //ten en cuenta que si tomamos con getch solo podemos coger 1 caracter
                                          // o sea numeros de 0 al 9 y algun caracter del Abecedario

  if(opcion == '1')  {
                                                //Llamamos a funcion que corresponda
                                                return(1);
                                                }

  else if(opcion == '2')  {
                                                //Llamamos a funcion que corresponda
                                                return(2);
                                                }

  else if(opcion == '3')  {
                                                //Llamamos a funcion que corresponda
                                                return(3);
                                                }

  else if(opcion == '0')  {
                                                return(0);

                                                }

  else {
                gotoxy(10,16); cprintf("OPCION NO VALIDA - Pulse una tecla para continuar...");
        getch();
                goto INICIO_MENU;
                  }

}


REHome 15-10-2024 21:49:55

Lo pasé un poco a C++.



Siempre me dice programa terminado.

Código modificado un poco.

Código:

#include <iostream>
#include <windows.h> // Para mostrar texto en el título de la ventana.
#include <stdio.h>  // Cambio color de fondo y letras.
#include <tchar.h>
#include <stdio.h>
#include <conio.h>

using namespace std;
//using std::cout;
//using std::cin;

// Función posición del cursor.
void gotoxy(int ancho_x, int alto_y)
{
        HANDLE hcon;
        hcon = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD dwPos{};
        dwPos.X = ancho_x;
        dwPos.Y = alto_y;
        SetConsoleCursorPosition(hcon, dwPos);
}

int Menu_Principal(void);


int _tmain(int argc, _TCHAR* argv[])
{
        int valor = 0;

        valor = Menu_Principal();

        cout << "\r\n\r\nSe selecciono la opcion %d del Menu Principal", valor;

        cout << "\r\nEl programa ha terminado";
        //getch();  //Esperamos pulsacion de tecla para terminar y cerrar ventana de consola
        exit(0);
}

int Menu_Principal(void)
{
        #pragma region "Configuración ventana."
        // Mostrar caracteres correctamente en pantalla y título de la ventana.
        SetConsoleOutputCP(65001);
        wchar_t titulo[128];
        MultiByteToWideChar(CP_UTF8, 0, "Título de la ventana", -1, titulo, 128);
        SetConsoleTitleW(titulo);

        // Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
        SMALL_RECT r = { 0, 0, 80, 20 }; // X = 80, Y = 20.
        SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);

        // Cambio color de 6 (amarillo / naranja), color letras 0 (negro).
        system("color 60");

        // Ocultar cursor.
        CONSOLE_CURSOR_INFO cci;
        GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
        cci.bVisible = 0; // 0 oculta. 1 muestra cursor.
        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
#pragma endregion
        char opcion = ' ';

INICIO_MENU:

        //textattr(2);
        //clrscr();


        gotoxy(10, 8);  cout << " oOo[ MENU PRINCIPAL ]oOo ";
        gotoxy(10, 10); cout << "[1].- ALTAS";
        gotoxy(10, 11); cout << "[2].- BAJAS";
        gotoxy(10, 12); cout << "[3].- MODIFICACIONES";
        gotoxy(10, 13); cout << "";
        gotoxy(10, 14); cout << "[0].- SALIR";
        gotoxy(10, 16); cout << "INTRODUCE OPCION: ";

        //opcion = getch();  //ten en cuenta que si tomamos con getch solo podemos coger 1 caracter
        // o sea numeros de 0 al 9 y algun caracter del Abecedario

        cin >> opcion;

        if (opcion == '1') {
                //Llamamos a funcion que corresponda
                return(1);
        }

        else if (opcion == '2') {
                //Llamamos a funcion que corresponda
                return(2);
        }

        else if (opcion == '3') {
                //Llamamos a funcion que corresponda
                return(3);
        }

        else if (opcion == '0') {
                return(0);

        }

        else {
                gotoxy(10, 16); cout << "OPCION NO VALIDA - Pulse una tecla para continuar...";
                //getch();
                goto INICIO_MENU;
        }

}

En cuantoal goto, cuanto menos se uses mejor. Prohibido usar Goto me decía mi profesor a toda la clase que éramos unos casi 30 alumnos.

navbuoy 16-10-2024 03:50:56

bueno eso suelen decirlo porque puede "liar" mucho el codigo pero si queda claro para que lo usas y no induce a confusiones puedes usarlo que para algo esta en el lenguaje, si no, no estaria pero a mi la verdad que muchas veces me viene bien

claro que siempre puedes encerrar el menu en un bucle for( ;; ) y inducir la salida condicional con la opcion correspondiente con un break;

REHome 27-10-2024 07:43:03

¿Será algo así por poner un ejemplo?

Código:

enum PAGINAS

{

    terminar = 0,

    irMenuPrincipal = 1,

    irVolumen = 2,
    irBrillo = 3,
    irAltavoces = 4

}

void main ()
{* *
int dondeIr =i rMenuPrincipal;
* * while(dondeIr != terminar)
  {* * * *
        switch(dondeIr)
      {* * * * * *
          case irMenuPrincipal:
* * * * * *    dondeIr = pantallaMenuPrincipal();
* * * * * *    break;

* * * * * *case irVolumen:
* * * * * * * *dondeIr = pantallaVolumen();
* * * * * * * *break;
*
 * * * * * case irBrillo:
* * * * * * * *dondeIr = pantallaBrillo();
* * * * * * * *break;

 * * * * * case irAltavoces:
* * * * * * * *dondeIr = pantallaAltavoces();
* * * * * * * *break;
* * * * }
* * }
}


navbuoy 27-10-2024 09:59:51

se me antoja un poco raro estructurarlo asi

yo soy mas de poner algo como:

Código:

switch(opcion)
{

  case 1:    // Menu principal
                Funcion_Menu_Principal();
                break;

  case 2:    // Menu Altas
                Funcion_Menu_Altas();
                break;

    etc.. etc...
}


REHome 16-11-2024 03:11:56

Este está mejor, el que dices.


La franja horaria es GMT +2. Ahora son las 21:46:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi