Visual C++ .NET - Macro sustitución en Visual C++ .NET

 
Vista:
sin imagen de perfil

Macro sustitución en Visual C++ .NET

Publicado por Juan (1 intervención) el 03/04/2014 08:50:29
Buenos días, me gustaría saber si desde Visual C++ .NET se puede hacer esto que antes hacía con Visual FoxPro y creo que es muy bueno

1
2
3
4
5
for nI=1 to 10
     cControl="label"+alltrim(nI)
 
     &cControl..caption="Prueba"
endfor

O se ame refiero a poder utilizar lo que hay dentro de una variable, poder sustituir código, sé que en este ejemplo no haría falta pero es solo un ejemplo de lo que se puede llegar hacer y es muy potente.

Hay alguna manera de poder hacer esto?.

Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Acceder y modificar propiedades de controles dinámicamente por nombre

Publicado por Alejandro (265 intervenciones) el 13/02/2024 20:29:30
Sí, Juan, en Visual C++ .NET puedes lograr algo similar usando controles de Windows Forms y la reflexión para acceder a las propiedades de un control a través de una variable que contiene su nombre. Sin embargo, ten en cuenta que C++ .NET no tiene el mismo nivel de reflexión dinámica que lenguajes como Visual FoxPro.

Aquí hay un ejemplo básico de cómo podrías hacerlo en C++ .NET:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#pragma once
 
namespace EjemploVariables {
 
    using namespace System;
    using namespace System::Windows::Forms;
 
    public ref class Form1 : public System::Windows::Forms::Form {
    public:
        Form1(void) {
            InitializeComponent();
        }
 
    protected:
        ~Form1() {
            if (components) {
                delete components;
            }
        }
 
    private: System::Windows::Forms::Label^ label1;
    private: System::Windows::Forms::Label^ label2;
    // ... otros controles
 
    private: System::ComponentModel::Container ^components;
 
    void InitializeComponent(void) {
        this->label1 = (gcnew System::Windows::Forms::Label());
        this->label2 = (gcnew System::Windows::Forms::Label());
        // ... inicialización de otros controles
 
        //
        // label1
        //
        this->label1->AutoSize = true;
        this->label1->Location = System::Drawing::Point(10, 10);
        this->label1->Name = L"label1";
        this->label1->Size = System::Drawing::Size(46, 17);
        this->label1->TabIndex = 0;
        this->label1->Text = L"label1";
 
        //
        // label2
        //
        this->label2->AutoSize = true;
        this->label2->Location = System::Drawing::Point(10, 40);
        this->label2->Name = L"label2";
        this->label2->Size = System::Drawing::Size(46, 17);
        this->label2->TabIndex = 1;
        this->label2->Text = L"label2";
 
        // ... inicialización de otros controles
    }
 
    private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
        // Utilizando reflexión para acceder a propiedades de controles por su nombre
        SetLabelText("label1", "Prueba 1");
        SetLabelText("label2", "Prueba 2");
        // ... establecer propiedades de otros controles
    }
 
    void SetLabelText(String^ controlName, String^ text) {
        // Obtener el tipo del formulario
        Type^ formType = this->GetType();
 
        // Obtener el campo del control por el nombre
        System::Reflection::FieldInfo^ field = formType->GetField(controlName, System::Reflection::BindingFlags::NonPublic | System::Reflection::BindingFlags::Instance);
 
        // Verificar si el campo fue encontrado
        if (field != nullptr) {
            // Obtener el valor del campo (es un control Label en este ejemplo)
            Label^ labelControl = dynamic_cast<Label^>(field->GetValue(this));
 
            // Verificar si el control es del tipo Label
            if (labelControl != nullptr) {
                // Establecer el texto del control
                labelControl->Text = text;
            }
        }
    }
    };
}

En este ejemplo, `SetLabelText` es una función que utiliza reflexión para acceder a un control por su nombre y establecer su propiedad `Text`. Puedes adaptar este enfoque para trabajar con otras propiedades o tipos de controles según tus necesidades. Sin embargo, ten en cuenta que este método es más verboso y menos "dinámico" que el código que proporcionaste de Visual FoxPro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar