Just another IT weblog

Problemi con i template standard di Visual Studio

Dicembre 16th, 2007 by Mattneri

 

Dopo aver installato XNA 2.0 mi sono accorto che mi erano spariti tutti i template standard di c#.
Facendo alcune ricerche su internet si scopre subito che è un baco abbastanza frequente e in genere è risolvibile cancellando e ricreando le cache dei template.

Per fare ciò basta cancellare le seguenti cartelle:

%programfiles%/Microsoft Visual Studio 8/Common7/IDE/ItemTemplateCache

%programfiles%/Microsoft Visual Studio 8/Common7/IDE/ProjectTemplateCache

e poi ricrearle con il seguente comando:

devenv.exe /Setup

 

Questa soluzione però nel mio caso non ha funzionato, quindi dopo altre ricerche ho trovato la soluzione per il mio caso specifico. Vi riporto pari pari la soluzione tratta dal sito di XNA:

 

If you install XNA Game Studio 2.0 with the English version of Visual Studio
2005 on a non-English version of Windows, you may experience the
following issues:

  • The standard templates are not visible in the integrated development environment (IDE).
  • The IDE uses a mix of English and non-English text.

To resolve these issues, click Options on the Tools menu, expand the Environment node, and ensure that International Settings is set to English instead of Same as Microsoft Windows. If you change this setting, you must restart Visual Studio 2005 for the change to take effect.

 

 

Posted in Programmazione | 1 Comment »

Vim: Indentazione & Syntax Highlight

Luglio 22nd, 2007 by Mattneri

Il file di configurazione di Vim si chiama vimrc e normalmente si trova o nella home directory oppure come nel caso di ubuntu in /etc/vim.

Per abilitare la syntax highlight basterà decommentare la seguente riga:

syntax on

 

Mentre per settare gli spazi corrispondenti a un TAB basterà inserire le seguenti righe:

filetype plugin indent on

autocmd FileType * setlocal sw=3 sts=3 et tw=78 sta

La prima riga abilita l’indentazione automatica, mentre nella seconda riga andiamo a specificare come vogliamo venga interpretata la pressione del tasto di tabulazione.

Nel precedente caso ho fatto in modo che i settaggi valgano per qualunque tipo di file (ma era possibile specificare anche singole tipologie, ad esempio c, cpp, h).

et indica che vogliamo che il TAB venga interpretato come una sequenza di spazi

sts lunghezza in caratteri di una tabulazione

sw lunghezza del rientro derivante da una indentazione automatica

sta consente di cancellare una tabulazione ( n spazi ) tramite una sola pressione di backspace

tw massima lunghezza in caratteri di una riga di testo

Questa soluzione potrebbe non funzionare su sistemi derivati da Debian in quanto viene installata una versione ridotta di vim (vim-tiny) che contiene solo un sottoinsieme ridotto delle features di vi. In tali casi basta installare il pacchetto vim-full e poi procedere alle suddette modifiche.

 

Posted in Linux, Programmazione | No Comments »

Code::Blocks vs Gtk2+

Luglio 20th, 2007 by Mattneri

Ammetto che sviluppo software sotto linux da relativamente poco tempo. Quindi inizialmente mi sono trovato un pò spiazzato nella scelta di un’IDE che potesse rimpiazzare almeno in parte le funzioni offerte dagli IDE commerciali presenti su piattaforma Microsoft.

Ho provato veramente varie opzioni, da quelle più minimali (Vim/Make) a Eclipse, passando per il plugin C++ di Netbeans e dando un’occhiata a Anjuta. Alla fine però la soluzione che mi ha maggiormente convinto consiste in un IDE cross-platform open source chiamato Code::Blocks.

Le cose che mi hanno più colpito di Code::Blocks, oltre alla pulizia della GUI, sono la curva di apprendimento relativamente veloce, l’estrema flessibilità ed adattabilità ( gli posso dire di utilizzare il compilatore della M$, il gcc, quello della Borland ecc…), la struttura modulare a plugin e gli aggiornamenti giornalieri!

Ultimamente lo sto utilizzando per sviluppare una GUI con le GTK+ ed eccoci giunti finalmente al motivo principale di questa guida…utilizzare Code::Blocks per sviluppare con C/C++ e GTK+.

Per prima cosa scarichiamoci tutto il necessario (la mia guida è relativa a Ubuntu ma non credo sia difficile adattarla a un’altra distro):

sudo apt-get install build-essential gdb libgtk2.0-dev

E poi inserendo in /etc/apt/sources.list il seguente repository scaricate le wxWidgets 2.8 necessarie x utilizzare le Nightly Builds:

## wget http://www.tt-solutions.com/vz/key.asc | sudo apt-key add key.asc
deb http://apt.tt-solutions.com/ubuntu/ feisty main

Che verranno poi installate con il seguente comando:

sudo apt-get install libwxgtk2.8-0 libwxgtk2.8-dev wx2.8-headers wx-common

 

Ora scarichiamo e installiamo la Nightly Build di Code::Blocks.

A questo punto dovremmo avere il nostro ambiente di sviluppo funzionante.

Creiamo un nuovo Progetto Vuoto e a questo punto non resta che configurare un paio di opzoioni di compilazione:

 

  1. In Project/Build options…/Compiler Settings/Other Options inserite `pkg-config –cflags gtk+-2.0`
  2. In Project/Build options…/Linker Settings/Other linker options inserite `pkg-config --libs gtk+-2.0`

Ora potete creare un nuovo User Template selezionando File/Save project as user template..

 

 

Posted in C/C++, Linux, Programmazione | 2 Comments »

Comunicazione tra Flash e C++/CLI

Giugno 6th, 2007 by Mattneri

 

Nei giorni scorsi stavo tentando si sviluppare un controllo flash da utilizzare all’interno di una Windows Form e mi sono di conseguenza scontrato con varie problematiche inerenti la comunicazione e il passaggio di dati fra le due tecnologie. Di seguito vi riporto brevemente alcune annotazioni. Gli snippets di codice riportati sono in ActionScript e C++/CLI, ma possono facilmente essere convertiti in qualunque linguaggio che giri sotto il .Net Framework.

 

 

Comunicazione da .Net a Flash:

  • SetVariable( String^ nome, String^ valore );

Permette di settare il valore di una variabile ActionScript. Il problema è che SetVariable prende come parametri due stringhe, quindi non posso passare altri tipi di dato.

flashObj->SetVariable( nome, valore );

 

  • CallFunction( String^ command );

Permette di richiamare una funzione definita in ActionScript passando eventuali parametri. Permette di passare come parametro booleani, stringhe, array e oggetti;

In actionscript bisogna ricordarsi di importare ExternalInterface:

import flash.external.ExternalInterface;

e di definire un CallBack per ogni funziona che si vuole richiamare da C++:

ExternalInterface.addCallback("setVisible", null, setVisible);

 

- Invoca la funzione resetAll (definita in actionscript) senza passare alcun parametro.

String^ command = "<invoke name=\"resetAll\" returntype=\"xml\"><arguments></arguments></invoke>";

flashObj->CallFunction(command);

 

- Invoca la funzione setVisible (definita in actionscript) e le passa un booleano a true.

command = "<invoke name=\"setVisible\" returntype=\"xml\"><arguments><true/></arguments></invoke>";

 

X maggiori info:

http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/

html/wwhelp.htm?context=LiveDocs_Parts&file=00000344.html

 

 

Comunicazione da Flash a .Net:

  • fscomand( string comando, string parametro );

Permette di scatenare un evento FSCommand che verrà catturato dal container del Ocx Flash. Anche in questo caso vi è la limitazione che fscommand permette di restituire solo stringhe(che poi andranno quindi convertite nel formato appropriato).

 

Da C++ quindi dobbiamo andare a gestire l’evento FSCommand.

void MyUserCtrl::flashObj_FSCommand(System::Object^ sender, AxShockwaveFlashObjects::_IShockwaveFlashEvents_FSCommandEvent^ e)

{

if(e->command == "Start")

{

switch(Int32::Parse(e->args))

{

case 1:

MessageBox::Show(“Start 1”);

break;

case 2:

MessageBox::Show (“Start 2”);

break;

}

}

else if(e->command == "stop")

{

MessageBox::Show(“Stop”);

}

}

 

Da ActionScript la sintassi da usare sarà la seguente:

fscommand(“Start”, “1”);

fscommand(“Stop”, “”);

 

  • ExternalInterface.call()

Permette di eseguire un metodo presente nel contenitore del controllo Flash. Richiede almeno un parametro che è il nome della funzione da richiamare. Gli eventuali altri parametri verranno poi passati alla funziona richiamata. Inoltre anche in questo caso è necessario importare la classe ExternalInterface.

var num1:Number = 5;

var num2:Number = 2;

var result:uint = ExternalInterface.call("somma", num1, num2 );

 

 

Gli argomenti passati da actionscript si potranno ricevere attraverso la proprietà request dell’evento e avranno una struttura simile alla seguente:

<invoke name="somma" returntype="xml">

<arguments>

<number>5</number>

<number>2</number>

</arguments>

</invoke>

 

Quindi in C++ il gestore dell’evento FlashCall sarà il seguente:

void MyUserCtrl:: flashObj _FlashCall(System::Object^ sender, AxShockwaveFlashObjects::_IShockwaveFlashEvents_FlashCallEvent^ e)

{

XmlDocument^ document = gcnew XmlDocument();

document->LoadXml(e->request);

XmlNodeList^ list = document->GetElementsByTagName("arguments");

somma( Convert::ToInt32( list[0]->FirstChild->InnerText ), Convert::ToInt32(list[0]->ChildNodes[1]->InnerText) );

}

 

void MyUserCtrl::somma( int num1, int num2 )

{

MessageBox::Show( (num1 + num2).ToString() );

}

Posted in C/C++, Net Framework, Programmazione | No Comments »

Unire più progetti MFC

Novembre 26th, 2006 by Mattneri

Qualche giorno fa a lavoro mi è capitato un problema per il quale apparentemente non ho trovato alcuna risposta anche cercando da google.

Ho sviluppato un nuovo controllo ocx e il problema stava proprio nell’integrare il mio nuovo controllo in una libreria di ocx già esistente.

La struttura di un normale progetto activex utilizzando Visual C++6 è la seguente:

Classi:

  • MyOcxApp: Classe derivata da COleControlModule che presenta metodi per l’inizializzazione e la pulizia delle risorse utilizzate dalla nostra applicazione.
  • MyOcxCtrl: Classe derivata da COleControl. In questa classe verrà scritto la maggior parte del codice del controllo.
  • MyOcxPropPage: Classe derivata da COlePropertyPage e utilizzata per la gestione del dialog della Property Page del nostro controllo.

File:

  • File .h e .cpp
  • File .odl: Contiene il codice dell’Object Description Language. Descrive l’interfaccia che il nostro controllo ocx espone.
  • File .def: File contenente le informazioni per il linking, il nome e la descrizione del controllo.
  • File.rc: File testuale contenente la descrizione di tutte le risorse utilizzate nel nostro progetto
  • File Resource.h: File header utilizzato dal file .rc. Non fa altro che definire delle costanti che poi verranno associate alle varie risorse utilizzate nel progetto.

La situazione iniziale in cui mi trovavo era la seguente: avevo un progetto che consisteva in una raccolta di diversi controllo ocx (chiamiamolo ad esempio BigOcx) e un altro progetto con il mio nuovo ocx (chiamiamolo NewOcx )…come fare per inserire il nuovo controllo nel primo progetto?

Premetto che VS6 non presenta ovviamente una soluzione semplice al problema ma bisogna un pò arrangiarsi copiando e mergiando files qua e la :)
Dopo svariate prove e altrettanti insuccessi ho buttato giù la seguente scaletta:

  • Assicurarsi di avere dato dei nomi univoci a tutte le risorse (dialog, icone, bmp, …) presenti in NewOcx, in modo che non si creino conflitti con altre risorse già presenti in BigOcx
  • Copiare e aggiungere i file .h e .cpp relativi alle classi NewOcxCtrl e NewOcxPropPage nel progetto BigOcx
  • Correggere gli #include nei file appena copiati
  • Aprire il progetto BigOcx e aprire la ResourceView, poi tramite File - Open selezionate il file.rc di NewOcx. A questo punto fate Drag&Drop di tutte le risorse che volete copiare. Infine copiate anche le stringhe di NewOcx in BigOcx.
  • Mergiate il file BigOcx.odl con quello NewOcx.odl stando attenti a copiare in BigOcx.odl solo le parti relative al controllo NewOcx (in genere a partire dalla stringa di commento: // Primary dispatch interface for NewOcxCtrl)
  • Provate a compilare ed a testare nell’ocx container il controllo.

Se avete seguito correttamente le istruzioni il progetto dovrebbe compilare senza problemi e vi dovrebbe essere un solo problema e cioè che aprendo il ClassWizard non siano presenti le classi relative al controllo appena inserito. Per risolvere basterà cancellare il file BigOcx.clw presente nella directory del vostro progetto.

Posted in MFC, Programmazione | 2 Comments »