|
MCAD
Post specifici sulla preparazione alla certificazione MCAD: materiale, codice C#, commenti
Ieri sera, con molta sorpresa, ho ricevuto il mio Welcome
Kit per essere diventato MCP! Sono molto contento, ho subito infilato la mia
wallet card nel portafoglio e, giusto per fare il figo, la farò vedere a
chiunque mi passi sotto il naso!
So che molti di voi magari essere MCP non è nulla, però per
me è fonte di soddisfazione. In attesa, quando le acque si saranno calmate, di
ricominciare a studiare per sostenere gli altri esami. Continuo a ricevere
tutt'oggi molti commenti sui miei post relativi ad MCAD scritti durante il periodo di preparazione.
Volevo ringraziare pubblicamente, senza...
Dopo avervi annoiato con ben 49 post relativi a MCAD,
dopo aver superato l'esame 70-316, adesso per me è tempo di ricominciare
daccapo. No, no, state tranquilli, non ho intenzione di ripartire con [MCAD.1]
(ma quasi quasi...), quanto piuttosto
quello di considerare il prossimo esame da fare, e quindi di ricominciare a
studiare.
Dato che punto a MCAD, le strade possibili sono fondamentalmente
tre. In ordine di preferenza personale crescente, ecco gli
esami che sto valutando.
Designing and Implementing Databases with Microsoft SQL
Server™ 2000 Enterprise Edition (70-229) - Di certo
non mi metto a studiare...
Dopo quasi 50 post effettivi sul mio blog per
la preparazione all'esame 70-316, questa mattina, finalmente, sono andato alla
Global Knowledge Network, qui a Milano, per sostenere finalmente l'esame.
Dovevo essere già sul posto alle 8:30, mezz'ora prima dell'esame. La pioggia ha
rallentato la mia andatura, ma alla fin fine sono arrivato puntuale.
Entro, do la carta d'identità, firmo un foglio. Mi accompagnano davanti al
PC, dove mi aspetta un software intitolato qualcosa tipo "Developing and Implementing Windows-based Applications with Microsoft
Visual C# .NET and Microsoft Visual Studio .NET". Un consiglio: le
tizie non sanno nulla del software, non sanno spiegare cosa fa...
Come ho già avuto modo di dire precedentemente, ci sono
diversi argomenti che ho tralasciato nella mia serie di articoli dedicati a
MCAD. Uno di questi, la creazione di Windows Control, lo considero piuttosto
importante (e, come al solito, piuttosto divertente), per cui ne parleremo oggi
in modo magari un po' superficiale, ma più che sufficiente per superare l'esame
70-316.
IntroduzioneInnanzitutto, cominciamo col dire che creare
un controllo significa in altre parole implementare una classe che erediti da
System.Windows.Forms.UserControl. Se utilizziamo l'editor
Visual Studio .NET, possiamo cominciare un progetto Windows Control
Library. L'editor ci propone in progettazione il classico Form
Designer,...
Usare il data-binding può veramente togliere gran parte del
lavoro di scrittura del codice. In questi giorni lo sto esplorando ben bene, e
devo dire che, sebbene ci siano molti modi diversi e sicuramente più ottimizzati
per realizzare WF che prelevino i dati da un database, è veramente divertente
e piacevole vedere cosa si può fare in così poco tempo. Si è sul serio
molto più produttivi.
Non mi interessa parlare di DataSource,
DataMember ed affini. In parte l'ho già fatto nel mio post precedente
, in parte vorrei invece approfondire...
Faccio sempre una brutta faccia quando sento
parlare di data-binding.In ambiente Visual Basic 6 ed affini, il
data-binding è un metodo che permette di "collegare" bidirezionalmente un
controllo ad una sorgente dati come, tipicamente, un database. Questo
collegamento era completamente trasparente per l'utente: era sufficiente
posizionare un controllo Data sul form o, più recentemente, un ADODC e impostare
qualche proprietà del controllo ed il gioco era fatto. Troppi automatismi
rendono il vita facile, è vero, ma tolgono allo stesso tempo controllo
lasciando poco spazio al programmatore per intervenire nel processo che, di
fatto, era gestito dal runtime di VB.
In...
Ecco lo scenario: il vostro collega ha sviluppato
in C# un assembly molto carino. L'assembly si chiama
GetBirthday.dll e dispone di un solo metodo statico,
GetNearestBirthday(). L'assembly è strong-named. Il nostro
collega l'ha installato nella nostra GAC con un piccolo installer
fatto da lui. Il metodo GetNearestBirthday ritorna una string contenente il
compleanno più vicino nel tempo fra quelli presenti in un database SQL Server
(qualsiasi riferimento all'applicazione Age è puramente
casuale).
L'assembly installato in questo momento è alla versione 1.0.0.0: noi lo
abbiamo usato nella nostra applicazione Age, e gira a
meraviglia. Clicco un pulsante, e in una TextBox mi viene detto che il prossimo...
Questo è il post relativo a MCAD N°44, oggi è il 4 ottobre, il primo post è stato scritto il 4 luglio.
Dev'essere il destino che ogni tanto fa questi giochini!! Oggi, quando uscirò
dall'uffico, andrò nella prima ricevitoria a giocare i numeri 4 e 44, ambo
secco. Chi lo sa, magari vinco qualcosa!!!
Tornando seri: ritengo di aver parlato della maggior parte degli argomenti inerenti l'esame
70-316. La data dell'esame si sta avvicinando....
Nei post [MCAD.31] e [MCAD.33] abbiamo visto come
lavorare con
.NET avendo a che fare con la CAS (Code Access Security ),
ovvero come assegnare o revocare
dei permessi in base all'origine e all' "affidabilità" del codice che sta per
essere eseguito. In base all'URL di provenienza, a seconda che l'assembly
venga eseguito dalle directory locali del proprio PC oppure dalla Intranet, il
runtime .NET assegna un permission sets piuttosto che un altro. Abbiamo visto
come usare caspol.exe
...
La classe SqlCommand
dispone del metodo Prepare per ottimizzarne l'esecuzione?E che prima di
chiamarlo dobbiamo settare i data-type di tutti i parametri, soprattutto la
proprietà Size per tutti quei parametri che hanno una lunghezza
variabile?
Esiste la keywork checked che serve a controllare gli
overflow nelle espressioni?
Esiste la keyword using che serve (anche) ad
iniziare blocchi di codice al termine dei quali viene fatta automaticamente
la Dispose dell'oggetto indicato al momento della sua
dichiarazione?
Lo strumento più corretto per distribuire un assembly nella GAC di
un cliente non è gacutil, ma Windows
Installer! Perchè? Perchè gacutil non incrementa il reference
counter dell'assembly: gacutil va usato solo in ambiente...
Negli ultimi post abbiamo divagato, ma mi è piaciuto
veramente far vedere a me e agli altri cosa sono riuscito a combinare con il
Setup Project di VS.NET. Credo che siano state un po' OT rispetto
al percorso richiesto dalla certificazione MCAD, però è sempre comodo
sapere qualcosa in più, piuttosto che qualcosa in meno. Con il post di oggi
chiudiamo il discorso dedicato alla creazione dei setup, vedendo un attimo quali
formati di files possiamo generare, che differenze ci sono, come possiamo
distribuirli e così via.
IntroduzioneInnanzitutto, ho riaperto la solution che
abbiamo avuto tra le mani fino a ieri. Clicchiamo...
Se le custom dialog preconfezionate non ci soddisfano,
se le launch conditions dovrebbero essere un po' più complesse, se abbiamo la
necessità di creare un qualcosa che non è possibile creare con le
caratteristiche base di Windows Installer, possiamo coprire questo gap
semplicemente sfruttando come si deve il nostro amico framework. Creando una nuova
Class Library e creando
una classe che eredita da System.Configuration.Install.Installer possiamo
piegare ai nostri scopi e fare tutto quello che vogliamo. La cosa magari non è
semplicissima, ma per me è stato talmente tanto divertente ed appagante che
voglio raccontare quello che ho fatto.
Creare una Class Library ed...
Nel mio ultimo post [MCAD.38] abbiamo parlato delle Launch Conditions. Come
ho detto, si tratta di condizioni che devono essere soddisfatte affinchè il
setup possa procedere regolarmente. Concettualmente, possiamo attivare una
Launch Condition secondo 3 modalità: il valore di una chiave nel registry,
la presenza di un file sul FS dell'utente finale e la presenza di un componente
COM installato tramite MSI. Queste 3 modalità attivano o meno la condition, che
fa apparire un messaggio all'utente comunicandogli l'impossibilità di installare
l'applicazione. Opzionalmente, possiamo indicare anche un URL, che l'utente può
visitare per avere maggiori informazioni.
Le possibilità offerte dal Setup Project di...
Nel post precedente abbiamo visto brevemente come creare un
setup (semplice semplice) per fare il deploy della nostra applicazione. Con
"semplice semplice" intendo dire che facciamo la copia dei files inclusi nel
progetto sul PC dell'utente finale, senza fare nulla di particolare. Abbiamo
visto che le dipendenze non sono più così importanti come nell'era DLL/OCX pre
.NET. Gli assembly devono/possono essere copiati nella
directory dell'applicazione stessa, oppure installati nella GAC se vogliamo che siano condivise fra
più di una applicazione. Facciamo questa operazione aggiungendo banalmente i files nel
nodo Application Folder.
Nel folder User's Desktop e in User's Programs Menu
mettiamo...
Nei (numerosi) post precedenti, abbiamo creato
pian pianino un'applicazione Age, giusto per verificare
passo passo tutte le classi/componenti/funzionalità che ho voluto trattare
per prepararmi all'esame. La mia applicazione sul mio PC è funzionante, e mi
diverte anche usarla - ho provato ad usarla adesso, e grazie alla stored
procedure che abbiamo creato qua, mi dice che il prossimo compleanno è quello di
mio papà!
Quello che voglio fare è creare un setup per rendere distribuibile l'applicazione
anche in giro, magari per mettere il download sul mio sito o...
Guardate un po' queste linee di codice in C# (che
chiameremo CodiceSemplice ):
daLettura = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM TabellaGigante", cnnLocale);DataSet ds = new DataSet();DataTable dt = new DataTable();ds.Tables.Add(dt);this.txtInizio.Text = DateTime.Now.ToString();cnnLocale.Open();daLettura.Fill(ds);cnnLocale.Close();this.txtFine.Text = DateTime.Now.ToString();TimeSpan ts = Convert.ToDateTime(this.txtFine.Text).Subtract(Convert.ToDateTime(this.txtInizio.Text));string msg = String.Format("Per caricare una tabella di {0} records ci ho messo {1} minuti!", ds.Tables[0].Rows.Count.ToString(), ts.ToString());this.textBox1.Text = msg;
Ho scritto una piccola applicazione Windows Forms per testare per bene
il caricamento di un DataSet da un sorgente dati come SQL Server. Ho letto
infatti alcune cose interessanti sulla property
EnforceConstraints del DataSet e sui metodi
BeginLoadData e EndLoadData
della classe DataTable. Ho voluto provare come si comportano, e ho ottenuto qualche
risultato.
Eseguiamo il codice, quanto tempo ci
metto? Il codice sopra
dichiara un SqlDataAdapter, un DataSet e una DataTable. In breve, popolo un DataSet
con una sola DataTable usando...
Abbiamo parlato di caspol.exe, di sn.exe e di
gacutil.exe. Un altro tool incluso in .NET è ngen.exe.
Quest'ultimo permette di compilare un assembly in codice nativo, allo scopo di
(poterne) migliorarne le performance durante la sua esecuzione. Normalmente,
come ben sappiamo, tutte le volte che generiamo un assembly con .NET, il file
EXE o la DLL sono scritti in IL (intermediate
language), il quale viene a sua volta tradotto in codice x86 tramite il
meccanismo di compilazione JIT (just-in-time).
Quando un assembly viene eseguito,
quindi, il framework deve intervenire, per compilarlo e finalmente eseguirlo.
Ovviamente, le prestazioni potrebbero risentirne, dato...
Più di una volta avrete sentito della famigerata Global Assembly Cache, per gli amici
GAC. Di cosa si tratta? La GAC è una
sorta di raccoglitore di tutti gli assembly che noi vogliamo condividere
tra più di un'applicazione. Lo scopo della GAC è proprio questo: se noi
sviluppiamo un assembly DLL contenente classi che noi vogliamo utilizzare in diverse
applicazioni .NET, possiamo semplicemente installare questo assembly nella GAC e
il gioco è fatto. Per poter installare un assembly nella GAC, occorre innanzittutto firmarlo con uno strong
name
...
Dopo aver parlato, poco tempo fa, di caspol.exe e di come .NET implementa alcune
logiche di sicurezza, voglio descrivere un attimo una cosa che mi ha fatto
perdere parecchio tempo per evidente ignoranza della questione. Ovvero (può
sembrare
banale), come revocare permessi ad un'applicazione.
Lasciatemi descrivere lo scenario in cui voglio ambientare la mia
spiegazione. Supponiamo di prendere la nostra applicazione
ReadRegistry che abbiamo creato a suo tempo e di farla girare da una qualsiasi directory
del nostro PC. Abbiamo detto che trattandosi di un EXE eseguito da un disco
locale, questo assembly gira nella My_Computer_Zone. In questo
caso, quindi, l'assembly...
Dopo aver visto caspol.exe nel post [MCAD.31] di ieri, ho trovato utile passare direttamente
a vedere gli strong names e la relativa l'utility sn.exe. Questa volta ho utilizzato come spunto questo articolo su codeproject.com , che spiega a cosa
servono gli strong names, come si fa a firmare (sign) un assemby con
uno strong name e quali scopi pratici ha.
A cosa serve uno strong name? Versioning e
AuthenticationLo risposta è già nel titolo di questo paragrafo.
Uno strong name è un meccanismo tramite il
quale vengono firmati gli assembly....
Nel post di ieri ho fatto una breve panoramica sulle utility
della command-line di .NET. Preso dal panico dalla mia ignoranza in fatto di
security, e spinto anche dal fatto che ho incontrato diverse domande
sull'utility caspol.exe, ho
deciso di cominciare da quest'ultima. Ho sfogliato e stampato le pagine su MSDN dedicate a questo tool
,
e ho letto un articolo su www.15seconds.com che illustra in breve come funziona il nuovo
modello di security implementato da .NET.
In cosa consiste? Come funziona la nuova security...
Innanzitutto tranquilizzo tutti quanti su una cosa: il
mio IMHO ha
ripreso a funzionare. L'ho semplicemente reinstallato e adesso posso nuovamente
usare il Code Snippet Editor e posso selezionare le categorie,
elementi dell'IDE che venerdì pomeriggio mi avevano abbandonato. Ringrazio Andrea per
avermi contattato per aiutarmi a risolvere il problema: ho provato a
rispondergli, ma l'euforia pre-Ligabue ha fatto passare IMHO in secondo piano.
Torniamo a noi. Lorenzo ha (come al solito) ragione: una
certa parte dell'esame 70-316 che mi sto preparando ad affrontare prende in
considerazione le utility .NET dalla command-line. Utility che permettono di
lavorare sulla GAC, sulle impostazioni di...
Facendo qualche test con i software Boson, mi è capitata qualche
domanda relativa all'IDE di Visual Studio: come configurare la tal opzione, come
attivare questo o quell'altro, a che serve la finestra Locals,
e così via. Non ho proprio la più pallida idea se poi all'esame ci saranno
domande di questo tipo, ma io mi sono fatto un giro comunque dentro l'IDE e un
po' su MSDN, per vedere di trovare pagine Web dedicate a questo argomento.
In questo post quindi non scriverò codice C#, ma farò una rapida carrellata
sull'ambiente di programmazione Visual Studio .NET.
Debugging in Visual Basic .NETHo trovato...
Nel post [MCAD.26] abbiamo visto come creare un SqlCommand per
eseguire operazioni sul nostro database. Nel caso specifico, in quel post il
SqlCommand è stato definito per eseguire una INSERT INTO (per
aggiungere records alla tabella ListBirthdays) e una TRUNCATE
TABLE (per svuotare la tabella ListBirthdays prima di popolarla).
Ieri sera mi sono divertito a
guardare meglio il SqlCommand, soprattutto nell'ottica di richiamare una
stored-procedure che ritorni al chiamante uno o più parametri di
output
...
L'argomento ADO.NET porta via un sacco di tempo e
spazio, per questo motivo preferisco aprire una piccola parentesi sulle classi
Debug e Trace. A cosa servono? Dove vengono
utilizzate?
Cominciamo con la prima: la classe Debug permette di
inserire linee di codice per visualizzare (più avanti vedremo meglio nel
dettaglio cosa si intende) alcune informazioni che possono essere utili per
debuggare la nostra applicazione. La prima cosa da sapere è che tutte le
linee di codice che utilizzano la classe Debug vengono
semplicemente ignorate quando compiliamo la nostra applicazione in modalità
Release. Mi spiego meglio, perchè credo che sia una cosa che...
A seguito del mio ultimo post di ieri, ho ricevuto diversi comment di Andrea e Lorenzo che mi hanno spinto a rivedere e ad ottimizzare il codice C# scritto, appunto, in quel post.
Motivo scatenante: l'utilizzo della classe SqlCommandBuilder. Come ho detto ieri, questa classe serve per facilitare e a velocizzare la creazione dei 3 Command necessari a ADO.NET per fare le sue operazioni sul database (i Command sono InsertCommand, DeleteCommand e UpdateCommand). Tranne in rarissimi casi, però, fretta e bene non vanno mai bene, ed effettivamente provando a visualizzare la CommandText dei 3 SqlCommand si vede che il codice SQL...
Riassunto delle ultime puntateNel post [MCAD.23] abbiamo visto i primi rudimenti di SqlConnection e SqlCommand all'interno della form frmConnection creata appositamente. In quel post ho scritto del codice per aprire una connessione verso SQL Server e due tipi diversi di SqlCommand (per eseguire una SELECT e per eseguire una stored-procedure). Lo scopo era quello di creare una tabella ListBirthdays sul server, pronta ad accogliere tutti i dati che inseriamo all'interno della nostra applicazione, ovvero tutte le istanze di Age, inteso come persone con le relative date di compleanno.
Nel post [MCAD.24] ho inserito nel codice qualche miglioramento che mi è stato consigliato da cui mi ha...
Nel post [MCAD.23] ho scritto alcune linee di codice relative a ADO.NET che hanno ricevuto qualche comment. Ho deciso quindi di riportare i consigli e i miglioramenti di Igor e di Daniele. Questi cambiamenti hanno a che fare sia con ADO.NET, sia con la buona programmazione C#, per cui ritengo questo post una sorta di add-on, un extra che chi vuole può saltare. Dunque, vediamo un po' di cosa si è parlato.
Enum SupportedTypeDBCominciamo con le cose più semplici. La mia applicazione Age gestisce un file app.config che inizialmente era scritto in questo modo:
<add key="TypeDB" value="SQLSERVER" /> <add key="DBConnection" value="Persist Security Info=True;Integrated Security=SSPI;database=age;server=SPOCK;Connect Timeout=30"/>
La key DBConnection non ci interessa: è semplicemente...
Nel post precedente, abbiamo creato un nuovo Windows
Form per regalare alla nostra applicazione qualche funzionalità in più in
materia di database, per esplorare per bene quello che ci offre ADO.NET. Il form
è quello riportato qui sotto, tutti i dettagli sulla sua implementazione sono
nel post [MCAD.22].
Quello che voglio fare oggi è la stessa cosa che ho anticipato la volta
scorsa. Appena l'utente clicca sul pulsante Ok, vuol dire che desidera da questo momento
utilizzare la nuova stringa di connessione specificata nella TextBox. Prima di
farlo, però, vorrei controllare che 1) la connessione funzioni realmente e
2) esista la tabella...
Nel mio ultimo (ormai lontano) post relativo ad MCAD,
avevo scritto delle funzioni in grado di leggere e scrivere files XML usando i
metodi messi a disposizione dalla classe DataSet. Usando
ReadXML e WriteXML, siamo riusciti a salvare su disco
l'elenco dei nostri compleanni, così da non dover tutte le volte popolare la
ListBox che abbiamo messo sulla Windows Form principale della nostra
applicazione.
Queste funzionalità hanno reso l'utilizzo della nostra piccola applicazione un po' più semplice
ed intelligente. Riprendiamo il discorso preparandoci ad affrontare al meglio le insidie
di ADO.NET!
Ecco l'interfaccia di Age come si presenta fino ad oggi....
Eccomi, direttamente dal mio giardino, pronto per andare
avanti e riprendere un attimo il discorso che avevamo lasciato in sospeso
mercoledì scorso. Nel mio ultimo post avevamo visto come salvare in un file
XML i compleanni che abbiamo inserito nella ListBox, ovvero:
abbiamo aggiunto qualche voce al nostro MainMenu per
prevedere le funzioni di caricamento, di salvataggio e di importazione dei
nostri files XML
abbiamo visto la creazione e l'utilizzo della function dichiarata
così:private DataTable
getSaveTable(bool
WithData)
abbiamo visto l'utilizzo di SaveFileDialog che consente
all'utente di scegliere...
Se ci ricordiamo bene, la UI della nostra applicazione
Age è piuttosta semplice e spartano. Nel post [MCAD.15] avevamo implementato le funzioni di stampa e
lo screenshot mostra il MainMenu aperto. Le funzioni
disponibili fino a questo momento sono le seguenti:
Imposta Pagina (handler mnuPageSetup_Click)
Anteprima di Stampa (handler mnuPrintPreview_Click)
Stampa (handler mnuPrint_Click)
Esci (handler mnuExit_Click)
Vi rimando al post [MCAD.15] per tutti i dettagli sull'implementazione degli
handler elencati sopra. Quello che vogliamo fare oggi è integrare nuove voci
al componente MainMenu per far posto alle nuove features che implementeremo. Qui sotto riporto uno screenshot
dell'applicazione.
Abbiamo aggiunto le...
Ok, dopo il preambolo di prima, dove abbiamo illustrato
in po' di semplice teoria che sta dietro ad ADO.NET, passiamo finalmente a fare
qualcosa di concreto nella nostra applicazione Age.
In pratica, vogliamo dare all'utente la possibilità di salvare la
lista dei compleanni e successivamente di ricaricarla
. In condizioni normali dovremmo utilizzare un qualsiasi database.
Questa volta vorrei adottare un approccio diverso e più interessante: invece di
usare un database di Access o di SQL Server, salveremo le informazioni in
files XML generati direttamente senza grossi problemi da
ADO.NET.
Come ho detto nel post precedente, vogliamo utilizzare la modalità
disconnessa di...
Ricominciamo subito con un argomento piuttosto tosto:
ADO.NET. ADO.NET è accessibile da .NET attraverso il namespace
System.Data. Ogni qualvolta vorremo utilizzare funzioni proprie
di ADO.NET, sarà bene quindi scrivere nel codice:
using System.Data;
ADO.NET ci permette di gestire database SQL Server, Oracle, Access e così
via. Ci permette di creare database, tabelle, campi, foreign-key, primary-key,
constraint tutto in memoria, attuando così quello che
viene definito da Microsoft come accesso ai dati disconnesso.
Cosa significa? In breve:
Apro la connessione verso il database
Carico una parte dei dati in memoria
Chiudo la connessione verso il database (liberando le
...
Ok, questo è l'appuntamento n.17 per la serie dei miei
post relativi alla certificazione MCAD (ecco qua l'elenco completo dei post
sotto la categoria [MCAD]). Con la scusa e la motivazione di creare
un'applicazione Age, pian piano stiamo sviscerando tutti gli
aspetti che bisogna conoscere per approdare alla certificazione MCAD. C'è stata
qualche nuova iscrizione su UGIdotNET, per cui mi permetto di
fare un attimo il punto della situazione: dove siamo partiti, cosa abbiamo fatto
e cosa dobbiamo ancora fare. Bene, cominciamo.
Innanzitutto, ricordiamoci che come scaletta abbiamo sfruttato...
Traduzione letterale per "Implement
accessibility features", tratto direttamente dalla Study Guide di Lorenzo. Cosa significa? Beh, fate una prova: prendete
un'applicazione che avete scritto voi, trovate l'icona del file EXE
e selezionatela. No, non fate doppio-click, selezionatela e basta!
Adesso bendatevi gli occhi, per bene, cercate il tasto Invio/Enter sulla
tastiera e premetelo: se la vostra applicazione funziona correttamente, l'avete
appena aperta. Fin qua è facile, no?
Ora, provate ad usarla senza vedere un accidenti. Molte
persone, compreso (una volta) il buon vecchio nonno Costantino, vivono
quotidianamente così. Come ve la cavate voi??? Maluccio, non è vero? Possiamo migliorare
le...
Oh, che bello, la nostra applicazione (che però non vi
ho ancora fatto vedere!! ) produce la nostra stampa, che mostra
l'elenco di tutti i compleanni che abbiamo inserito nella ListBox. Se abbiamo
scritto il codice correttamente, quando clicchiamo sul button
btnPrint appare l'anteprima di stampa, con l'header, il footer
e il contenuto nella parte centrale del report. Non solo, usando l'attribute Logo che ho creato,
posso mettere anche una bella immagine in alto a destra. Spero di poter
mettere on-line il codice durante il weekend.
Comunque sia, io personalmente non sono ancora soddisfatto. Perchè?
Un'applicazione che si rispetti innanzitutto ha un bel...
Ok, dopo qualche giorno di pausa, riprendiamo un po' con
la nostra guida ad MCAD. Nel mio ultimo post di venerdì scorso, abbiamo visto come
utilizzare la classe PrintDocument per stampare quello che
vogliamo. Il succo sta nel creare un oggetto PrintDocument e gestire l'evento
PrintPage della classe con un handler adatto, come abbiamo
fatto qui:
prnDoc.PrintPage += new PrintPageEventHandler(this.printBirthday);
Quindi, abbiamo creato una function printBirthday(); e usando GDI+ abbiamo
scritto tutto quello che vogliamo sul PrintDocument. Questo
metodo, sebbene funzioni alla perfezione, ha un grosso difetto: non produce
un'anteprima di stampa, ma indirizza l'output direttamente alla stampante
predefinita del sistema. Questo può anche andar...
Ho in mente parecchie idee carine sull'applicazione che
sta fungendo da base di studio per MCAD. Prima di passare a cose più serie, o
comunque a cose che bene o male ho già visto, (come ADO.NET o XML) ho
preferito questa volta vedere qualcosa che non ho mai preso in considerazione:
la stampa
...
Nel mio post precedente dedicato a MCAD abbiamo visto come tradurre la nostra applicazione in più lingue. Giocando con le property Localizable e Language delle WF, possiamo tradurre direttamente a design-time Text dei Button, dei GroupBox, degli Headers, delle WF stesse e così via. Tutto il (succulento) codice è incluso nella InitializeComponent() della WF, che invece di creare i controls impostandone le proprietà, in pratica le va a leggere direttamente dai files di risorsa generati automaticamente dall'IDE di VS.
Adesso quello che rimane da fare è localizzare tutta la parte che invece è inclusa nel codice, ovvero tutto quello che viene comunicato allo...
Nel sorgente che ho pubblicato, tutta l'applicazione è in lingua inglese. Su questo non c'è molto dire: quando abbiamo progetto la Windows Form (WF), abbiamo scritto le Label, i Button e i vari MessageBox in questa lingua. Se diamo un'occhiata alla function private void InitializeComponent(), vedremo che la property Text dei control è stata impostata sulla stringa esatta, così come compare a run-time. Ad esempio, ecco il codice che inizializza il btnCancel sulla WF.
// // btnCancel// this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));this.btnCancel.CausesValidation = false;this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;this.btnCancel.Location = new System.Drawing.Point(264, 312);this.btnCancel.Name = "btnCancel";this.btnCancel.Size = new System.Drawing.Size(56, 23);this.btnCancel.TabIndex = 4;this.btnCancel.Text = "Cancel";this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
Drin, drin! Squilla il telefono: è il signor Mario Rossi, che trova molto utile il nostro programma, però lo vorrebbe in lingua italiana, perchè lui l'inglese non...
La Study Guide che sto usando come scaletta presenta molti aspetti del framework che vanno imparati e vanno saputi per approdare a MCAD. I concetti espressi sono diversi, e vanno da ADO.NET, alla localizzazione delle applicazioni, dalla validazione dell'utente, a come debuggare correttamente il codice usando le classi relative al Debug e al Trace.
Ieri pomeriggio, che era una domenica fredda e piovosa, mi sono messo lì con il mio Visual Studio 2003 a casa ed ho creato l'applicazione di base che mette realmente in piedi i concetti espressi fino a questo momento. L'applicazione ha le seguenti caratteristiche (uno screenshot è qua)
usa...
Oggi è sabato, sicuramente ci sono meno persone che
seguono il blog di UGIdotNET. Per questo motivo volevo un attimo riassumere
quello che ho fatto finora e fare delle riflessioni.
Abbiamo creato una piccola applicazione .NET tramite
Windows Forms che dice l'età di una persona dato il suo anno di nascita
Sono stati usati l'evento Validating e il
controllo ErrorProvider per controllare che l'utente abbia inserito nella
TextBox un valore valido
E' stato visto l'utilizzo della Property CausesValidation sui controlli
per evitare la validazione sui pulsanti che non...
Nel post precedente abbiamo realizzato una piccola
applicazione che ci dice quanti anni abbiamo. Ho usato l'evento Validating
della TextBox per controllare che l'input dell'utente sia valido (in realtà l'ho
fatto in modo orrendo, come giustamente Marco ho
sottolineato). In questo post vado avanti con il discorso:
usiamo il controllo ErrorProvider per segnalare
all'utente l'errore
miglioriamo la validazione con la classe Convert
diamo una prima occhiata al blocco Try...Catch
Nel codice di ieri, se la validazione falliva, il codice prevedeva un
semplice e.Cancel = true ; senza dare
alcuna comunicazione all'utente. Semplicemente il focus...
Ieri pomeriggio e questa mattina ho pubblicato dei post con alcune domande pescate a caso dai test che ho acquistato personalmente dal sito www.boson.com. Senza pensarci troppo. Giustamente Lorenzo mi ha fatto notare che con una certa probabilità la licenza non prevede che uno acquisti le domande, e poi le possa pubblicare dove vuole, tra l'altro in un blog pubblico come questo.
Appena letto il comment di Lorenzo, ho provveduto a rendere disabilitati i post.Questo è il motivo per cui in questo momento non sono più raggiungibili.
Ho provveduto a contattare www.boson.com tramite qualche loro indirizzo di posta, ma non ho ancora...
Pierre in un suo post di qualche giorno fa, ha detto (testuali parole): "Si inizia spiegando i concetti base, quelli che spesso crediamo di avere chiari ma poi scopriamo che abbiamo delle falle ". Lui si riferiva a ben altro, ma sono convinto anche io di quello che ha detto. E' quello che ho voluto fare con il mio post dell'altra volta, cominciando a parlare di eventi. Se volete approfondire, ho trovato questa pagina su MSDN. Oggi andiamo avanti.
Dunque, un altro argomento che Lorenzo ha trattato nella sua Study Guide è l'evento Validating delle TextBox. Secondo Lorenzo...the best way to...
Questo post, sebbene sia normalmente visibile, non contiene il vero post originario.
In questo post avevo scritto pubblicamente alcune domande tratte dal software Boson per la preparazione alla certificazione MCAD. Ovviamente, questo non è lecito, per cui ho rimosso il contenuto, che è stato sostituito da questo, giusto per avvisare che il post [MCAD.5] è sempre esistito, ma semplicemente disabilitato.
Maggiori dettaglio e spiegazioni sulla questione nel post [MCAD.7]
Qui sotto riporto le prime 4 domande dai test che ho acquistato da www.boson.com per l'esame 70-316, scelte a caso, fra quelle che io ho sbagliato in questi giorni. Non dico ancora le risposte esatte, le commenterò in un post domani o dopodomani. Provateci voi!
How do you deploy a .NET application?A) .NET application do not require an installerB) Using the Package and Deployment WizardC) by toggling the package option in the Build dialogD) Using a setup and deployment project
What method of the ContextMenu, MainMenu and MenuItem classes can you use to merge MenuItem objects from one menu with the current menu?A)...
Grazie all'interessamento di Andrea Dottor, è
stato attivato in via sperimentale un portale con DotNetNuke, che potete trovare
all'indirizzo:
http://dnn.tanadellavolpe.net
Nonostante il nome un po' bizzarro, l'idea mi sembra bella e
ringrazio pubblicamente Andrea per aver dedicato parte del suo tempo a questa
iniziativa. L'obiettivo che ci siamo prefissi io e gli altri collaboratori
con cui sono in contatto è quello di accentrare su UGIdotNET il più
possibile: blog per scrivere articoli e post di approfondimento sugli esami,
forum per chiarimenti e domande. Purtroppo non sapevo dove poter raccogliere il
codice sorgente, per cui la piattaforma DotNetNuke è l'ideale.
I contenuti non sono moltissimi, per ora, ma confido...
Uno dei punti della Study Guide di Lorenzo parla di come
creare e gestire gli eventi delle Windows Forms di .NET. Parto dal presupposto
che sappiate cosa sia il framework, come funzioni l'IDE di Visual Studio e
conosciate almeno le basi di C# o VB.NET per programmare.
Gestire un evento significa scrivere una function che
faccia un qualcosa quando quell'evento
accade. Per esempio, un button può essere cliccato, una Windows Form
(WF) può essere ridimensionata o ridotta ad icona, una combobox può essere "aperta"
(passatemi il...
Prima di cominciare a parlare di C#, di classi, oggetti
ed eventi, è bene fare un bel punto della situazione e parlare un attimo di
quello che userò (useremo) per preparare l'esame. Dunque, se avete un
po' di tempo libero ogni giorno vi consiglio caldamente di
stampare, stampare, stampare
. A me piace...
Mi piacerebbe sfruttare il mio blog per creare una sorta di diario della preparazione alla certificazione MCAD (Application Developer). L'idea è quella di utilizzare il blog per riassumere tutte le nozioni e le informazioni che ruotano attorno a MCAD e di approfondire i temi presi di mira dagli esami, costruendo così una sorta di step-by-step al conseguimento della certificazione. Mi rendo conto che potrebbe essere un'impresa importante e titanica, però mi ispira. E come tutte le cose che mi ispirano, mi vien voglia di metterla in pratica. :-)
Gli obiettivi che in questo momento mi propongo sono:
- presentare il materiale che...
|