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