giovedì 21 agosto 2014

Progetto CLR in Visual C++

Adesso passo a progettare i form.
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