Non mi è molto chiaro il passaggio fra un'applicazione C++ e un'applicazione di Managed C++ e CLR.
Ho in testa una grande confusione.
Invece di impazzire, passo di palo in frasca e prendo per buona la sintassi del progetto CLR, per poi giungere in tempi successivi a riunire le cose.
A volte, anzi forse abbastanza spesso, conviene fare nell'apprendimento come fa il bambino nell'imparare a parlare.
Molto spesso, la nostra didattica inizia dall'ABC per poi andare per gradi, col risultato di fare dell'apprendimento una cosa noiosa e lenta, e poco funzionale, in quanto i concetti utili vengono imparati in un modo pesante e lento.
Conviene prima imparare come muoversi, quindi per la "grammatica" ci sarà tempo e modo di approfondire sulla base della naturale curiosità.
Ho un progetto CLS vuoto.
Quindi tramite il menu Progetto inserisco un Form, che chiamo Form1, e ottengo due files, Form1.cpp e Form1.h
Vediamo come sono composti:
Form1.cpp:
#include "Form1.h"
Form1.h:
#pragma once
namespace MyCLRProject {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
///
/// Riepilogo per Form1
///
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: aggiungere qui il codice del costruttore.
//
}
protected:
///
/// Liberare le risorse in uso.
///
~Form1()
{
if (components)
{
delete components;
}
}
private:
///
/// Variabile di progettazione necessaria.
///
System::ComponentModel::Container ^components;
#pragma region Windows Form Designer generated code
///
/// Metodo necessario per il supporto della finestra di progettazione. Non modificare
/// il contenuto del metodo con l'editor di codice.
///
void InitializeComponent(void)
{
this->SuspendLayout();
//
// Form1
//
this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(284, 261);
this->Name = L"Form1";
this->Text = L"Form1";
this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
this->ResumeLayout(false);
}
#pragma endregion
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
}
};
}
Bene.
Dunque il file Form1.h è il vero pezzo forte della situazione.
Ma se io faccio partire il programma ottengo un messaggio di errore:
1>------ Inizio compilazione: Progetto: MyCLRProject, Configurazione: Debug Win32 ------ 1> Form1.cpp 1>LINK : fatal error LNK1561: il punto d'ingresso deve essere definito ========== Compilazione: 0 completate, 1 non riuscite, 0 aggiornate, 0 ignorate ==========Il punto di ingresso deve essere definito.
Nel progetto in Visual Basic ero abituato al fatto che il punto di ingresso fosse stabilito automaticamente: se non altrimenti specificato, partiva da Form1.
Invece qua bisogna definirlo specificamente.
E come si fa?
Intanto mettiamo un altro file, di tipo cpp:
#include "Form1.h"
using namespace MyCLRProject;
int main(){
Form1 frm;
frm.ShowDialog();
return 0;
}
Qui il comportamento è praticamente lo stesso che sono abituato a vedere con il C++.Data una classe Form1, viene istanziato un oggetto frm di classe Form1, e viene chiamato il suo metodo ShowDialog().
E appare il form vuoto (su una finestra di DOS).

Nessun commento:
Posta un commento