Tips & Tricks Roberto Brunetti [email protected] Marco Frontini [email protected] .

41

Transcript of Tips & Tricks Roberto Brunetti [email protected] Marco Frontini [email protected] .

Page 1: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .
Page 2: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Tips & TricksTips & Tricks

Roberto Brunetti Roberto Brunetti

[email protected]@DevLeap.com

httphttp://thinkmobile.it/blogs/rob://thinkmobile.it/blogs/rob

Marco FrontiniMarco Frontini

[email protected]@softandroll.it

http://thinkmobile.it/blogs/fronthttp://thinkmobile.it/blogs/front

Page 3: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

ArchitetturaArchitettura

• Mai scrivere il codice nel Click !!!!!!!!Mai scrivere il codice nel Click !!!!!!!!• Dopo i controlli sull’interfaccia specificaDopo i controlli sull’interfaccia specifica• Chiamare una classe che esegue il lavoroChiamare una classe che esegue il lavoro

• Occhio al numero di oggetti caricatiOcchio al numero di oggetti caricati• Non usare GC.Collect()Non usare GC.Collect()• Implementare IDisposable dalle classi che Implementare IDisposable dalle classi che

fanno uso di altre risorsefanno uso di altre risorse• Usare .Dispose() dal chiamante (o using)Usare .Dispose() dal chiamante (o using)• Come si fa per Connection al db, File etc etcCome si fa per Connection al db, File etc etc

Page 4: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

trytry {{ File.Open()File.Open() }} catchcatch (FileNotFoundException e) (FileNotFoundException e) {{ MessageBox.Show(“Casino sul file”);MessageBox.Show(“Casino sul file”); }} finallyfinally {{ File.CloseFile.Close }}

Uso Corretto try/catchUso Corretto try/catch

• Usare Usare try/finallytry/finally all’interno di all’interno di try/catchtry/catch::

trytry {{

trytry {{ File.Open()File.Open() }} finallyfinally {{ File.CloseFile.Close }} }} catchcatch (FileNotFoundException e) { (FileNotFoundException e) { MessageBox.Show(“Casino sul file”);MessageBox.Show(“Casino sul file”); }}

Page 5: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Close / MinimizeClose / Minimize

• I form si minimizzano (X)I form si minimizzano (X)• Come le applicazioni CECome le applicazioni CE• Share Violation da VS mentre copia dell’exeShare Violation da VS mentre copia dell’exe• Molte utility intercettano la X per chiudere Molte utility intercettano la X per chiudere

effetttivamente l’applicazione (form)effetttivamente l’applicazione (form)• PocketPlus / Pocket ControllerPocketPlus / Pocket Controller

• Restando in memoriaRestando in memoria• MinimizeBox = falseMinimizeBox = false

• Mette OK nella ControlBoxMette OK nella ControlBox• Chiude la formChiude la form

• Non Logo-Compliant !Non Logo-Compliant !

Page 6: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Stop CloseStop Close

• Per applicazioni sempre attive e bloccantiPer applicazioni sempre attive e bloccanti• Intercettare Form.ClosingIntercettare Form.Closing

• (System.ComponentModel.CancelEventArgs e)(System.ComponentModel.CancelEventArgs e)

• e.Cancel = true;e.Cancel = true;

• Occorre MinimizeBox = falseOccorre MinimizeBox = false• Deve chiudersi non minimizzarsiDeve chiudersi non minimizzarsi

Page 7: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

UI lentaUI lenta

• Il disegno dei bit sullo schermo non e’ Il disegno dei bit sullo schermo non e’ velocissimo velocissimo

• Per riempire i controlli con molti datiPer riempire i controlli con molti dati• Visibile = FalseVisibile = False• CicloCiclo• Visible = TrueVisible = True

• Usare BeginUpdate / EndUpdate se Usare BeginUpdate / EndUpdate se supportatisupportati

• Demo FillingComboVBRichClientDemo FillingComboVBRichClient• (HighResolutionTimer)(HighResolutionTimer)

Page 8: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Form LoadForm Load

• Sempre Lento ! Sempre Lento ! • ObiettivoObiettivo

• Prima voltaPrima volta• Ridurre il tempo di caricamentoRidurre il tempo di caricamento

• Successive volteSuccessive volte• Azzerare il tempoAzzerare il tempo

Page 9: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Form Load first time (20% c.a.)Form Load first time (20% c.a.)

• VS.NET 2003VS.NET 2003• Costruttore chiama InitializeComponentCostruttore chiama InitializeComponent

• InitializeComponentInitializeComponent• Controlli Quadrati (Panel, Tab, Form)Controlli Quadrati (Panel, Tab, Form)

• Sostituire con this.xxx.Bound = new Rectangle())Sostituire con this.xxx.Bound = new Rectangle())

• GerarchiaGerarchia• Usare figlio.Parent al posto di Papà.AddUsare figlio.Parent al posto di Papà.Add• E Top Down: prima il papà e poi il figlioE Top Down: prima il papà e poi il figlio

• Occhio che il Designer rigenera sempre tuttoOcchio che il Designer rigenera sempre tutto• Agire subito prima del deployAgire subito prima del deploy• Fare classe Finta che blocca il designerFare classe Finta che blocca il designer• Tenere due formTenere due form

• Su quella “Auto” fare modifiche e ricopiare il “Vera”Su quella “Auto” fare modifiche e ricopiare il “Vera”

Page 10: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Form ReLoad Form ReLoad

• Form di dettaglio da aprire più volteForm di dettaglio da aprire più volte• Definire static il costruttoreDefinire static il costruttore

• Che inizializza solo la prima volta la formChe inizializza solo la prima volta la form

• Definire costruttore privatoDefinire costruttore privato

• In pratica si tiene in memoria la formIn pratica si tiene in memoria la form• Meno costruzione/distruzione oggetti !Meno costruzione/distruzione oggetti !• Il GC non può scaricare la form se c’è bisogno Il GC non può scaricare la form se c’è bisogno • Volendo si può precaricare da un background Volendo si può precaricare da un background

threadthread• Al Al termine del Load termine del Load della prima form della prima form

Page 11: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Collection di formCollection di form

• Mettere le istanze dei form in collectionMettere le istanze dei form in collection• Array – Collection Custom – etc...Array – Collection Custom – etc...

• Si possono precaricare all’inizio in Si possono precaricare all’inizio in backgroundbackground• Fra un attimo parliamo di threadFra un attimo parliamo di thread

• Si possono caricare alla prima richiestaSi possono caricare alla prima richiesta

• Occhio alla quantità di memoria occupataOcchio alla quantità di memoria occupata• Se troppa il GC potrebbe scaricare il codice Se troppa il GC potrebbe scaricare il codice

compilatocompilato

Page 12: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Form non-full screenForm non-full screen

• FormBorderStyle = NoneFormBorderStyle = None• ObbligatorioObbligatorio• Altri valori fanno tornare il form full screen a Altri valori fanno tornare il form full screen a

runtimeruntime

• Ma ci perdiamo il bordo !!!Ma ci perdiamo il bordo !!!

• Override del metodo PaintOverride del metodo Paint• Disegnare noi il bordoDisegnare noi il bordo• Più semplice di quanto si credaPiù semplice di quanto si creda

Page 13: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Forms Full-Screen & ControlsForms Full-Screen & Controls

• ManagedManaged• Text = “”Text = “”• Menu = null/NothingMenu = null/Nothing

• ……e se serve l’input panel o il menu?e se serve l’input panel o il menu?• Native – SHFullScreenNative – SHFullScreen

• ……e se l’utente usa l’help dell’input panel?e se l’utente usa l’help dell’input panel?• Managed OnDeactivate()Managed OnDeactivate()• Native GetForegroundWindowNative GetForegroundWindow

• Non dimentichiamoci uno shortcut Non dimentichiamoci uno shortcut • Per chiudere in caso di manutenzione (magari con Per chiudere in caso di manutenzione (magari con

password)password)

• Task List: come visualizzare una sola formTask List: come visualizzare una sola form

Page 14: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Scrollable SomethingScrollable Something

• System.Windows.Forms.ScrollableControlSystem.Windows.Forms.ScrollableControlèè una finta una finta• Managed Managed

• Panel come container dei child ControlsPanel come container dei child Controls

• NativeNative• ScrollWindowEx + SW_SCROLLCHILDRENScrollWindowEx + SW_SCROLLCHILDREN

• E con la Second EditionE con la Second Edition• … … ancora peggio…ancora peggio…

• Custom ControlCustom Control• Il designer di VS 2003 non li supportaIl designer di VS 2003 non li supporta• Nessun problema, lo inganniamo Nessun problema, lo inganniamo

Page 15: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Funzionalità dei Funzionalità dei DeviceDevice

• OrientamentoOrientamento• RisoluzioneRisoluzione

Display e LayoutDisplay e Layout

• .NET Compact Framework 1.0 Service Pack 2 (.NET Compact Framework 1.0 Service Pack 2 (oggioggi))• Gestione automatica delle form scrollabiliGestione automatica delle form scrollabili• Evento Form.ResizeEvento Form.Resize• Gestione automatica dell’alta risoluzioneGestione automatica dell’alta risoluzione• White paper su MSDN:White paper su MSDN:

Developing Screen Orientation-Aware ApplicationsDeveloping Screen Orientation-Aware Applications

Page 16: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Display And LayoutDisplay And Layout.NET Compact Framework 2.0.NET Compact Framework 2.0

• Supporto all’orientamentoSupporto all’orientamento• Docking e AnchoringDocking e Anchoring• Proprietà AutoScroll – forms, panelsProprietà AutoScroll – forms, panels• Metodi Suspend/Resume LayoutMetodi Suspend/Resume Layout• Metodo ChangeOrientationMetodo ChangeOrientation

• Supporto alla risoluzioneSupporto alla risoluzione• Scaling automaticoScaling automatico

• Demo dopo con FabioDemo dopo con Fabio

Page 17: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

SIPSIP

• Display automatico su campo inputDisplay automatico su campo input• Controllo da codiceControllo da codice

• Aggiungere il controllo Software Input PanelAggiungere il controllo Software Input Panel• SIP.Enabled = true/falseSIP.Enabled = true/false

• Resize del form/controlliResize del form/controlli• Intercettare EnableChangedIntercettare EnableChanged• Proprietà VisibleDesktop di tipo RectagleProprietà VisibleDesktop di tipo Rectagle• Height e Width per sapere la dimensioneHeight e Width per sapere la dimensione• Ctor per salvare la dimensione originaleCtor per salvare la dimensione originale

Page 18: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Versione .NET CF InstallataVersione .NET CF Installata

• System.Environment.VersionSystem.Environment.Version• Major / Minor / Revision / BuildMajor / Minor / Revision / Build

• N.B. I service Pack escono redistributableN.B. I service Pack escono redistributable• Non aggiornano . Cab sotto VS 2003Non aggiornano . Cab sotto VS 2003• Si devono copiare i cab sull’emulatoreSi devono copiare i cab sull’emulatore• VS 2005 non è più cosìVS 2005 non è più così

• Connessione con ActiveSync dell’emulatore !Connessione con ActiveSync dell’emulatore !

• Da DesktopDa Desktop

Page 19: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

App.PathApp.Path

• MagariMagari• OpenNETCFOpenNETCF• ReflectionReflection

• Assembly.GetExecutingAssembly().GetName().CodAssembly.GetExecutingAssembly().GetName().CodeBase eBase

• System.IOSystem.IO• Path.GetDirectoryName per strappare l’exePath.GetDirectoryName per strappare l’exe

Page 20: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

RegistryRegistry

• P/Invoke ?P/Invoke ?• OpenNETCFOpenNETCF

• Classe OpenNETCF.Win32.RegistryClasse OpenNETCF.Win32.Registry• SottoClassi DedicateSottoClassi Dedicate

• ClassesRootClassesRoot• CurrentUserCurrentUser• LocalMachineLocalMachine• UsersUsers

• CreateSubKeyCreateSubKey• OpenSubKeyOpenSubKey• DeleteSubkeyTreeDeleteSubkeyTree

Page 21: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

File di ConfigurazioneFile di Configurazione

<appSettings><appSettings><add key=“nome” value=“xxxx” /><add key=“nome” value=“xxxx” />

</appSettings></appSettings>

• Da codice Namespace Da codice Namespace OpenNETCF.ConfigurationOpenNETCF.Configuration• ConfigurtionSettings.AppSettings[“nome”]ConfigurtionSettings.AppSettings[“nome”]

• N.B. OpenNETCF 1.2N.B. OpenNETCF 1.2• Per applicazione Applicazione.exe.configPer applicazione Applicazione.exe.config

• Per DLL Applicazione.dll.configPer DLL Applicazione.dll.config• Solo per primo livello Solo per primo livello

• 1.3 Applicazione.exe.config1.3 Applicazione.exe.config

Page 22: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Threding in .NET CFThreding in .NET CF

Page 23: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Semplice IntroSemplice Intro

• Non usare il processore se non necessarioNon usare il processore se non necessario• Non usare polling !!!!Non usare polling !!!!

• Soprattutto per sincronizzare i threadSoprattutto per sincronizzare i thread

• Il multithread aggiunge complessitàIl multithread aggiunge complessità• Per definizione un’applicazione multithread Per definizione un’applicazione multithread

non va più veloce...anzinon va più veloce...anzi• Ma più sfruttare momenti di pausaMa più sfruttare momenti di pausa

• Perché aspettare i dati da un DB invece di fare Perché aspettare i dati da un DB invece di fare qualcos’altro nel frattempo ?qualcos’altro nel frattempo ?

• Perché non eseguire operazioni in background mentre Perché non eseguire operazioni in background mentre l’utente fa altro ?l’utente fa altro ?

Page 24: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Threading NamespaceThreading Namespace

• .NET CF 1.0.NET CF 1.0• ThreadThread• CurrentThreadCurrentThread• PriorityPriority• SleepSleep• StartStart

• Foreground only !Foreground only !

• .NET CF 2.0.NET CF 2.0• ThreadThread• CurrentThreadCurrentThread• IsBackgroundIsBackground• NameName• PriorityPriority• AbortAbort• JoinJoin• SleepSleep• StartStart

• Fore e BackFore e Back

Page 25: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Thread.CreazioneThread.Creazione

• .NET Compact Framework 1.0.NET Compact Framework 1.0• Creare e avviare thread è sempliceCreare e avviare thread è semplice

Thread myThread = new Thread(new ThreadStart(MyWorkerThread));Thread myThread = new Thread(new ThreadStart(MyWorkerThread));myThread.Start();myThread.Start();

private void MyWorkerThread()private void MyWorkerThread(){{

while (! workerThreadDone)while (! workerThreadDone){{

// simulate some processing// simulate some processingThread.Sleep(1000);Thread.Sleep(1000);

}}}}

Page 26: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Thread.CreazioneThread.Creazione

• .NET Compact Framework 2.0.NET Compact Framework 2.0• Creare e avviare thread è più sempliceCreare e avviare thread è più semplice

Thread myThread = new Thread(Thread myThread = new Thread(MyWorkerThreadMyWorkerThread););myThread.Start();myThread.Start();

private void MyWorkerThread()private void MyWorkerThread(){{

while (! workerThreadDone)while (! workerThreadDone){{

// simulate some processing// simulate some processingThread.Sleep(1000);Thread.Sleep(1000);

}}}}

Page 27: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Demo ConsiderazioniDemo Considerazioni

• Abbiamo tre problemi nelle demo Abbiamo tre problemi nelle demo precedentiprecedenti

• Usiamo la variabile “i”Usiamo la variabile “i”• Se facciamo partire due thread andiamo in Se facciamo partire due thread andiamo in

scrittura della stessa variabilescrittura della stessa variabile• Lo abbiamo fatto solo per DemoLo abbiamo fatto solo per Demo

• Se chiudiamo la App con il thread in corsaSe chiudiamo la App con il thread in corsa• La Form sembra si chiuda...fra pocoLa Form sembra si chiuda...fra poco

• Se abbiamo bisogno di aspettare il thread Se abbiamo bisogno di aspettare il thread prima di fare altre operazioniprima di fare altre operazioni• Es Riempio Combo in parallelo ma prima di Es Riempio Combo in parallelo ma prima di

usarla il thread deve aver finitousarla il thread deve aver finito

Page 28: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Application ShutdownApplication Shutdown

• 1.0 solo Foreground Thread1.0 solo Foreground Thread• L’applicazione termina solo quando tutti i thread L’applicazione termina solo quando tutti i thread

foreground finisconoforeground finiscono• Sembra che si chiuda ma i thread avviati Sembra che si chiuda ma i thread avviati

proseguonoproseguono• Evitiamo la chiusuraEvitiamo la chiusura

• Oppure potremmo stoppare il threadOppure potremmo stoppare il thread• Ma in 1.0 non c’è AbortMa in 1.0 non c’è Abort

• Occorre usare una variabile - Polling ?!?!?!Occorre usare una variabile - Polling ?!?!?!• OpenNETCF.ThreadingOpenNETCF.Threading

• ThreadExThreadEx• MonitorEx, Semaphore, EventWaitHandleMonitorEx, Semaphore, EventWaitHandle

Page 29: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

2.0 Abort2.0 Abort

• Possiamo chiedere a un thread .AbortPossiamo chiedere a un thread .Abort• Otteniamo un’eccezione ThreadAbortExceptionOtteniamo un’eccezione ThreadAbortException• Non facciamo PollingNon facciamo Polling

• 2.0 anche Background Thread2.0 anche Background Thread• Terminati dal CLR se l’applicazione terminaTerminati dal CLR se l’applicazione termina• Thread.Abort chiamato dal CLRThread.Abort chiamato dal CLR• Per Default sono ForeGroundPer Default sono ForeGround

• IsBackGround = true;IsBackGround = true;

Page 30: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Sapere quando ha finitoSapere quando ha finito

• 1.0 AutoResetEvent1.0 AutoResetEvent• False prima di StartFalse prima di Start• .Set() alla fine del lavoro del Thread.Set() alla fine del lavoro del Thread• .WaitOne().WaitOne()

• 2.0 Join2.0 Join• Nessun AutoResetEvent da dichiarareNessun AutoResetEvent da dichiarare

• Ne serve 1 per ogni thread (lavoro da fare)Ne serve 1 per ogni thread (lavoro da fare)

• Nessuna variabileNessuna variabile

Page 31: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Aggiornare UI da altri ThreadAggiornare UI da altri Thread

• Mai aggiornare i controlli direttamenteMai aggiornare i controlli direttamente

private void WorkerThread()private void WorkerThread(){{ statusBar1.Text = “Sto facendo questo";statusBar1.Text = “Sto facendo questo";

while (!workerThreadDone)while (!workerThreadDone) {{ Thread.Sleep(1000);Thread.Sleep(1000); }}}}

Page 32: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

1.01.0• Nessun eccezione...pizza e basta Nessun eccezione...pizza e basta • Control.InvokeControl.Invoke

• Sincrono e senza parametriSincrono e senza parametri

private string statusBarText;private string statusBarText;

private void WorkerThread()private void WorkerThread(){{ statusBarText = "WorkerThread active";statusBarText = "WorkerThread active"; this.Invoke(new EventHandler(UpdateStatusBar));this.Invoke(new EventHandler(UpdateStatusBar)); while (!workerThreadDone)while (!workerThreadDone) {{ Thread.Sleep(1000);Thread.Sleep(1000); }}}}

private void UpdateStatusBar(object sender, EventArgs e)private void UpdateStatusBar(object sender, EventArgs e){{ statusBar1.Text = statusBarText;statusBar1.Text = statusBarText;}}

Page 33: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

2.02.0• .NET CF 1.0.NET CF 1.0

• Invoke (delegate)Invoke (delegate)

• N.B. 2.0 N.B. 2.0 • Eccezione se usato non correttamenteEccezione se usato non correttamente• AsincronoAsincrono• Parametri...non dobbiamo fare più variabili Parametri...non dobbiamo fare più variabili

• .NET CF 2.0.NET CF 2.0• Invoke (delegate)Invoke (delegate)• Invoke (delegate, object[])Invoke (delegate, object[])• BeginInvoke (delegate)BeginInvoke (delegate)• BeginInvoke (delegate, object[])BeginInvoke (delegate, object[])• EndInvoke ()EndInvoke ()• NotSupportedExceptionNotSupportedException

Page 34: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

2.02.0

private void WorkerThread()private void WorkerThread(){{ statusBar1.Text = “Sto Facendo…calma";statusBar1.Text = “Sto Facendo…calma";

while (!workerThreadDone)while (!workerThreadDone) {{ Thread.Sleep(1000);Thread.Sleep(1000); }}}} NotSupportedExceptionNotSupportedException

Page 35: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

2.02.0

• Control.(Begin)InvokeControl.(Begin)Invoke

private delegate void UpdateSB (string statusBarEntry);private delegate void UpdateSB (string statusBarEntry);

private void WorkerThread()private void WorkerThread(){{ UpdateSB sbUpdater = UpdateStatusBarUpdateSB sbUpdater = UpdateStatusBar;; this.Invoke(sbUpdater, new object[] {"WorkerThread active"});this.Invoke(sbUpdater, new object[] {"WorkerThread active"}); while (!workerThreadDone)while (!workerThreadDone) {{ Thread.Sleep(1000);Thread.Sleep(1000); }}}}

private void UpdateStatusBar(string statusBarInfo)private void UpdateStatusBar(string statusBarInfo){{ statusBar1.Text = statusBarInfo;statusBar1.Text = statusBarInfo;}}

Page 36: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Occhio alla chiusura !!!Occhio alla chiusura !!!

• 1.01.0• Foreground threadForeground thread• Dispose del Form uccide i controlliDispose del Form uccide i controlli• E il delegate fa la pizzaE il delegate fa la pizza

• 2.02.0• == 1.0== 1.0• Background threadBackground thread• Richiesto abort da CLRRichiesto abort da CLR• Intercettare ThreadAbortException e fermare le Intercettare ThreadAbortException e fermare le

invokeinvoke• Potrebbe essere comunque troppo tardiPotrebbe essere comunque troppo tardi

• Oppure evitare la chiusura come abbiamo Oppure evitare la chiusura come abbiamo vistovisto

Page 37: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Non tutti sanno che …Non tutti sanno che …

• Retargetable flag attributeRetargetable flag attribute• Typed DataSetsTyped DataSets• HTTP ServerHTTP Server• Migrazione da eMbedded Visual ToolsMigrazione da eMbedded Visual Tools• ObfuscationObfuscation• Compilazione da riga di comandoCompilazione da riga di comando• Control Design – RuntimeAssemblyAttributeControl Design – RuntimeAssemblyAttribute• String.Intern()String.Intern()

Page 38: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Design guidelines di MicrosoftDesign guidelines di Microsoft

• Pocket PC 2003 SDKPocket PC 2003 SDK• SmartPhoneSmartPhone 2003 SDK 2003 SDK

Page 39: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

How ToHow To

• Custom TextBoxCustom TextBox• managed o native ?managed o native ?

• Device IDDevice ID• KernelIoControl() - IOCTL_HAL_GET_DEVICEIDKernelIoControl() - IOCTL_HAL_GET_DEVICEID

• WorkaroundWorkaround• ToolbarToolbar• ImageListImageList• ListView con Second Edition e SP2ListView con Second Edition e SP2

• DEMO #5DEMO #5

Page 40: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

Fuori in 60 secondiFuori in 60 secondiCreare una gestione dati in 60’’Creare una gestione dati in 60’’

DataSoul FrameworkDataSoul Framework

Page 41: Tips & Tricks Roberto Brunetti Roberto@DevLeap.com  Marco Frontini marco.frontini@softandroll.it .

© 2004 Microsoft Corporation. All rights reserved.© 2004 Microsoft Corporation. All rights reserved.This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY.This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY.Content created by 3 Leaf SolutionsContent created by 3 Leaf Solutions