1 / 60

Learn & Get

Learn & Get. Day #2: Sviluppo applicazioni. Windows Forms ...le conosciamo tutti... .NET Class Library Libreria di classi (business layer) Console Application Applicazioni console GUI DOS Like Windows control library Libreria di controlli windows Window Service

Download Presentation

Learn & Get

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Learn & Get Day #2: Sviluppo applicazioni

  2. Windows Forms ...le conosciamo tutti... .NET Class Library Libreria di classi (business layer) Console Application Applicazioni console GUI DOS Like Windows control library Libreria di controlli windows Window Service Applicazione windows che girano al termine del boot di Windows Altri template Estensioni di Visual Studio installate successivamente Tipi di applicazioni (Windows)

  3. FormX Sub Main Può stare in una classe Application Framework Si decide dalle proprietà del progetto (MyProject) Impostazioni tipiche (Versione, Icona, Mode...) Startup Public Sub Main() End Sub Public Sub Main(args() as String) End Sub Environment.GetCommandLineArgs() Environment.CommandLine()

  4. Form è una classe in System.Windows.Form Come tale va trattata I forms sono classi che ereditano da Form Sono realizzati come classi parziali (.designer.vb) Non modificate il codice nel file .designer.vb Il dilemma Form1.Show() L’applicazione non parte... Application.Run L’applicazione ‘vive’ finchè ‘vive’ il form principale Usate Application Framework Analizzate la classe Application Application.ThreadException Application.Idle Application.DoEvents Application.Restart Mostrare il form da Sub Main

  5. Controllo dell’allineamento SnapLines Margins (Bordo esterno) Padding (Bordo interno) Dock Anchor SplitPanel LayoutControls FlowLayout TableLayout Form Layout MaximumSize MinimumSize StartPosition FormBorderStyle Layout dei controlli

  6. AutoScroll Opacity I form possono essere trasparenti Shaped I forms possono avere forma irregolare Styles Application.EnableVisualStyles TopMost DialogResult CenterToParent, CenterToScreen Centrano il form rispetto al parent o allo schermo AcceptButton e CancelButton Interazione e aggiunta controlli Supportano controlli COM (ocx) Form

  7. Permettono di creare UI stile Office 2003 Il look è basato su una classe ToolStripRenderer Menu,ToolBars, StatusBars e ToolTips Draw ProfessionalRenderer CustomRenderer ToolStripItem • ToolStripContainer • Permette di gestire il docking di items • Il renderer gestisce Load e Save dello stato degli items • ToolStripManager • Persiste/recupera il layout (Load/SaveSettings) • Stabilisce il renderer da usare • ContextMenuStrip • Permette di creare menu contestuali • Tooltip component • Help component

  8. Form.IsMDIContainer=True Form.MdiParent=Me ToolStripMenu.MdiWindowListItem Indica quale item gestirà le finestre visualizzate Form.ActiveMDIChild Indica il chil form attivo Evento Form.MDIChildActivate Generato quando il child form si attiva LayoutMDI Modifica il layout delle finestre child Applicazioni MDI

  9. E’ possibile applicare l’ereditarietà anche ai Form Creare form che ereditano UI e funzionalità da altri Si può quindi evitare di rigenerare lo stesso form tutte le volte Eredità Visuale

  10. Come in VB6 Controlli che facilitano l’uso delle dialogs OpenFileDialog SaveFileDialog FontDialog ColorDialog ... Sono delle classi, quindi non è necessario usarli  BrowseFolderDialog Eventi Validating e Validated Permettono di validare il contenuto di un controllo Form.ValidateChildren ErrorProvider Fornisce indicazioni visive quando un controllo non è validato Dialogs & Validation

  11. Non ci sono grandi differenze Ogni controllo ha una serie di eventi MouseEnter MouseLeave MouseHover MouseWheel (non visibile nella Property window) Control.SelectNextControl() Control.GetNextControl() KeyDown,KeyUp... e.Handled=True indica che il tasto è stato gestito e non deve essere propagato agli altri gestori evento Control.ModifierKeys Per conoscere lo stato dei tasti Ctrl,Shift e Alt Mouse & Keyboard

  12. L’operazione è manuale e sincrona E’ iniziata dal metodo DoDragDropSi applica ai controlli che hanno AllowDrop=True Espongono una serie di eventi DragEnter DragLeave DragOver DragDrop In DragEnter decidiamo quale operazione è applicabile Copy,Move,None In DragDrop Recuperiamo il dato GiveFeedback Permette di usare dei cursori custom (source) E’ possibile usare oggetti custom serializzabili Drag & Drop

  13. VB6: Printer agiva esclusivamente sulla stampante VB2005: PrintDocument System.Drawing.Printing Descrive il documento da stampare (titolo...) Fornisce una serie di eventi per il processo di stampa Print() -> PrintPage Non descrive il target della stampa Il Target è l’oggetto astratto PrintController StandardPrintController: Agisce sulla stampante (default) PrintPreviewController: Fornisce un anteprima della stampa Eventi BeginPrint PrintPage EndPrint QueryPageSettings Permette di cambiare i dettagli della pagina (margini, colore...) Printing

  14. PageSetupDialog Impostazioni della pagina di stampa PrintDialog Selezione della stampante di destinazione E’ esposta dalla proprietà PrinterSettings di PrintDocument PrinterSetting Contiene tutte le info della stampante (IsDefault, Name...) InstalledPrinters Elenco delle stampanti installate Tricks PrintDoc.PrinterSettings.PrinterName=“...” Creare un custom PrintController per pagine dinamiche Printing

  15. Custom Eredita da Control La renderizzazione è a carico dello sviluppatore Scrollabe Eredita da ScrollableControl Inherited Eredita da un altro controllo Permette di personalizzare un certo controllo User Control Eredita da UserControl “MiniForm” con micro-funzionalità Component Eredita da Component Non hanno interfaccia grafica, facilitano l’uso a design time OwnerDraw Controlli standard che delegano la gestione della UI al programmatore Controlli

  16. Controlli -Ereditarietà Object Component Control ScrollableControl UserControl

  17. Permettono di personalizzare l’integrazione del controllo nel designer. Description(“Routa il testo di 180°”) Category(“My Category”) Browsable(true) ReadOnly(true) DisplayName Indica il nome che apparirà nella Property Grid Controlli - Attributi

  18. DesignOnly Determina se la proprietà è usata solo a design time EditorBrowsable Visibilità a livello intellisense ToolboxBitmap Icona associata al controllo DefaultEvent Evento di default DefaultProperty Proprietà di default DefaultValue Valore di default (usato per la serializzazione) Localizable Permette la localizzazione della proprietà ParenthesizePropertyName Visualizza la proprietà tra parentesi SettingsBindable Indica che la proprietà supporta binding MergableProperty Indica se la proprietà può essere “comunizzata” con altre DesignerSerializationVisibility Controlla la persistenza delle proprietà Controlli - Attributi

  19. Listbox, ListView, ComboBox... Proprietà DrawMode Standard, OwnerDrawFixed,OwnerDrawVariable Evento MeasureItem Chiede quali sono le dimensioni dell’area da passare all’evento DrawItem Evento DrawItem Viene passato un oggetto Graphics rappresentante l’area su cui ‘agire’ e l’indice dell’item da disegnare Controlli - OwnerDraw

  20. Informazioni inserite nell’assembly a compile time che possono essere lette a runtime Vengono inserite nel manifest dell’assembly Identificate con Namespace.Nome.Estensione Assembly.GetManifestResourceNames Assembly.GetManifestResourceStream Le risorse non sono by default tipizzate VS usa un file .resX il quale wrappa e tipizza le risorse L’editing avviene attraverso l’editor di Visual Studio Le risorse possono essere embedded o linkate ResourceManager Permette di leggere il contenuto dei files .resX VS 2005 facilita l’utilizzo I files .resX hanno un apposito editor Genera una classe che espone le risorse in modo tipizzato I files .resX sono gestiti dai vari controlli presenti in VS Risorse

  21. Globalizzazione L’assicurare che un applicazione funzioni in qualsiasi parte del mondo senza dovere ricompilare l’applicazione Localizzazione La capacità di un applicazione di gestire la ‘cultura’ locale Localizzazione

  22. VB6 Aggiunta di un file .res al progetto Utilizzo del resource editor Localizzare testo usando LoadResString LoadResPicture LoadResData No local/region aware Difficile integrare culturediverse Difficile estendere lalocalizzazione No locale adaptive UI No RTL support Localizzazione in VB6

  23. .NET Si appoggia su files xml (.resx) ResGen.exe .resx -> .resources Le culture vengono gestite attraverso la classe CultureInfo ResourceManager Cerca le assembly satellite utilizzando la cultura della UI Probing <language-culture> <language> Neutral / Default culture Tools WinRes.exe Lutz Roeder’s Resourcer (http://www.aisto.com/roeder/dotnet/) Al.exe Localizzazione in .NET

  24. SubClassing Applicativo S.OWindows Messaggi Message pump Messaggi WndProc WndProc Windows(Forms/controlli) Windows(Forms/controlli)

  25. VB6: SetWindowLong (GWL_WNDPROC ) SubClassing in VB6 Private Sub Form_Load() _OldWindowProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, _ AddressOf NewWindowProc) End Sub Public Function NewWindowProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, lParam As Any) As Long ... NewWindowProc = CallWindowProc( _ OldWindowProc, hwnd, msg, wParam, lParam) End Function Private Sub Form_Unload(Cancel As Integer) SetWindowLong _ hwnd, GWL_WNDPROC, _ OldWindowProc End Sub

  26. Svantaggi IDE Molto fragile Debug difficile Facile sbagliare Alternative MsgHook MsgBlaster SubClassing in VB6

  27. La classe Control espone WndProc (protected) Alla WndProc viene passata la struttura Message E’ possibile intercettare i messaggi, modificarli e/o passarli alla classe base IMessageFilter Permette di intercettare messaggi prima che vengano inviati a Form/Controllo Application.AddMessageFilter Application.RemoveMessageFilter SubClassing in .NET

  28. Esistono 3 tipi di timer System.Windows.Forms.Timer Il “classico” timer basato su WM_TIMER Tick ogni 55 ms System.Timers.Timer Basato su thread (evento) Usa SyncronizyingObject per sincronizzare l’evento Se il marshaling è occupato, accoda gli eventi System.Threading.Timer Basato su thread (callback) Più preciso BackgroundWorkerThread Semplifica l’asyncronous programming Asyncronous Programming

  29. La porta ‘di servizio’ per accedere direttamente a codice unmanaged Win32 API Dll statiche (non COM) PInvoke Codice .NET C#,VB.NET... PInvoke .NET Framework Win32 APIs

  30. [DllImport] System.Runtime.InteropServices .NET “way“ C# e VB.NET www.pinvoke.net Enunciato Declare VB.NET Only Può stare ovunque (form,classe...) Qualche limitazione rispetto a <DllImport> APIViewer 2003 utility http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html PInvoke – Attributo DllImport

  31. Named arguments Charset (Ansi,Auto e Unicode) Declare [Auto,Ansi e Unicode] Sub... ExactSpelling [true,false] EntryPoint Alias “...” CallingConvention[WinApi,CDecl...] PInvoke – Attributo DllImport <DllImport("user32.dll”)> _Shared Function GetWindowText _ (ByVal hWnd as IntPtr, ByVal lpString As StringBuilder, ByVal cch as Int32) as Int32End Sub

  32. SetLastError[true,false] True solo se usate Declare ... Memorizza il codice di errore Win32 generato dalla funzione GetLastError() e FormatMessage() APIs Permette di ottenere ulteriori informazioni sulla causa di errore di una chiamata ad una funzione Win32 Riduce le performaces Int32 err=Marshal.GetLastWin32Error() System.ComponentModel.Win32Exception() PInvoke – Attributo DllImport

  33. PInvoke – Marshal di parametri numerici BOOL Beep( DWORD dwFreq, DWORD dwDuration ); <DllImport("kernel32.dll")> _ Shared Function Beep(ByVal dwFreq As UInt32, _ByVal dwDuration As UInt32) As Boolean End Function

  34. I parametri hanno una direzione [in] ByVal (VB.NET) [out] ByRef (VB.NET) [in,out] ByRef (VB.NET) PInvoke – Direzione dei parametri BOOLWriteFile(HANDLEhFile, LPCVOIDlpBuffer, DWORDnNumberOfBytesToWrite, LPDWORDlpNumberOfBytesWritten, LPOVERLAPPEDlpOverlapped ); <DllImport("kernel32.dll", SetlastError:=True)> _Private Shared Function WriteFile(ByVal hFile As IntPtr,_ByVal Buffer As Byte(), ByVal nNumberOfBytesToWrite As Integer, _ ByRef lpNumberOfBytesWritten As Integer, _ByRef lpOverlapped As OVERLAPPED) As Integer End Function

  35. PInvoke – Marshaling di stringhe • Direzione • [in] ByVal ... As String • [out] ByVal ... As System.Text.StringBuilder • Le Win32 API non ritornano mai stringhe • In .NET le stringhe sono immutabili BOOL GetUserName( LPTSTR lpBuffer, LPDWORD nSize ); <DllImport("Advapi32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _ Public Shared Function GetUserName(ByVal buffer As StringBuilder, ByRef bufferLen As Integer) As Boolean End Function

  36. PInvoke – Marshaling di strutture • ByVal [in] o ByRef [in/out] • Il layout della struttura deve essere rispettato • Il compilatore può inserire dei byte di padding Structure Test Dim P1 as Byte // 1 byte Dim P2 as Int32 // 4 bytes Dim P3 as Int32 //4 bytes End StructureMarshal.SizeOf( Test.GetType) // ? [StructLayout(LayoutKind.Sequential,Pack=1)] Structure Test Dim P1 as Byte // 1 byte Dim P2 as Int32 // 4 bytes Dim P3 as Int32 //4 bytes End StructureMarshal.SizeOf( Test.GetType) // 9 [MarshalAs(UnmanagedType.LPStr,SizeConst=128)] param As String

  37. PInvoke - Callbacks BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam ); BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam ); Delegate Function EnumCallback _(ByVal hWnd As IntPtr,ByVal param As Int32) As Boolean #1 #2 <DllImport("user32.dll")>Shared Function EnumWindows _(ByVal callBack As EnumCallback,ByVal param As Int32) As Boolean Private Function MyCallback(ByVal hWnd As IntPtr, ByVal param As Int32) As Boolean … Return True End Function #3 Uso! EnumWindows(New EnumCallback(AddressOf MyCallback), 1234)

  38. .NET può usare oggetti COM TlbImp (nell‘ SDK) Strong named, modificare il namespace esportato Impostando un reference ad un assembly COM Marshal.ReleaseCOMObject RegFreeCOM Usare Assembly COM senza registrarle IUnknown ComServer IFoo Client Interoperabilità COM Common Language Runtime Object Runtime CallableWrapper ReferenceCounted

  39. .NET può creare oggetti COM Il framework è sempre necessario Add – New Item – COM Class Usando <ComVisible> è possibile decidere cosa esporre al mondo COM Register For COM Interop RegAsm RegSvr32 per assembly .NET Creaun file .reg con le info di registrazion TlbExp Esporta la type library (early binding) da un assembly .NET Com enabled IUnknown IDispatch COM CallableWrapper IFoo Client Interoperabilità COM Common Language Runtime COM Client Server

  40. Motore di accesso ai dati unificato per le applicazioni .NET Windows, Web, Mobile apps Nato per superare i limiti di ADO (COM,XML Support, Evolution approach) Wrapper attorno al motore OLE DB ADO.NET No usa OleDB/COM ma providers nativi .NET Non supporta cursori lato server Consumano risorse lato server e non applicabili in alcuni tipi di applicazioni Supporta firehose cursors (read only, fwd only) Supporta resultsets disconnessi Ampio supporto all’ XML Doppia modalità di funzionamento Connesso Connesso alla fonte usando firehose cursor Disconnesso Leggo i dati in un dataset e sconnetto (optimistic batch update mode) ADO.NET

  41. Connection E’ l’oggetto che permette la connessione al DB ConnectionString (compatibile con VB6) Open/Close Command Indica il comando (Select,Update...) da inviare DataReader Permette la lettura dei dati eventualmente ritornati dal comando DataAdapter Esegue il command e ritorna un DataSet / DataTable Effettua la riconciliazione dei dati nel DB ADO.NET – Oggetti principali

  42. DataTable Nuova versione del ResultSet Disconnessa e Client Side DataSet Contiene più DataTable Posso definire delle relazioni tra DataTable Database, in memory e disconnesso Totalmente indipendente dalla fonte dati Text files, Xml files, DataBase... ADO.NET – Oggetti principali

  43. Blocchi di connessione all’ engine DB OLEDb Provider Permette di accedere a DB per i quali esiste un provider OLE DB MDac (ultima) + Jet Engine SQLProvider SQLServer 7.0 e superiore No MDac Provider nativo e ottimizzato per SQLServer Offre funzionalità aggiuntive disponibili in SQLServer ADO.NET – Providers

  44. Tutte le classi sono in System.Data System.Data.OleDB Contiene tutte le classi per il provider OLEDB System.Data.SQLClient Contiene le classi native per SQLServer System.Data.Common Contiene le classi independenti dal provider (DataSet) ProviderFactory E’ il provider che si occupa di creare l’oggetto corretto ADO.NET – Namespaces

  45. E’ l’oggetto che effettua la connessione al DB ConnectionString www. Connectionstring.com Provider=Microsoft.Jet.OLEDB4.0 (no per SQLConnection) Initial Catalog / DataSource= /AttachDBFilename= Open, Close, State In caso di problemi viene generata una OLEDB/SQLException Ha una collezione Errors che fornisce dettagli sul problema Connection Pooling Quando ci si connette ad un DB il provider crea un pool di connessioni simili affichè ulteriori richieste di connessioni vengano gestite velocemente Basato sulla ConnectionString,può essere disabilitato,ConnectionTimeout BeginTrans OggettoTransaction su cui eseguire Commit o RollBack IsolationLevel determina la modalità di lock durante la transazione ADO.NET – Connection

  46. E’ l’oggetto che specifica quale azione compiere verso il DB CommandText La query SQL da eseguire CommandType Text, StoreProcedure Connection Connessione associata Parameters Collezione di parametri associati alla query (da preferire) ExecuteReader Ritorna un DataReader per l’accesso ai dati della query ExecuteScalar Esegue query e ritorna il valore della prima riga/colonna Select Count(*) FROM ... ExecuteNonQuery Esegue la query e ritorna il numero di righe modificate UPDATE SET... ADO.NET – Command

  47. Cursore ForwardOnly e ReadOnly Permette di leggere i dati ritornati dalla query Command Comando associato Connection Connessione associata HasRows Indica la presenza di righe da leggere nel DataReader Read Legge il record successivo, ritorna false al termine GetSchemaTable Ritorna una DataTable con lo schema del DataReader Close Chiude il DataReader e rilascia le risorse associate ADO.NET – DataReader While reader.Read() Data=Reader(columnIndex) ... Data=reader(“FirstName”) End While

  48. Recordset statico disconnesso In memory table Formata da DataColumns e DataRows Può contenere dati provenienti da più fonti (Query, file XML, codice...) Database independent PrimaryKey (colonne che compongono la primarykey per quella tabella) DefaultView permette il filtering e sorting dei dati contenuti Rows Collezione delle “righe” contenute nella tabella NewRow: Crea una nuova riga Delete: Marca la riga come deleted Ogni row mantiene il proprio stato e valore E’ spesso contenuta in un DataSet AcceptChanges / RejectChanges Resetta lo stato delle righe nella DataTable ADO.NET – DataTable

  49. In memory disconnected database Permette una visione gerarchica dei dati Contiene 1 o più tabelle – Tables property DataRelations Descrive la relazione tra tabelle Permettono di navigare tra le relazioni ChildRelations ParentRelations Constraints Regole di validazione dei dati presenti nel DataSet Column Level: DataColumn (Unique, MaxLength...) Table Level: ForeignKeyConstraint Autogenerati in base alle relazioni tra tabelle DeleteRule, UpdateRule XML Support Lo schema e i dati possono essere memorizzati in un file XML ADO.NET – DataSet

  50. DataSet Oggetto Constraints Columns Tables Relations Rows Constraint Column Table Relation Row Collezione ADO.NET – DataSet

More Related