Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Meta

#141
Lo estoy haciendo. Lo que a veces me adelanto, ajjajaj.

#142
Gracias por la explicación muy desarrollada.  ;-)
#143
Voy hacerlo de otra manera. Por fin funciona.

Quito de la dll este código:
float __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
{
    return resultadoPorcentaje = nivelAgua * (100 / altura);
}


Este código de abajo lo pongo en la interfaz.
resultadoPorcentaje = nivelAgua * (100 / altura);

La dll si compila.
#include "pch.h"

extern "C"
{
    __declspec(dllexport) LPTSTR __stdcall Mensaje();
    __declspec(dllexport) float __stdcall Volumen(float, float, float, float);
    __declspec(dllexport) float __stdcall Litros(float, float);
    //__declspec(dllexport) float __stdcall ResultadoPorcentaje(float, float, float);
    __declspec(dllexport) float __stdcall VolumenLitros(float, float, float, float, float);
    __declspec(dllexport) float __stdcall CantidadTubosLitros(float, float, float);
    __declspec(dllexport) float __stdcall TotalLitros(float, float, float);
};

// Mensaje.
LPTSTR __stdcall Mensaje() { return LPTSTR(L"Hola. Saludos desde la dll. Versión: 1.0.0"); }

// Cálculo volumen.
float __stdcall Volumen(float volumen, float PI, float radio, float altura)
{
    return volumen = PI * (radio * radio) * altura;
}

// Cálculo litros.
float __stdcall Litros(float litros, float volumen)
{
    return litros = volumen * 1000;
}

// Cálculo porcentaje en % del litro de agua.
//float __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
//{
//    return resultadoPorcentaje = nivelAgua * (100 / altura);
//}

// Cálculo litros de agua.
float __stdcall VolumenLitros(float volumenLitros, float PI, float radio, float nivelAgua, float resultadoLitros)
{
    return volumenLitros = PI * (radio * radio) * nivelAgua;
    return resultadoLitros = volumenLitros * 1000;
}

// Cálculo litros por cantidad de tubos
float __stdcall CantidadTubosLitros(float cantidadTubosLitros, float cantidadTubos, float resultadoLitros)
{
    return cantidadTubosLitros = cantidadTubos * resultadoLitros;
}

// Cálculo cantidad de litros con total de tubos.
float __stdcall TotalLitros(float totalLitros, float litros, float cantidadTubos)
{
    return totalLitros = litros * cantidadTubos;
}


Archivo .def lo dejo así:
LIBRARY DLL_al_poder
EXPORTS
Mensaje
Volumen
Litros
VolumenLitros
CantidadTubosLitros
TotalLitros


Código completo en la interfaz.
#include <iostream>
#include <windows.h> // Para mostrar texto en el título de la ventana.

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

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

// Definir estas funciones.
typedef LPTSTR(__stdcall* Mensaje)();
typedef float(__stdcall* Volumen)(float, float, float, float);
typedef float(__stdcall* Litros)(float, float);
//typedef float(__stdcall* ResultadoPorcentaje)(float, float, float);
typedef float(__stdcall* VolumenLitros)(float, float, float, float, float);
typedef float(__stdcall* CantidadTubosLitros)(float, float, float);
typedef float(__stdcall* TotalLitros)(float, float, float);

// Variables.
const double Pi = 3.14;
float radio;
float altura;
//double volumen;
//double litros;
float nivelAgua;
float resultadoPorcentaje;
//double resultadoLitros;
//double volumenLitros;
float mitadBarra;
float cantidadTubos;
//double cantidadTubosLitros;
//double totalLitros;

int main(void)
{
// Importar dll.
HINSTANCE hDLL = 0;
Mensaje mensaje;
Volumen volumen;
Litros litros;
//ResultadoPorcentaje resultadoPorcentaje;
VolumenLitros volumenLitros;
CantidadTubosLitros cantidadTubosLitros;
TotalLitros totalLitros;

hDLL = LoadLibrary(L"C:\\Users\\Meta\\Documents\\Visual Studio 2019\\Projects\\DLL_y_interfaz_nativo_01_cpp\\Debug\\DLL_y_interfaz_nativo_01_cpp.dll");
mensaje = (Mensaje)GetProcAddress(hDLL, "Mensaje");
volumen = (Volumen)GetProcAddress(hDLL, "Volumen");
litros = (Litros)GetProcAddress(hDLL, "Litros");
//resultadoPorcentaje = (ResultadoPorcentaje)GetProcAddress(hDLL, "ResultadoPorcentaje");
volumenLitros = (VolumenLitros)GetProcAddress(hDLL, "VolumenLitros");
cantidadTubosLitros = (CantidadTubosLitros)GetProcAddress(hDLL, "CantidadTubosLitros");
totalLitros = (TotalLitros)GetProcAddress(hDLL, "totalLitros");

// Mostrar caracteres correctamente en pantalla y título de la ventana.
SetConsoleOutputCP(65001);
wchar_t titulo[128];
MultiByteToWideChar(CP_UTF8, 0, "Interfaz leer dll C++ nativo 2019.", -1, titulo, 128);
SetConsoleTitle(titulo);

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

// Ocultar cursor.
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
cci.bVisible = 1; // 0 oculta cursor. 1 muestra cursor.
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);

// Posición del cursor.
gotoxy(3, 2);

// Mostrar textos en pantalla.
wcout << mensaje() << endl;
gotoxy(0, 4);
cout << "Introduce el radio en m.: ";
cin >> radio;
cout << "Introduce la altura en m. ";
cin >> altura;
cout << "Introduce altura del agua. Máximo es de " << altura << ":";
cin >> nivelAgua;
cout << "Introduces cantidad de tubos: ";
cin >> cantidadTubos;

// ########## Dibujo de la barra.
cout << "\n";
cout << ("0 %                     50 %                   100 %") << endl;
cout << ("┌────────────────────────┬───────────────────────┐") << endl;

// Mitad de la barra para que no sea muy grande en la pantalla.
resultadoPorcentaje = nivelAgua * (100 / altura);

if (mitadBarra > 50)
{
mitadBarra = 50;
}

// Rellenar la barra.
for (float i = 1; i <= mitadBarra; i++)
{
cout << ("█");
}

// Si llega a 100 se pone el # en rojo.

if (resultadoPorcentaje > 100)
{
cout << ("#");
}
//########## Fin dibujo de la barra.

// Pisición del texto a mostrar.
gotoxy(0, 11);

cout << "\nPorcentaje: " << resultadoPorcentaje << " %.";


FreeLibrary(hDLL);

// Esperando pulsar Enter para salir.
cin.get();
return 0;
}




No se como se quita esos sobrantes textos que aparece al final, pero bueno, por fin ya se puede leer la dichoza dll.

Hay otra cosa que quiero hacer pero no me sale y hago esta pregunta.

Todos los cálculos matemáticos los quiero en la dll, como este de abajo, que al final tuve que ponerlo en la interfaz.
// Mitad de la barra para que no sea muy grande en la pantalla.
resultadoPorcentaje = nivelAgua * (100 / altura);


¿Hay posibilidad de ponerlo en la dll o no?

Saludos.
#144
Buenas:

Usando Windows Form C# hice este código.
Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace prueba_cs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            timer1.Start();
        }



        void cambioColor()
        {
            this.BackColor = Color.Black; // Formulario negro.
            //this.ForeColor = Color.White; // Cambia textos en blanco.
            label1.ForeColor = Color.White;
        }

        void cambioColor2()
        {
            this.BackColor = Color.White; // Formulario blanco.
            //this.ForeColor = Color.Black; // Cambia textos en negro.
            label1.ForeColor = Color.Black;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            cambioColor();
            timer1.Stop();
            timer2.Start();
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            cambioColor2();
            timer2.Stop();
            timer1.Start();
        }
    }
}


Se sale del formulario pulsando Alt + F4. Quiero que se desactive el puntero del ratón en el momento que cree este formulario.

Gracias.
#145
Entonces este cálculo que me hace falta debe estar en la interfaz, no en la dll.

Código (cpp) [Seleccionar]
mitadBarra = resultadoPorcentaje / 2;
#146
¿Cómo puedes saber que no se liberó memoria y cuando se se liberó?
#147
¿Qué iba a cambiar ahí exactamente?
#148
Lo he puesto tiplo float a todos por si acaso.

// Mitad de la barra para que no sea muy grande en la pantalla.
mitadBarra = resultadoPorcentaje(0, 0, 0) / 2;




Por lo que veo, tengo el diseño mal.

// Cálculo porcentaje en % del litro de agua.
float __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
{
    return resultadoPorcentaje = nivelAgua * (100 / altura);
}


Ya que solamente necesito el valor de resultadoPorcentaje para añadirlo en un cout << "Tanto porciernto: " << resultadoPorcentaje << endl;
#149
Hola:

Haciendo otras pruebas.

Creo el archivo dll.
Código (cpp) [Seleccionar]
#include "pch.h"

extern "C"
{
    __declspec(dllexport) LPTSTR __stdcall Mensaje();
    __declspec(dllexport) float __stdcall Volumen(float, float, float, float);
    __declspec(dllexport) float __stdcall Litros(float, float);
    __declspec(dllexport) float __stdcall ResultadoPorcentaje(float, float, float);
    __declspec(dllexport) float __stdcall VolumenLitros(float, float, float, float, float);
    __declspec(dllexport) float __stdcall CantidadTubosLitros(float, float, float);
    __declspec(dllexport) float __stdcall TotalLitros(float, float, float);
};

// Mensaje.
LPTSTR __stdcall Mensaje() { return LPTSTR(L"Hola. Saludos desde la dll. Versión: 1.0.0"); }

// Cálculo volumen.
float __stdcall Volumen(float volumen, float PI, float radio, float altura)
{
    return volumen = PI * (radio * radio) * altura;
}

// Cálculo litros.
float __stdcall Litros(float litros, float volumen)
{
    return litros = volumen * 1000;
}

// Cálculo porcentaje en % del litro de agua.
float __stdcall ResultadoPorcentaje(float resultadoPorcentaje, float nivelAgua, float altura)
{
    return resultadoPorcentaje = nivelAgua * (100 / altura);
}

// Cálculo litros de agua.
float __stdcall VolumenLitros(float volumenLitros, float PI, float radio, float nivelAgua, float resultadoLitros)
{
    return volumenLitros = PI * (radio * radio) * nivelAgua;
    return resultadoLitros = volumenLitros * 1000;
}

// Cálculo litros por cantidad de tubos
float __stdcall CantidadTubosLitros(float cantidadTubosLitros, float cantidadTubos, float resultadoLitros)
{
    return cantidadTubosLitros = cantidadTubos * resultadoLitros;
}

// Cálculo cantidad de litros con total de tubos.
float __stdcall TotalLitros(float totalLitros, float litros, float cantidadTubos)
{
    return totalLitros = litros * cantidadTubos;
}


Luego el deb.
Código (cpp) [Seleccionar]
LIBRARY DLL_al_poder
EXPORTS
Mensaje
Volumen
Litros
ResultadoPorcentaje
VolumenLitros
CantidadTubosLitros
TotalLitros


Y la interfaz de C++ nativo para que lea la dll.
Código (cpp) [Seleccionar]
#include <iostream>
#include <windows.h> // Para mostrar texto en el título de la ventana.

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

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

// Definir estas funciones.
typedef LPTSTR(__stdcall* Mensaje)();
typedef float(__stdcall* Volumen)(float, float, float, float);
typedef float(__stdcall* Litros)(float, float);
typedef float(__stdcall* ResultadoPorcentaje)(float, float, float);
typedef float(__stdcall* VolumenLitros)(float, float, float, float, float);
typedef float(__stdcall* CantidadTubosLitros)(float, float, float);
typedef float(__stdcall* TotalLitros)(float, float, float);

int main(void)
{
// Variables.
const double Pi = 3.14;
float radio;
float altura;
//double volumen;
//double litros;
float nivelAgua;
//float resultadoPorcentaje;
//double resultadoLitros;
//double volumenLitros;
float mitadBarra;
float cantidadTubos;
//double cantidadTubosLitros;
//double totalLitros;

// Importar dll.
HINSTANCE hDLL = 0;
Mensaje mensaje;
Volumen volumen;
Litros litros;
ResultadoPorcentaje resultadoPorcentaje;
VolumenLitros volumenLitros;
CantidadTubosLitros cantidadTubosLitros;
TotalLitros totalLitros;

hDLL = LoadLibrary(L"C:\\Users\\Meta\\Documents\\Visual Studio 2019\\Projects\\DLL_y_interfaz_nativo_01_cpp\\Debug\\DLL_y_interfaz_nativo_01_cpp.dll");
mensaje = (Mensaje)GetProcAddress(hDLL, "Mensaje");
volumen = (Volumen)GetProcAddress(hDLL, "Volumen");
litros = (Litros)GetProcAddress(hDLL, "Litros");
resultadoPorcentaje = (ResultadoPorcentaje)GetProcAddress(hDLL, "ResultadoPorcentaje");
volumenLitros = (VolumenLitros)GetProcAddress(hDLL, "VolumenLitros");
cantidadTubosLitros = (CantidadTubosLitros)GetProcAddress(hDLL, "CantidadTubosLitros");
totalLitros = (TotalLitros)GetProcAddress(hDLL, "totalLitros");

// Mostrar caracteres correctamente en pantalla y título de la ventana.
SetConsoleOutputCP(65001);
wchar_t titulo[128];
MultiByteToWideChar(CP_UTF8, 0, "Interfaz leer dll C++ nativo 2019.", -1, titulo, 128);
SetConsoleTitle(titulo);

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

// Ocultar cursor.
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
cci.bVisible = 1; // 0 oculta cursor. 1 muestra cursor.
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);

// Posición del cursor.
gotoxy(3, 2);

// Mostrar textos en pantalla.
wcout << mensaje() << endl;
gotoxy(0, 4);
cout << "Introduce el radio en m.: ";
cin >> radio;
cout << "Introduce la altura en m. ";
cin >> altura;
cout << "Introduce altura del agua. Máximo es de " << altura << ":";
cin >> nivelAgua;
cout << "Introduces cantidad de tubos: ";
cin >> cantidadTubos;

// ########## Dibujo de la barra.
cout << "\n";
cout << ("0 %                     50 %                   100 %") << endl;
cout << ("┌────────────────────────┬───────────────────────┐") << endl;

// Mitad de la barra para que no sea muy grande en la pantalla.
mitadBarra = resultadoPorcentaje / 2;

if (mitadBarra > 50)
{
mitadBarra = 50;
}

// Rellenar la barra.
for (float i = 1; i <= mitadBarra; i++)
{
cout << ("█");
}

// Si llega a 100 se pone el # en rojo.

if (resultadoPorcentaje > 100)
{
cout << ("#");
}
//########## Fin dibujo de la barra.

// Pisición del texto a mostrar.
gotoxy(0, 11);

//cout << "\nPorcentaje: " << resultadoPorcentaje << " %.";


FreeLibrary(hDLL);

// Esperando pulsar Enter para salir.
cin.get();
return 0;


Me salen estos errores.


No logro solucionarlo.
#150
Buenas:

En este ejemplo de código gracias al equipo de este foro. Los datos de selección de un radioButton en consola C#, se guarda en la RAM o en una variable.

Quiero saber el archivo recomendado para guardar dicho dato y luego recuperarlo nada más arrancar el programa. Por supuesto, si selecciono con Enter la "> (*) Opción E", se guarda automáticamente este dato en un archivo.

¿Qué tipo de archivo aconsejable para guardar datos y recuperarlo?

Me comenta que en binario, porque es lo que trabaja las computadoras, más rápido y eficientes para ella. Para nosotros pensé en un archivo de texto txt. Para otros prefieren el XML, otros el editor de registro en el cual ahora dicen mejor no manejarlo para no saturarlo.

Alguien sabrá.

El código es este de abajo.
Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace radioButton_consola_03_cs
{
    class Program
    {
        #region Variables.
        private static readonly string[] TEXTO = new string[]
        {
            "( ) Opción A        ",
            "( ) Opción B        ",
            "( ) Opción C        ",
            "( ) Opción D        ",
            "( ) Opción E        ",
            "( ) Opción F        ",
            "( ) Opción G        ",
            "    SALIR"
        };

        private static int itemSeñalado;

        private static int itemSeleccionado;
        #endregion

        static void Main(string[] args)
        {
            // Título de la ventana.
            Console.Title = "RadioButton";

            // Tamaño de la ventana.
            Console.SetWindowSize(20, 5);

            // Fondo azul.
            Console.BackgroundColor = ConsoleColor.Blue;

            // Letras blanco.
            Console.ForegroundColor = ConsoleColor.White;

            // Oculto el cursor.
            Console.CursorVisible = false;

            // Almacena la tecla pulsada en la variable.
            ConsoleKey teclaInicial;

            do
            {
                // Limpiar pantalla.
                Console.Clear();

                // Posición del cursor del título del MENÚ PRINCIPAL.
                Console.SetCursorPosition(0, 0);

                // Título.
                Console.Write("   MENÚ PRINCIPAL   ");

                // Pocisión de la hora.
                Console.SetCursorPosition(4, 2);

                // Formato numérico dd/MM/yyyy.
                Console.Write(DateTime.Now.ToString("ddd dd MMM"));

                // Almacena en la variable una tecla pulsada.
                teclaInicial = Console.ReadKey(true).Key;

                // ¿Haz pulsado la tecla Enter?
                if (teclaInicial == ConsoleKey.Enter)
                {
                    // Sí. Se ejecuta esta función.
                    MenuPrincipal();
                }
            } while (teclaInicial != ConsoleKey.Escape);
        }

        #region Menú Principal.
        private static void MenuPrincipal()
        {
            bool salir = false;

            // En itemSelecionado:
            // -1 = Sin seleccionar con * ninguna opción.
            // 0 = Seleccionar con * la Opción A.
            // 1 = Seleccionar con * la Opción B.
            // 2 = Seleccionar con * la opción C.
            // 3 = Seleccionar con * la opción D.
            // 4 = Seleccionar con * la opción E.
            // 5 = Seleccionar con * la opción F.
            // 6 = Seleccionar con * la opción G.

            // Capturar tecla para luego validar.
            ConsoleKey tecla;

            // Cada vez que se vuelva al menú, está señalizado con el *.
            itemSeñalado = 0;
            int pagina;
            do
            {
                //******************************************************************
                // Dibujo el menú principal.

                // Limpiar pantalla.
                Console.Clear();

                pagina = 0;
                if (itemSeñalado >= 4)
                {
                    pagina = 4;
                }

                // Recorre la lista de las opciones.
                for (int k = 0; k < 4; k++)
                {
                    Console.SetCursorPosition(0, k);
                    Console.Write(itemSeñalado == k + pagina ? "> " : "  ");
                    Console.Write(TEXTO[k + pagina]);
                    Console.SetCursorPosition(3, k);
                    Console.Write(itemSeleccionado == k + pagina ? "*" : " ");
                }

                // Fin de pintar el menú principal.
                //******************************************************************

                // Leer tecla ingresada por el usuario.
                tecla = Console.ReadKey(true).Key;

                switch (tecla)
                {
                    // Al pulsar Enter, marcas un radioButton con *.
                    case ConsoleKey.Enter:
                        if (itemSeñalado < 7)
                        {
                            itemSeleccionado = itemSeñalado;
                        }
                        salir = (itemSeñalado == TEXTO.Length - 1);
                        break;

                    // Pulsar flecha abajo del teclado.
                    case ConsoleKey.DownArrow:
                        if (++itemSeñalado >= TEXTO.Length)
                        {
                            itemSeñalado = 0;
                            Console.Clear();
                        }
                        else if (itemSeñalado == 4)
                        {
                            Console.Clear();
                        }
                        break;

                    // Pulsar flecha arriba del teclado.
                    case ConsoleKey.UpArrow:
                        if (--itemSeñalado < 0)
                        {
                            itemSeñalado = TEXTO.Length - 1;
                            Console.Clear();
                        }
                        else if (itemSeñalado == 3)
                        {
                            Console.Clear();
                        }
                        break;
                }
                // Uso la tecla escape como salida.
            } while (!salir);
        }
        #endregion
    }
}


Por supuesto. Se guarda los datos desde que se pulse Enter. Tengo entendido que el archivo a guardar si no hay ninguno o no lo detecta por ejemplo a este nombre, por ejemplo Archivo.txt. Lo crea. Si está creado, solo lo lee y guarda datos.

Desde que pulse Enter en > Salir se guarda los datos. Si pulsas la X con el ratón (mouse) de la ventana del programa, también se asegura que se cierra el archivo y tenga todo guardado por si acaso, no quiero tener error de archivos.

Saludos.