Upload
linda-jacobs
View
46
Download
4
Embed Size (px)
DESCRIPTION
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 - PowerPoint PPT Presentation
Citation preview
Learn & Learn & GetGetDay #2: Sviluppo applicazioniDay #2: Sviluppo applicazioni
Tipi di applicazioni (Windows)Tipi di applicazioni (Windows)
Windows FormsWindows Forms...le conosciamo tutti......le conosciamo tutti...
.NET Class Library.NET Class LibraryLibreria di classi (business layer)Libreria di classi (business layer)
Console ApplicationConsole ApplicationApplicazioni console GUI DOS LikeApplicazioni console GUI DOS Like
Windows control libraryWindows control libraryLibreria di controlli windowsLibreria di controlli windows
Window ServiceWindow ServiceApplicazione windows che girano al termine del Applicazione windows che girano al termine del boot di Windowsboot di Windows
Altri templateAltri templateEstensioni di Visual Studio installate Estensioni di Visual Studio installate successivamentesuccessivamente
StartupStartupFormXFormXSub MainSub Main
Può stare in una classePuò stare in una classe
Application FrameworkApplication FrameworkSi decide dalle proprietà del progetto (MyProject)Si decide dalle proprietà del progetto (MyProject)
Impostazioni tipiche (Versione, Icona, Mode...)Impostazioni tipiche (Versione, Icona, Mode...)
Public Sub Main()Public Sub Main() End SubEnd Sub
Public Sub Main(args() as String)Public Sub Main(args() as String) End SubEnd Sub
Environment.GetCommandLineArgs()Environment.GetCommandLineArgs()Environment.CommandLine()Environment.CommandLine()
Mostrare il form da Sub MainMostrare il form da Sub MainForm è una classe in System.Windows.FormForm è una classe in System.Windows.Form
Come tale va trattataCome tale va trattata
I forms sono classi che ereditano da FormI forms sono classi che ereditano da FormSono realizzati come classi parziali (.designer.vb)Sono realizzati come classi parziali (.designer.vb)Non modificate il codice nel file .designer.vbNon modificate il codice nel file .designer.vb
Il dilemma Form1.Show()Il dilemma Form1.Show()L’applicazione non parte...L’applicazione non parte...Application.RunApplication.RunL’applicazione ‘vive’ finchè ‘vive’ il form principaleL’applicazione ‘vive’ finchè ‘vive’ il form principale
Usate Application FrameworkUsate Application Framework
Analizzate la classe ApplicationAnalizzate la classe ApplicationApplication.ThreadExceptionApplication.ThreadExceptionApplication.IdleApplication.IdleApplication.DoEventsApplication.DoEventsApplication.RestartApplication.Restart
Layout dei controlliLayout dei controlliControllo dell’allineamentoControllo dell’allineamento
SnapLinesSnapLinesMargins (Bordo esterno)Margins (Bordo esterno)Padding (Bordo interno)Padding (Bordo interno)DockDockAnchorAnchorSplitPanelSplitPanelLayoutControlsLayoutControls
FlowLayoutFlowLayoutTableLayoutTableLayout
Form LayoutForm LayoutMaximumSizeMaximumSizeMinimumSizeMinimumSizeStartPositionStartPositionFormBorderStyleFormBorderStyle
FormFormAutoScrollAutoScrollOpacityOpacity
I form possono essere trasparentiI form possono essere trasparenti
ShapedShapedI forms possono avere forma irregolareI forms possono avere forma irregolare
StylesStylesApplication.EnableVisualStylesApplication.EnableVisualStyles
TopMostTopMostDialogResultDialogResultCenterToParent, CenterToScreenCenterToParent, CenterToScreen
Centrano il form rispetto al parent o allo schermoCentrano il form rispetto al parent o allo schermo
AcceptButton e CancelButtonAcceptButton e CancelButtonInterazione e aggiunta controlliInterazione e aggiunta controlliSupportano controlli COM (ocx)Supportano controlli COM (ocx)
Menu,ToolBars, StatusBars e Menu,ToolBars, StatusBars e ToolTipsToolTipsPermettono di creare UI stile Office 2003Permettono di creare UI stile Office 2003
Il look è basato su una classe ToolStripRendererIl look è basato su una classe ToolStripRenderer
ToolStripItemToolStripItem
ProfessionalProfessionalRendererRenderer
DrawDraw CustomCustomRendererRenderer
ToolStripContainerToolStripContainer
Permette di gestire il docking di itemsPermette di gestire il docking di items
Il renderer gestisce Load e Save dello stato degli itemsIl renderer gestisce Load e Save dello stato degli items
ToolStripManagerToolStripManager
Persiste/recupera il layout (Load/SaveSettings)Persiste/recupera il layout (Load/SaveSettings)
Stabilisce il renderer da usareStabilisce il renderer da usare
ContextMenuStripContextMenuStrip
Permette di creare menu contestualiPermette di creare menu contestuali
Tooltip componentTooltip component
Help componentHelp component
Applicazioni MDIApplicazioni MDI
Form.IsMDIContainer=TrueForm.IsMDIContainer=True
Form.MdiParent=MeForm.MdiParent=Me
ToolStripMenu.MdiWindowListItemToolStripMenu.MdiWindowListItemIndica quale item gestirà le finestre visualizzateIndica quale item gestirà le finestre visualizzate
Form.ActiveMDIChildForm.ActiveMDIChildIndica il chil form attivoIndica il chil form attivo
Evento Form.MDIChildActivateEvento Form.MDIChildActivateGenerato quando il child form si attivaGenerato quando il child form si attiva
LayoutMDILayoutMDIModifica il layout delle finestre childModifica il layout delle finestre child
Eredità VisualeEredità Visuale
E’ possibile applicare l’ereditarietà anche ai FormE’ possibile applicare l’ereditarietà anche ai FormCreare form che ereditano UI e funzionalità da altriCreare form che ereditano UI e funzionalità da altri
Si può quindi evitare di rigenerare lo stesso form tutte le Si può quindi evitare di rigenerare lo stesso form tutte le voltevolte
Dialogs & ValidationDialogs & ValidationCome in VB6Come in VB6
Controlli che facilitano l’uso delle dialogsControlli che facilitano l’uso delle dialogsOpenFileDialogOpenFileDialogSaveFileDialogSaveFileDialogFontDialogFontDialogColorDialogColorDialog......
Sono delle classi, quindi non è necessario usarli Sono delle classi, quindi non è necessario usarli
BrowseFolderDialogBrowseFolderDialogEventi Validating e ValidatedEventi Validating e Validated
Permettono di validare il contenuto di un controlloPermettono di validare il contenuto di un controlloForm.ValidateChildrenForm.ValidateChildren
ErrorProviderErrorProviderFornisce indicazioni visive quando un controllo non è Fornisce indicazioni visive quando un controllo non è validatovalidato
Mouse & KeyboardMouse & KeyboardNon ci sono grandi differenzeNon ci sono grandi differenze
Ogni controllo ha una serie di eventiOgni controllo ha una serie di eventiMouseEnterMouseEnterMouseLeaveMouseLeaveMouseHoverMouseHoverMouseWheel (non visibile nella Property window)MouseWheel (non visibile nella Property window)
Control.SelectNextControl()Control.SelectNextControl()Control.GetNextControl()Control.GetNextControl()KeyDown,KeyUp...KeyDown,KeyUp...
e.Handled=True indica che il tasto è stato gestito e non e.Handled=True indica che il tasto è stato gestito e non deve essere propagato agli altri gestori eventodeve essere propagato agli altri gestori evento
Control.ModifierKeysControl.ModifierKeysPer conoscere lo stato dei tasti Ctrl,Shift e AltPer conoscere lo stato dei tasti Ctrl,Shift e Alt
Drag & DropDrag & DropL’operazione è manuale e sincronaL’operazione è manuale e sincronaE’ iniziata dal metodo DoDragDropE’ iniziata dal metodo DoDragDropSi applica ai controlli che hanno AllowDrop=TrueSi applica ai controlli che hanno AllowDrop=True
Espongono una serie di eventiEspongono una serie di eventiDragEnterDragEnterDragLeaveDragLeaveDragOverDragOverDragDropDragDrop
In DragEnter decidiamo quale operazione è applicabileIn DragEnter decidiamo quale operazione è applicabileCopy,Move,NoneCopy,Move,None
In DragDropIn DragDropRecuperiamo il datoRecuperiamo il dato
GiveFeedbackGiveFeedbackPermette di usare dei cursori custom (source)Permette di usare dei cursori custom (source)
E’ possibile usare oggetti custom serializzabiliE’ possibile usare oggetti custom serializzabili
PrintingPrintingVB6: Printer agiva esclusivamente sulla stampanteVB6: Printer agiva esclusivamente sulla stampanteVB2005: PrintDocumentVB2005: PrintDocument
System.Drawing.PrintingSystem.Drawing.PrintingDescrive il documento da stampare (titolo...)Descrive il documento da stampare (titolo...)Fornisce una serie di eventi per il processo di stampaFornisce una serie di eventi per il processo di stampa
Print() -> PrintPagePrint() -> PrintPage
Non descrive il target della stampaNon descrive il target della stampa
Il Target è l’oggetto astratto PrintController Il Target è l’oggetto astratto PrintController StandardPrintController: Agisce sulla stampante (default)StandardPrintController: Agisce sulla stampante (default)PrintPreviewController: Fornisce un anteprima della stampaPrintPreviewController: Fornisce un anteprima della stampa
EventiEventiBeginPrintBeginPrintPrintPagePrintPageEndPrintEndPrintQueryPageSettingsQueryPageSettings
Permette di cambiare i dettagli della pagina (margini, colore...)Permette di cambiare i dettagli della pagina (margini, colore...)
PrintingPrintingPageSetupDialogPageSetupDialog
Impostazioni della pagina di stampaImpostazioni della pagina di stampa
PrintDialogPrintDialogSelezione della stampante di destinazioneSelezione della stampante di destinazioneE’ esposta dalla proprietà PrinterSettings di PrintDocumentE’ esposta dalla proprietà PrinterSettings di PrintDocument
PrinterSettingPrinterSettingContiene tutte le info della stampante (IsDefault, Name...)Contiene tutte le info della stampante (IsDefault, Name...)InstalledPrintersInstalledPrinters
Elenco delle stampanti installateElenco delle stampanti installate
TricksTricksPrintDoc.PrinterSettings.PrinterName=“...”PrintDoc.PrinterSettings.PrinterName=“...”Creare un custom PrintController per pagine dinamicheCreare un custom PrintController per pagine dinamiche
ControlliControlli
CustomCustomEredita da ControlEredita da ControlLa renderizzazione è a carico dello sviluppatoreLa renderizzazione è a carico dello sviluppatore
ScrollabeScrollabeEredita da ScrollableControlEredita da ScrollableControl
InheritedInheritedEredita da un altro controlloEredita da un altro controlloPermette di personalizzare un certo controlloPermette di personalizzare un certo controllo
User ControlUser ControlEredita da UserControlEredita da UserControl““MiniForm” con micro-funzionalitàMiniForm” con micro-funzionalità
ComponentComponentEredita da ComponentEredita da ComponentNon hanno interfaccia grafica, facilitano l’uso a design timeNon hanno interfaccia grafica, facilitano l’uso a design time
OwnerDrawOwnerDrawControlli standard che delegano la gestione della UI al Controlli standard che delegano la gestione della UI al programmatoreprogrammatore
Controlli -EreditarietàControlli -Ereditarietà
ObjeObjectct
ComponenComponentt
ControControll
ScrollableContrScrollableControlol
UserControUserControll
Controlli - AttributiControlli - Attributi
Permettono di personalizzare l’integrazione Permettono di personalizzare l’integrazione del controllo nel designer.del controllo nel designer.
Description(“Routa il testo di 180°”)Description(“Routa il testo di 180°”)
Category(“My Category”)Category(“My Category”)
Browsable(true)Browsable(true)
ReadOnly(true)ReadOnly(true)
DisplayNameDisplayNameIndica il nome che apparirà nella Property GridIndica il nome che apparirà nella Property Grid
Controlli - AttributiControlli - AttributiDesignOnlyDesignOnly
Determina se la proprietà è usata solo a design timeDetermina se la proprietà è usata solo a design timeEditorBrowsableEditorBrowsable
Visibilità a livello intellisenseVisibilità a livello intellisenseToolboxBitmapToolboxBitmap
Icona associata al controlloIcona associata al controlloDefaultEventDefaultEvent
Evento di defaultEvento di defaultDefaultPropertyDefaultProperty
Proprietà di defaultProprietà di defaultDefaultValueDefaultValue
Valore di default (usato per la serializzazione)Valore di default (usato per la serializzazione)LocalizableLocalizable
Permette la localizzazione della proprietàPermette la localizzazione della proprietàParenthesizePropertyNameParenthesizePropertyName
Visualizza la proprietà tra parentesiVisualizza la proprietà tra parentesiSettingsBindableSettingsBindable
Indica che la proprietà supporta bindingIndica che la proprietà supporta bindingMergablePropertyMergableProperty
Indica se la proprietà può essere “comunizzata” con altreIndica se la proprietà può essere “comunizzata” con altreDesignerSerializationVisibilityDesignerSerializationVisibility
Controlla la persistenza delle proprietàControlla la persistenza delle proprietà
Controlli - OwnerDrawControlli - OwnerDraw
Listbox, ListView, ComboBox...Listbox, ListView, ComboBox...
Proprietà DrawModeProprietà DrawModeStandard, Standard, OwnerDrawFixed,OwnerDrawVariableOwnerDrawFixed,OwnerDrawVariable
Evento MeasureItemEvento MeasureItemChiede quali sono le dimensioni dell’area da Chiede quali sono le dimensioni dell’area da passare all’evento DrawItempassare all’evento DrawItem
Evento Evento DrawItemDrawItemViene passato un oggetto Graphics Viene passato un oggetto Graphics rappresentante l’area su cui ‘agire’ e l’indice rappresentante l’area su cui ‘agire’ e l’indice dell’item da disegnaredell’item da disegnare
RisorseRisorseInformazioni inserite nell’assembly a compile time che possono essere Informazioni inserite nell’assembly a compile time che possono essere lette a runtimelette a runtime
Vengono inserite nel manifest dell’assemblyVengono inserite nel manifest dell’assemblyIdentificate con Namespace.Nome.EstensioneIdentificate con Namespace.Nome.EstensioneAssembly.GetManifestResourceNamesAssembly.GetManifestResourceNamesAssembly.GetManifestResourceStreamAssembly.GetManifestResourceStream
Le risorse non sono by default tipizzateLe risorse non sono by default tipizzateVS usa un file .resX il quale wrappa e tipizza le risorseVS usa un file .resX il quale wrappa e tipizza le risorseL’editing avviene attraverso l’editor di Visual StudioL’editing avviene attraverso l’editor di Visual StudioLe risorse possono essere embedded o linkateLe risorse possono essere embedded o linkate
ResourceManagerResourceManagerPermette di leggere il contenuto dei files .resXPermette di leggere il contenuto dei files .resX
VS 2005 facilita l’utilizzoVS 2005 facilita l’utilizzoI files .resX hanno un apposito editorI files .resX hanno un apposito editorGenera una classe che espone le risorse in modo tipizzatoGenera una classe che espone le risorse in modo tipizzatoI files .resX sono gestiti dai vari controlli presenti in VSI files .resX sono gestiti dai vari controlli presenti in VS
GlobalizzazioneGlobalizzazioneL’assicurare che un applicazione funzioni in qualsiasi parte del mondo senza dovere L’assicurare che un applicazione funzioni in qualsiasi parte del mondo senza dovere ricompilare l’applicazionericompilare l’applicazione
LocalizzazioneLocalizzazioneLa capacità di un applicazione di gestire la ‘cultura’ localeLa capacità di un applicazione di gestire la ‘cultura’ locale
LocalizzazioneLocalizzazione
VB6VB6Aggiunta di un file .res al progettoAggiunta di un file .res al progetto
Utilizzo del resource editorUtilizzo del resource editor
Localizzare testo usandoLocalizzare testo usandoLoadResStringLoadResString
LoadResPictureLoadResPicture
LoadResDataLoadResData
No local/region awareNo local/region aware
Difficile integrare cultureDifficile integrare culturediversediverse
Difficile estendere laDifficile estendere lalocalizzazionelocalizzazione
No locale adaptive UINo locale adaptive UI
No RTL supportNo RTL support
Localizzazione in VB6Localizzazione in VB6
.NET.NETSi appoggia su files xml (.resx)Si appoggia su files xml (.resx)
ResGen.exe .resx -> .resources ResGen.exe .resx -> .resources
Le culture vengono gestite attraverso la classe Le culture vengono gestite attraverso la classe CultureInfoCultureInfo
ResourceManagerResourceManagerCerca le assembly satellite utilizzando la cultura della UICerca le assembly satellite utilizzando la cultura della UI
ProbingProbing<language-culture><language-culture>
<language><language>
Neutral / Default cultureNeutral / Default culture
ToolsToolsWinRes.exe WinRes.exe
Lutz Roeder’s Resourcer (http://www.aisto.com/roeder/dotnet/)Lutz Roeder’s Resourcer (http://www.aisto.com/roeder/dotnet/)
Al.exeAl.exe
Localizzazione in .NETLocalizzazione in .NET
SubClassingSubClassing
S.OWindows
MessaggiMessaggi
Applicativo
Windows(Forms/
controlli)
MessaggiMessaggi
WndProcWndProc
Windows(Forms/
controlli)
WndProcWndProc
Message Message pumppump
VB6: VB6: SetWindowLongSetWindowLong ( (GWL_WNDPROC )GWL_WNDPROC )
SubClassing in VB6SubClassing in VB6
Private Sub Form_Load()Private Sub Form_Load() _OldWindowProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, _ _OldWindowProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, _ AddressOf AddressOf NewWindowProcNewWindowProc))End SubEnd Sub
Public Function Public Function NewWindowProcNewWindowProc(ByVal hwnd As Long, ByVal (ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, lParam As Any) As Longmsg As Long, ByVal wParam As Long, lParam As Any) As Long......NewWindowProc = NewWindowProc = CallWindowProcCallWindowProc( _ OldWindowProc, hwnd, ( _ OldWindowProc, hwnd, msg, wParam, lParam)msg, wParam, lParam)End FunctionEnd Function
Private Sub Form_Unload(Cancel As Integer)Private Sub Form_Unload(Cancel As Integer) SetWindowLong _ hwnd, GWL_WNDPROC, _ OldWindowProcSetWindowLong _ hwnd, GWL_WNDPROC, _ OldWindowProcEnd SubEnd Sub
Svantaggi Svantaggi IDE Molto fragileIDE Molto fragile
Debug difficileDebug difficile
Facile sbagliareFacile sbagliare
AlternativeAlternativeMsgHookMsgHook
MsgBlasterMsgBlaster
SubClassing in VB6SubClassing in VB6
La classe Control espone La classe Control espone WndProcWndProc (protected) (protected)
Alla WndProc viene passata la struttura MessageAlla WndProc viene passata la struttura Message
E’ possibile intercettare i messaggi, modificarli E’ possibile intercettare i messaggi, modificarli e/o passarli alla classe basee/o passarli alla classe base
IMessageFilterIMessageFilter
Permette di intercettare messaggi prima che Permette di intercettare messaggi prima che vengano inviati a Form/Controllovengano inviati a Form/Controllo
Application.AddMessageFilterApplication.AddMessageFilter
Application.RemoveMessageFilterApplication.RemoveMessageFilter
SubClassing in .NETSubClassing in .NET
Asyncronous ProgrammingAsyncronous ProgrammingEsistono 3 tipi di timerEsistono 3 tipi di timer
System.Windows.Forms.TimerSystem.Windows.Forms.TimerIl “classico” timer basato su WM_TIMERIl “classico” timer basato su WM_TIMERTick ogni 55 msTick ogni 55 ms
System.Timers.TimerSystem.Timers.TimerBasato su thread (evento)Basato su thread (evento)Usa SyncronizyingObject per sincronizzare l’eventoUsa SyncronizyingObject per sincronizzare l’eventoSe il marshaling è occupato, accoda gli eventiSe il marshaling è occupato, accoda gli eventi
System.Threading.TimerSystem.Threading.TimerBasato su thread (callback)Basato su thread (callback)Più precisoPiù preciso
BackgroundWorkerThreadBackgroundWorkerThreadSemplifica l’asyncronous programmingSemplifica l’asyncronous programming
La porta ‘di servizio’ per accedere La porta ‘di servizio’ per accedere direttamente a codice unmanageddirettamente a codice unmanaged
Win32 APIWin32 API
Dll statiche (non COM)Dll statiche (non COM)
Codice .NETCodice .NETC#,VB.NET...C#,VB.NET...
.NET Framework.NET Framework
Win32 APIsWin32 APIs
PInvoke
PInvokePInvoke
PInvoke – Attributo DllImportPInvoke – Attributo DllImport
[[DllImportDllImport]]System.Runtime.InteropServicesSystem.Runtime.InteropServices.NET “way“.NET “way“C# e VB.NETC# e VB.NETwww.pinvoke.netwww.pinvoke.net
Enunciato Enunciato DeclareDeclareVB.NET OnlyVB.NET OnlyPuò stare ovunque (form,classe...)Può stare ovunque (form,classe...)Qualche limitazione rispetto a <DllImport>Qualche limitazione rispetto a <DllImport>APIViewer 2003 utilityAPIViewer 2003 utility
http://www.activevb.de/rubriken/apiviewer/index-apiviewereng.html
PInvoke – Attributo DllImportPInvoke – Attributo DllImport
<DllImport("user32.dll”)> _<DllImport("user32.dll”)> _SharedShared Function Function GetWindowTextGetWindowText _ _(ByVal hWnd as IntPtr, ByVal lpString As StringBuilder, ByVal (ByVal hWnd as IntPtr, ByVal lpString As StringBuilder, ByVal cch as Int32) as Int32cch as Int32) as Int32End SubEnd Sub
Named argumentsNamed argumentsCharset (Ansi,Auto e Unicode)Charset (Ansi,Auto e Unicode)
Declare [Auto,Ansi e Unicode] Sub...Declare [Auto,Ansi e Unicode] Sub...ExactSpelling [true,false]ExactSpelling [true,false]
EntryPointEntryPointAlias “...”Alias “...”
CallingConvention[WinApi,CDecl...]CallingConvention[WinApi,CDecl...]
SetLastErrorSetLastError[true,false][true,false]True True solosolo se usate Declare ... se usate Declare ...
Memorizza il codice di errore Win32 generato dalla funzioneMemorizza il codice di errore Win32 generato dalla funzione
GetLastError() e FormatMessage() APIsGetLastError() e FormatMessage() APIs
Permette di ottenere ulteriori informazioni sulla causa di Permette di ottenere ulteriori informazioni sulla causa di errore di una chiamata ad una funzione Win32errore di una chiamata ad una funzione Win32
Riduce le performacesRiduce le performaces
Int32 err=Int32 err=Marshal.GetLastWin32Error()Marshal.GetLastWin32Error()
System.ComponentModel.System.ComponentModel.Win32Exception()Win32Exception()
PInvoke – Attributo DllImportPInvoke – Attributo DllImport
BOOL Beep( DWORD dwFreq, DWORD dwDuration );
PInvoke – Marshal di parametri numericiPInvoke – Marshal di parametri numerici
<DllImport("kernel32.dll")> _Shared Function Beep(ByVal dwFreq As UInt32, _ByVal dwDuration As UInt32) As BooleanEnd Function
I parametri hanno una direzioneI parametri hanno una direzione
[in] ByVal (VB.NET)[in] ByVal (VB.NET)
[out] ByRef (VB.NET) [out] ByRef (VB.NET)
[in,out] ByRef (VB.NET)[in,out] ByRef (VB.NET)
PInvoke – Direzione dei parametriPInvoke – Direzione dei parametri
BOOL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped );
<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 IntegerEnd Function
DirezioneDirezione[in][in] ByVal ... As String ByVal ... As String
[out][out] ByVal ... As ByVal ... As System.Text.StringBuilderSystem.Text.StringBuilder
Le Win32 API non ritornano mai stringheLe Win32 API non ritornano mai stringhe
In .NET le stringhe sono immutabiliIn .NET le stringhe sono immutabili
PInvoke – Marshaling di stringhePInvoke – Marshaling di stringhe
BOOL BOOL GetUserNameGetUserName( LPTSTR ( LPTSTR lpBufferlpBuffer, LPDWORD , LPDWORD nSizenSize ); );
<DllImport("Advapi32.dll", CharSet:=CharSet.Auto, <DllImport("Advapi32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _SetLastError:=True)> _Public Shared Function GetUserName(ByVal buffer As StringBuilder, Public Shared Function GetUserName(ByVal buffer As StringBuilder, ByRef bufferLen As Integer) As BooleanByRef bufferLen As Integer) As BooleanEnd FunctionEnd Function
ByVal [in] o ByRef [in/out]ByVal [in] o ByRef [in/out]
Il layout della struttura deve essere rispettatoIl layout della struttura deve essere rispettato
Il compilatore può inserire dei byte di paddingIl compilatore può inserire dei byte di padding
PInvoke – Marshaling di strutturePInvoke – Marshaling di strutture
Structure TestStructure Test Dim P1 as ByteDim P1 as Byte // 1 byte // 1 byte Dim P2 as Int32Dim P2 as Int32 // 4 bytes // 4 bytes Dim P3 as Int32Dim P3 as Int32 //4 bytes //4 bytesEnd StructureEnd StructureMarshal.SizeOf( Test.GetType)Marshal.SizeOf( Test.GetType) // ?// ?
[MarshalAs(UnmanagedType.LPStr,SizeConst=128)] param As String[MarshalAs(UnmanagedType.LPStr,SizeConst=128)] param As String
[[StructLayoutStructLayout((LayoutKind.SequentialLayoutKind.Sequential,Pack=1)],Pack=1)]Structure TestStructure Test Dim P1 as ByteDim P1 as Byte // 1 byte // 1 byte Dim P2 as Int32Dim P2 as Int32 // 4 bytes // 4 bytes Dim P3 as Int32Dim P3 as Int32 //4 bytes //4 bytesEnd StructureEnd StructureMarshal.SizeOf( Test.GetType)Marshal.SizeOf( Test.GetType) // 9// 9
Delegate Function Delegate Function EnumCallbackEnumCallback _ _(ByVal hWnd As IntPtr,ByVal param As Int32) As Boolean(ByVal hWnd As IntPtr,ByVal param As Int32) As Boolean
PInvoke - CallbacksPInvoke - Callbacks
BOOL EnumWindows(BOOL EnumWindows(WNDENUMPROCWNDENUMPROC lpEnumFunc,LPARAM lParam ); lpEnumFunc,LPARAM lParam );
BOOL CALLBACK EnumWindowsProc(HWND BOOL CALLBACK EnumWindowsProc(HWND hwndhwnd,LPARAM ,LPARAM lParamlParam ); );
#1#1
<DllImport("user32.dll")><DllImport("user32.dll")>Shared Function EnumWindows _Shared Function EnumWindows _(ByVal callBack As (ByVal callBack As EnumCallbackEnumCallback,ByVal param As Int32) As Boolean,ByVal param As Int32) As Boolean
#2#2
Private Function MyCallbackPrivate Function MyCallback(ByVal hWnd As IntPtr, ByVal param As Int32) As Boolean(ByVal hWnd As IntPtr, ByVal param As Int32) As Boolean … … Return TrueReturn TrueEnd FunctionEnd Function
#3#3
EnumWindows(New EnumCallback(AddressOf MyCallback), 1234)EnumWindows(New EnumCallback(AddressOf MyCallback), 1234)Uso!Uso!
Interoperabilità COMInteroperabilità COM..NET può usare oggetti COMNET può usare oggetti COM
TlbImp (nell‘ SDK)TlbImp (nell‘ SDK)Strong named, modificare il namespace esportatoStrong named, modificare il namespace esportato
Impostando un reference ad un assembly COMImpostando un reference ad un assembly COMMarshal.ReleaseCOMObjectMarshal.ReleaseCOMObjectRegFreeCOMRegFreeCOM
Usare Assembly COM senza registrarleUsare Assembly COM senza registrarle
Runtime CallableRuntime CallableWrapperWrapper
Common Language Common Language RuntimeRuntime
IFooIFoo
IUnknownIUnknown
ComServerComServer
ClientClient
ReferenceCounted
ObjectObject
Interoperabilità COMInteroperabilità COM..NET può creare oggetti COMNET può creare oggetti COM
Il framework è sempre necessarioIl framework è sempre necessarioAdd – New Item – COM ClassAdd – New Item – COM ClassUsando <ComVisible> è possibile decidere cosa esporre al mondo COMUsando <ComVisible> è possibile decidere cosa esporre al mondo COMRegister For COM InteropRegister For COM Interop
RegAsmRegAsmRegSvr32 per assembly .NETRegSvr32 per assembly .NETCreaun file .reg con le info di registrazionCreaun file .reg con le info di registrazion
TlbExpTlbExpEsporta la type library (early binding) da un assembly .NET Com enabledEsporta la type library (early binding) da un assembly .NET Com enabled
IFooIFoo
IDispatchIDispatch
IUnknownIUnknown
COM COM CallableCallableWrapperWrapper
Common Language Common Language RuntimeRuntime
ClientClient
COM ClientCOM Client
ServerServer
ADO.NETADO.NETMotore di accesso ai dati unificato per le Motore di accesso ai dati unificato per le applicazioni .NETapplicazioni .NET
Windows, Web, Mobile appsWindows, Web, Mobile apps
Nato per superare i limiti di ADO (COM,XML Support, Evolution Nato per superare i limiti di ADO (COM,XML Support, Evolution approach)approach)
Wrapper attorno al motore OLE DBWrapper attorno al motore OLE DB
ADO.NETADO.NETNo usa OleDB/COM ma providers nativi .NETNo usa OleDB/COM ma providers nativi .NET
Non supporta cursori lato serverNon supporta cursori lato server
Consumano risorse lato server e non applicabili in alcuni tipi Consumano risorse lato server e non applicabili in alcuni tipi di applicazionidi applicazioni
Supporta firehose cursors (read only, fwd only)Supporta firehose cursors (read only, fwd only)
Supporta resultsets disconnessiSupporta resultsets disconnessi
Ampio supporto all’ XMLAmpio supporto all’ XML
Doppia modalità di funzionamentoDoppia modalità di funzionamentoConnessoConnesso
Connesso alla fonte usando firehose cursorConnesso alla fonte usando firehose cursor
DisconnessoDisconnessoLeggo i dati in un dataset e sconnetto (optimistic batch Leggo i dati in un dataset e sconnetto (optimistic batch update mode)update mode)
ADO.NET – Oggetti principaliADO.NET – Oggetti principaliConnectionConnection
E’ l’oggetto che permette la connessione al DBE’ l’oggetto che permette la connessione al DB
ConnectionString (compatibile con VB6)ConnectionString (compatibile con VB6)
Open/CloseOpen/Close
CommandCommandIndica il comando (Select,Update...) da inviareIndica il comando (Select,Update...) da inviare
DataReaderDataReaderPermette la lettura dei dati eventualmente Permette la lettura dei dati eventualmente ritornati dal comandoritornati dal comando
DataAdapterDataAdapterEsegue il command e ritorna un DataSet / Esegue il command e ritorna un DataSet / DataTableDataTable
Effettua la riconciliazione dei dati nel DBEffettua la riconciliazione dei dati nel DB
ADO.NET – Oggetti principaliADO.NET – Oggetti principali
DataTableDataTableNuova versione del ResultSetNuova versione del ResultSet
Disconnessa e Client SideDisconnessa e Client Side
DataSetDataSetContiene più DataTableContiene più DataTable
Posso definire delle relazioni tra DataTablePosso definire delle relazioni tra DataTable
Database, in memory e disconnessoDatabase, in memory e disconnesso
Totalmente indipendente dalla fonte datiTotalmente indipendente dalla fonte datiText files, Xml files, DataBase...Text files, Xml files, DataBase...
ADO.NET – ProvidersADO.NET – Providers
Blocchi di connessione all’ engine DBBlocchi di connessione all’ engine DB
OLEDb ProviderOLEDb ProviderPermette di accedere a DB per i quali esiste un Permette di accedere a DB per i quali esiste un provider OLE DBprovider OLE DB
MDac (ultima) + Jet EngineMDac (ultima) + Jet Engine
SQLProviderSQLProviderSQLServer 7.0 e superioreSQLServer 7.0 e superiore
No MDacNo MDac
Provider nativo e ottimizzato per SQLServerProvider nativo e ottimizzato per SQLServer
Offre funzionalità aggiuntive disponibili in Offre funzionalità aggiuntive disponibili in SQLServerSQLServer
ADO.NET – NamespacesADO.NET – Namespaces
Tutte le classi sono in System.DataTutte le classi sono in System.Data
System.Data.OleDBSystem.Data.OleDB
Contiene tutte le classi per il provider OLEDBContiene tutte le classi per il provider OLEDB
System.Data.SQLClientSystem.Data.SQLClient
Contiene le classi native per SQLServerContiene le classi native per SQLServer
System.Data.CommonSystem.Data.CommonContiene le classi independenti dal provider (DataSet)Contiene le classi independenti dal provider (DataSet)
ProviderFactoryProviderFactoryE’ il provider che si occupa di creare l’oggetto correttoE’ il provider che si occupa di creare l’oggetto corretto
ADO.NET – ConnectionADO.NET – ConnectionE’ l’oggetto che effettua la connessione al DBE’ l’oggetto che effettua la connessione al DB
ConnectionStringConnectionStringwww. Connectionstring.comwww. Connectionstring.com
Provider=Microsoft.Jet.OLEDB4.0 (no per SQLConnection)Provider=Microsoft.Jet.OLEDB4.0 (no per SQLConnection)
Initial Catalog / DataSource= /AttachDBFilename=Initial Catalog / DataSource= /AttachDBFilename=
Open, Close, StateOpen, Close, StateIn caso di problemi viene generata una OLEDB/SQLExceptionIn caso di problemi viene generata una OLEDB/SQLException
Ha una collezione Errors che fornisce dettagli sul problemaHa una collezione Errors che fornisce dettagli sul problema
Connection PoolingConnection PoolingQuando ci si connette ad un DB il provider crea un pool di Quando ci si connette ad un DB il provider crea un pool di connessioni simili affichè ulteriori richieste di connessioni connessioni simili affichè ulteriori richieste di connessioni vengano gestite velocementevengano gestite velocemente
Basato sulla ConnectionString,può essere Basato sulla ConnectionString,può essere disabilitato,ConnectionTimeout disabilitato,ConnectionTimeout
BeginTransBeginTransOggettoTransaction su cui eseguire Commit o RollBackOggettoTransaction su cui eseguire Commit o RollBack
IsolationLevel determina la modalità di lock durante la IsolationLevel determina la modalità di lock durante la transazionetransazione
ADO.NET – CommandADO.NET – CommandE’ l’oggetto che specifica quale azione compiere verso il DBE’ l’oggetto che specifica quale azione compiere verso il DB
CommandTextCommandTextLa query SQL da eseguireLa query SQL da eseguire
CommandTypeCommandTypeText, StoreProcedureText, StoreProcedure
ConnectionConnectionConnessione associataConnessione associata
ParametersParametersCollezione di parametri associati alla query (da preferire)Collezione di parametri associati alla query (da preferire)
ExecuteReaderExecuteReaderRitorna un DataReader per l’accesso ai dati della queryRitorna un DataReader per l’accesso ai dati della query
ExecuteScalarExecuteScalarEsegue query e ritorna il valore della prima riga/colonnaEsegue query e ritorna il valore della prima riga/colonna
Select Count(*) FROM ...Select Count(*) FROM ...
ExecuteNonQueryExecuteNonQueryEsegue la query e ritorna il numero di righe modificateEsegue la query e ritorna il numero di righe modificate
UPDATE SET...UPDATE SET...
ADO.NET – DataReaderADO.NET – DataReaderCursore ForwardOnly e ReadOnlyCursore ForwardOnly e ReadOnly
Permette di leggere i dati ritornati dalla queryPermette di leggere i dati ritornati dalla query
CommandCommandComando associatoComando associato
Connection Connection Connessione associataConnessione associata
HasRowsHasRowsIndica la presenza di righe da leggere nel DataReaderIndica la presenza di righe da leggere nel DataReader
ReadReadLegge il record successivo, ritorna false al termineLegge il record successivo, ritorna false al termine
GetSchemaTableGetSchemaTableRitorna una DataTable con lo schema del DataReaderRitorna una DataTable con lo schema del DataReader
CloseCloseChiude il DataReader e rilascia le risorse associateChiude il DataReader e rilascia le risorse associate
While reader.Read()While reader.Read() Data=Reader(columnIndex)Data=Reader(columnIndex) ...... Data=reader(“FirstName”)Data=reader(“FirstName”)End WhileEnd While
ADO.NET – DataTableADO.NET – DataTableRecordset statico disconnessoRecordset statico disconnesso
In memory tableIn memory table
Formata da DataColumns e DataRowsFormata da DataColumns e DataRows
Può contenere dati provenienti da più fonti (Query, file Può contenere dati provenienti da più fonti (Query, file XML, codice...)XML, codice...)
Database independentDatabase independent
PrimaryKeyPrimaryKey (colonne che compongono la primarykey (colonne che compongono la primarykey per quella tabella)per quella tabella)
DefaultViewDefaultView permette il filtering e sorting dei dati permette il filtering e sorting dei dati contenuti contenuti
RowsRows
Collezione delle “righe” contenute nella tabellaCollezione delle “righe” contenute nella tabella
NewRow: Crea una nuova riga NewRow: Crea una nuova riga
Delete: Marca la riga come deletedDelete: Marca la riga come deleted
Ogni row mantiene il proprio stato e valoreOgni row mantiene il proprio stato e valore
E’ spesso contenuta in un E’ spesso contenuta in un DataSetDataSet
AcceptChanges / RejectChangesAcceptChanges / RejectChangesResetta lo stato delle righe nella DataTableResetta lo stato delle righe nella DataTable
ADO.NET – DataSetADO.NET – DataSetIn memory disconnected databaseIn memory disconnected database
Permette una visione gerarchica dei datiPermette una visione gerarchica dei dati
Contiene 1 o più tabelle – Tables propertyContiene 1 o più tabelle – Tables property
DataRelationsDataRelationsDescrive la relazione tra tabelleDescrive la relazione tra tabelle
Permettono di navigare tra le relazioni Permettono di navigare tra le relazioni
ChildRelationsChildRelations
ParentRelationsParentRelations
ConstraintsConstraintsRegole di validazione dei dati presenti nel DataSetRegole di validazione dei dati presenti nel DataSet
Column Level: DataColumn (Unique, MaxLength...)Column Level: DataColumn (Unique, MaxLength...)
Table Level: ForeignKeyConstraintTable Level: ForeignKeyConstraint
Autogenerati in base alle relazioni tra tabelleAutogenerati in base alle relazioni tra tabelle
DeleteRule, UpdateRuleDeleteRule, UpdateRule
XML SupportXML SupportLo schema e i dati possono essere memorizzati in un file Lo schema e i dati possono essere memorizzati in un file XMLXML
ADO.NET – DataSetADO.NET – DataSet
ConstraintConstraintss
ConstrainConstraintt
ColumnsColumns ColumnColumn
DataSetDataSet
TablesTables TableTable
OggettoOggetto
CollezioneCollezione
RelationsRelations RelationRelation
RowsRows RowRow
ADO.NET – DataViewADO.NET – DataView
E’ una “vista” dei dati contenuti in una tabellaE’ una “vista” dei dati contenuti in una tabella
Permette di avere delle viste ordinate e filtratePermette di avere delle viste ordinate e filtrate
Composta da insieme di DataRowViewComposta da insieme di DataRowView
Permette inserimenti/EliminazioniPermette inserimenti/Eliminazioni
Agisce sulla Datatable associataAgisce sulla Datatable associata
Usato nel DataBindingUsato nel DataBinding
Dim dv as New DataView(EmpTable)Dim dv as New DataView(EmpTable)dv.RowFilter=“FirstName LIKE A%”dv.RowFilter=“FirstName LIKE A%”dv.Sort=“FirstName,LastName”dv.Sort=“FirstName,LastName”dv.RowStateFilter=DataViewRowState.Unchangeddv.RowStateFilter=DataViewRowState.Unchanged
ADO.NET – DataAdapterADO.NET – DataAdapter
E’ l’anello di congiunzione tra DB e DataSetE’ l’anello di congiunzione tra DB e DataSet
E’ provider dependentE’ provider dependent
CommandsCommandsSelectCommandSelectCommand
InsertCommandInsertCommand
DeleteCommandDeleteCommand
UpdateCommandUpdateCommand
FillFillRiempe un DataSet con le info prese dal DBRiempe un DataSet con le info prese dal DB
FillSchemaFillSchemaCrea lo schema da un DBCrea lo schema da un DB
UpdateUpdateAllinea il DB con il contenuto del DataSetAllinea il DB con il contenuto del DataSet
ADO.NET – Update ModelADO.NET – Update Model
Optimistic batch UpdateOptimistic batch UpdatePossono esserci conflittiPossono esserci conflitti
First / Last WinFirst / Last Win
Il comando Update scorre le righe e in base allo stato invoca il Il comando Update scorre le righe e in base allo stato invoca il comando SQL parametrico nei vari Cmdscomando SQL parametrico nei vari Cmds
I comandi possono essere autogeneratiI comandi possono essere autogenerati
CommandBuilderCommandBuilder
Esegue una Select per recuperare le infoEsegue una Select per recuperare le info
Single Table, Primary Key, PK nella query, No SP Single Table, Primary Key, PK nella query, No SP
Ogni DataTable ha un DataAdapter associatoOgni DataTable ha un DataAdapter associato
HasChangesHasChanges e e GetChangesGetChanges
Ritorna un DataSet con le sole modificheRitorna un DataSet con le sole modifiche
I parametri dei comandi indicanoI parametri dei comandi indicano
Da quale colonna della DataRow recuperare il datoDa quale colonna della DataRow recuperare il dato
Quale versione del dato usare (Current o Original)Quale versione del dato usare (Current o Original)
Eventi DataAdapter.RowUpdating e RowUpdatedEventi DataAdapter.RowUpdating e RowUpdated
DataBindingDataBindingE’ “l’arte” di visualizzare dati ed aggiornarliE’ “l’arte” di visualizzare dati ed aggiornarli
Classe Classe BindingBindingGestisce il legame tra dato e user interfaceGestisce il legame tra dato e user interface
Espone eventi Format, Parse e BindingCompleteEspone eventi Format, Parse e BindingComplete
Gestione update e null valuesGestione update e null values
Simple BindingSimple BindingUn singolo oggetto è la fonte di BindingUn singolo oggetto è la fonte di Binding
Complex BindingComplex BindingUn insieme di oggetti è la fonte di binding (IList)Un insieme di oggetti è la fonte di binding (IList)
Binding ManagerBinding ManagerViene creato per ogni Data Source esposta a bindingViene creato per ogni Data Source esposta a binding
PropertyManager (fonte dati = single item)PropertyManager (fonte dati = single item)
CurrencyManager (fonte dati = list) permette la CurrencyManager (fonte dati = list) permette la navigazionenavigazione
Esposto da BindingContext (DataSource)Esposto da BindingContext (DataSource)
DataBindingDataBindingINotifyPropertyChangedINotifyPropertyChanged
Informa il meccanismo di binding che una proprietà è Informa il meccanismo di binding che una proprietà è cambiatacambiata
IBindingListIBindingListGestisce i dettagli (AddNew,AllowNew...) per il complex Gestisce i dettagli (AddNew,AllowNew...) per il complex bindingbinding
Complessa da implementareComplessa da implementare
BindingList (Of T)BindingList (Of T)E’ un implementazione generica di IBindingListE’ un implementazione generica di IBindingList
Fornisce il supporto al meccanismo di binding Fornisce il supporto al meccanismo di binding (Add,Update...)(Add,Update...)
Non funziona con insiemi già esistenti (es: DataRows)Non funziona con insiemi già esistenti (es: DataRows)
BindingSourceBindingSourceRappresenta un fonte di BindingRappresenta un fonte di Binding
Si interpone tra la UI e la vera fonte datiSi interpone tra la UI e la vera fonte dati
Espone qualsiasi tipo come IBindingListEspone qualsiasi tipo come IBindingList
Semplifica la gestione del DatabindingSemplifica la gestione del Databinding
DataSource accetta un Type e supporta Design modeDataSource accetta un Type e supporta Design mode
DataBinding – UI supportDataBinding – UI supportData Sources WindowData Sources Window
Contiene le fonti di BindingContiene le fonti di Binding
Posso trascinare in un form una data source Posso trascinare in un form una data source (Details/View)(Details/View)
Lookup DataLookup DataDisponibile anche per la DataGridViewDisponibile anche per la DataGridView
BindingSource support Sorting,Filtering e BindingSource support Sorting,Filtering e SearchingSearching
ClickOnce - IntroduzioneClickOnce - Introduzione
ApplicazioniApplicazioni
““Rich Client”Rich Client”
UI pratica e reattivaUI pratica e reattiva
Difficili da distribuire e aggiornareDifficili da distribuire e aggiornare
WebWeb
Server centrale, fix once.Server centrale, fix once.
Più difficile scrivere le applicazioniPiù difficile scrivere le applicazioni
DHTML, JavascriptDHTML, Javascript
No Offline modeNo Offline mode
UI Experience limitataUI Experience limitata
Drag &Drop, Undo, Help...Drag &Drop, Undo, Help...
Oggi c’è sempre più richiesta di applicazioni Oggi c’è sempre più richiesta di applicazioni con UI “ricche”con UI “ricche”
Applicazioni Windows “Smart”Applicazioni Windows “Smart”
Offrono tutti i vantaggi di un applicazione Offrono tutti i vantaggi di un applicazione Win32Win32
Hanno la capacità di auto aggionarsiHanno la capacità di auto aggionarsi
CaratteristicheCaratteristiche
Hanno la capacità di interagire con Hanno la capacità di interagire con l’hardware e il software installatol’hardware e il software installato
Funzionano sia Online che OffLineFunzionano sia Online che OffLine
Utilizzano una nuova modalità di Utilizzano una nuova modalità di deployment/updatedeployment/update
Possono funzionare su diverse piattaformePossono funzionare su diverse piattaforme
ClickOnce - IntroduzioneClickOnce - Introduzione
ClickOnce - CaratteristicheClickOnce - Caratteristiche
ClickOnceClickOnceSupporta il deploy e update di applicazioni .NETSupporta il deploy e update di applicazioni .NET
CD-RomCD-Rom
Percorso di retePercorso di rete
FTPFTP
WEBWEB
Integrata in Visual Studio 2005Integrata in Visual Studio 2005
Debug e Intellisense in ZoneDebug e Intellisense in Zone
Permission richiestePermission richieste
Permission calculatorPermission calculator
Deploy Online e OfflineDeploy Online e Offline
Update allo startup o programmaticoUpdate allo startup o programmatico
System.DeploymentSystem.Deployment
RegFree COM RegFree COM
Slides? Slides?
http://download.manageddesigns.it/classes/http://download.manageddesigns.it/classes/VBLearnAndGetVBLearnAndGet