| Roland's profileSnoopy´s Live-SpaceBlogListsNetwork | Help |
Snoopy´s Live-SpaceMein Space Rund um VB.Net und Segelfliegen |
|||||
|
|
June 01 HexDump Visualizer für Visual Studio 2008Visualizer sind das Salz in der Suppe beim Debuggen. Wir arbeiten meist vollkommen unbewusst in unserer täglichen Arbeit mit Visual Studio damit. Doch VS bietet nicht für alle Gegebenheiten einen Visualizer an. Will man bspw. einen Text Stream nach irgendwelchen nicht druckbaren Sonderzeichen untersuchen, benötigt man die Ausgabe oft als Hex-Anzeige. Eine kleine Routine, die uns den Hex-Wert des Streams im Debug Fenster anzeigt ist zwar schnell geschrieben, doch wie wäre es mit einem Visualizer der uns die Hex-Werte direkt beim Debuggen anzeigt. HexDump Visualizer erledigt das für uns, denn genau dafür habe ich ihn geschrieben. February 24 VB-Power.net im neuen Design
Das ich in den letzten Wochen hier nichts gebloggt habe liegt daran, dass ich meine alte VB-Power.net Webseite komplett überarbeitet habe. Die alte Seite gibt es jetzt nicht mehr, stattdessen habe ich die neue Seite mit dem Website Baker CMS entwickelt. Das Website Baker CMS ist schon ein tolles Teil, womit man auch ohne viel PHP Kenntnisse sehr schöne Websites erstellen kann. Aber seht doch selber und schaut euch das neue VB-Power.net an. Viel Spaß auf meiner Webseite... 16 zusätzliche Spaltentypen für das DataGridViewDas DataGridView aus dem DotNet-FrameWork ist schon ein recht flexibles Teil, jedoch ist es mit seinen Standard Columns etwas mager ausgestattet. Von daher haben wir uns es zur Aufgabe gemacht, etwas Pepp in das Control zu bringen. Dazu haben wir eine Extender Dll für das DataGridView entwickelt, die (bis jetzt) zusätzlich zu den vorhandenen Spalten, 16 weitere Spaltentypen dem DataGridView hinzufügt. Die Dll braucht lediglich als Verweis ins Projekt aufgenommen werden und schon stehen ohne eine einzige Zeile Code, die neuen Spalten automatisch zur Verfügung und können komplett im Designer konfiguriert werden. Folgende Spaltentypen stellt die Dll dem DataGridView zur Verfügung: Image (Icon) Spalten
Numerische Spalten
CustomControl Spalten
MemoControl Spalten
Weitere Informationen, ScreenShots und Downloads zum DataGridView Control Extender gibt es hier... NetRadioPlayer - Streaming Internet Radio PlayerHallo Spacer... Der Player spielt Web-Radio Streams ab. ShoutCast und IceCast Playlisten (m3u, pls) werden nicht unterstützt. Aber wer weiß - vielleicht kommt das ja noch. Ich habe schon einige Streams mit dazu gepakt. Eine gute Anlauf-Adresse für Streams ist Surfmusik.de http://www.surfmusik.de/ Zum Download des Players geht es hier lang... Viel Spaß damit... December 06 Asynchrone FileScan API-KlasseDie nachfolgende VB.Net Klasse ermittelt aufgrund des angegebenen SearchPattern alle Dateien eines Ordners und bei Bedarf auch deren Unter-Ordner. Dabei wird eine gefundene Übereinstimmung (Treffer) über ein Event direkt an die aufrufende Form zurückgegeben. Die Klasse wird als Thread mit dem BackgroundWorker ausgeführt, so dass die Anwendung nicht einfriert. Der BackgroundWorker bietet weiterhin den Vorteil, dass wir uns nicht um threadübergreifende Zugriffe auf die GUI kümmern müssen – wir also nicht mit Invoke arbeiten müssen, so dass auch der weniger erfahrene VB-Programmierer problemlos mit der Klasse arbeiten kann. Durch die Verwendung der „FindFirstFile“ und „FindNextFile“ APIs erhalten wir den Vorteil, dass ein Treffer direkt zurückgegeben werden kann. Dies ist mit den DotNet Bordmitteln so nicht möglich, da uns System.IO.Directory.GetFiles erst ein String-Array zurückliefert, wenn die Suche abgeschlossen ist – was bei tiefen Verzeichnisbäumen schon mal ein bisschen dauern kann.
Da der Quellcode etwas umfangreicher ist, stelle ich hier das gesamte VB2008 Projekt zum Download bereit. November 30 Der Windows Live Writer und die Darstellung von SourcecodeDas Einfügen von Sourcecode im Live Blog mit dem Windows Live Writer ist schon eine aufwendige Sache, wenn die Formatierung und Syntax Highligthing beibehalten bleiben soll Code Snippet plugin for Windows Live Writer Viel Spaß damit... Direkter Download einer TextdateiMit nachfolgender VB.Net Klasse lässt sich der Inhalt einer Datei, die auf einem Webserver gespeichert ist, auslesen und als String zurückgeben, ohne dass die Datei vorher lokal zwischengespeichert werden muss. Imports System.NetImports System.TextPublic Class clsDownload ''' <summary> ''' Inhalt einer Internetdatei auslesen ohne diese lokal zwischenzuspeichern ''' </summary> ''' <param name="sUrl">URL der Datei auf dem Webserver</param> ''' <returns>Inhalt der Datei als String</returns>Public Shared Function TextDownload(ByVal sUrl As String) As String Dim dWeb As New WebClient With dWeb .Encoding = Encoding.Default .CachePolicy = New Cache.RequestCachePolicy( _Cache.RequestCacheLevel.NoCacheNoStore) End With Try Return dWeb.DownloadString(sUrl)Catch ex As Exception Return "[Error]" End Try End Function End Class September 12 Zufällige SeriennummerDie nachfolgende VB.Net Klasse erzeugt eine zufällige Seriennummer. Die Rückgabe erfolgt dabei über die überschriebene .ToString Methode. Im Konstruktor der Klasse kann festgelegt werden, wieviele Blöcke und mit welcher Blocklänge eine Seriennummer erzeugt werden soll. Source als Textdatei... Imports System.Text''' <summary>''' SerialNumber Generator Class''' </summary>''' <remarks>''' Die Klasse erzeugt eine zufällige Seriennummer. Die Rückgabe erfolgt''' über die .ToString Methode. Im Konstruktor wird festgelegt, wieviele''' Blöcke und mit welcher Blocklänge die Seriennummer erzeugt wird.''' </remarks>Public Class SerialNumber ' Member VariablenPrivate m_BlockLength As Int16 = 6 Private m_BlockCount As Int16 = 2 Private m_Delimiter As String = "-" ''' <summary> ''' Initialisiert die Klasse ''' </summary>Public Sub New() End Sub ''' <summary> ''' Initialisiert die Klasse ''' </summary> ''' <param name="BlockLength">Legt die Länge eines Blocks fest.</param> ''' <param name="BlockCount">Legt die Anzahl Blöcke in der Seriennummer fest.</param>Public Sub New(ByVal BlockLength As Int16, ByVal BlockCount As Int16) m_BlockLength = BlockLength m_BlockCount = BlockCount End Sub ''' <summary> ''' Initialisiert die Klasse ''' </summary> ''' <param name="BlockLength">Legt die Länge eines Blocks fest.</param> ''' <param name="BlockCount">Legt die Anzahl Blöcke in der Seriennummer fest.</param> ''' <param name="Delimiter">Legt den Trenner zwischen den Blöcken fest.</param>Public Sub New(ByVal BlockLength As Int16, ByVal BlockCount As Int16, ByVal Delimiter As String) m_BlockLength = BlockLength m_BlockCount = BlockCount m_Delimiter = Delimiter End Sub Private Function Generate(ByVal BlockLength As Int16, _ ByVal BlockCount As Int16, ByVal Delimiter As String) As String Dim si As New StringBuilder Dim sb As New StringBuilder For n = 0 To BlockCount - 1 Trysi.Append(Guid.NewGuid.ToString().Replace("-", "").ToUpper) sb.Append(si.ToString.Substring(n * BlockLength, BlockLength) & Delimiter) Catch ex As Exception Throw New Exception("Fehler beim Erstellen der Seriennummer.") End Try Next Return sb.ToString.Substring(0, sb.Length - Delimiter.Length)End Function ''' <summary> ''' Gibt die erzeugte Seriennummer zurück. ''' </summary>Public Overrides Function ToString() As String Return Me.Generate(m_BlockLength, m_BlockCount, m_Delimiter) End Function End Class
September 10 Late-Binding Wrapper für den Windows Media PlayerDas nachfolgende Klassenmodul für VB.Net kapselt den Windows Media Player via Late Binding. Dadurch entsteht keine Abhängigkeit zu einer speziellen Version des WMPs. Auch wird nicht mit Interop-Dlls gedealt :-) Source als Textdatei...
''' <summary> ''' Aufzählung der Player Rückgabewerte ''' </summary> Public Enum PlayState Undefined = 0 Stopped = 1 Paused = 2 Playing = 3 ScanForward = 4 ScanReverse = 5 Buffering = 6 Waiting = 7 MediaEmbed = 8 Busy = 9 Ready = 10 Reconnecting = 11 Last = 12 End Enum
''' <summary> ''' WMPNetWrapper Klassenmodul ''' ========================== ''' Das Klassenmodul erzeugt eine Instanz des Windows Media Players. ''' Die Instanz wird über "Late Binding" erzeugt, so dass keine Abhängigkeit ''' zu einer speziellen Version des WMPs besteht. Das Klassenmodul kann ''' dazu genutzt werden, um Musik Dateien oder Streams aus dem Internet ''' abzuspielen - z.B. Web-Radio Streams. ''' </summary> Public Class WMPNetWrapper Private m_Player As Object Private isInitialized As Boolean = False Private m_PlayerStatus As Integer = PlayState.Undefined Private m_Timer As New Timer With {.Interval = 250, .Enabled = False}
Public Event ErrorOccured(ByVal sender As WMPNetWrapper, ByVal e As Exception) Public Event CurrentStatus(ByVal sender As WMPNetWrapper, ByVal Msg As String) Public Event StatusChange(ByVal sender As WMPNetWrapper, ByVal e As PlayState)
Public Sub New() Me.InitializeComponent() End Sub
''' <summary> ''' Initialisiert die Klasse und erstellt ein "Late Binding" ''' Objekt zur Laufzeit. ''' </summary> Private Sub InitializeComponent() Dim t As Type = Type.GetTypeFromProgID("WMPlayer.OCX") If t IsNot Nothing Then Try m_Player = CreateObject("WMPlayer.OCX") m_Player.settings.autoStart = True m_Timer.Enabled = True AddHandler m_Timer.Tick, AddressOf TimerTick isInitialized = True Catch ex As Exception isInitialized = False Throw New Exception(ex.Message) End Try End If End Sub
''' <summary> ''' Legt fest, ob beim Aufruf der Open Methode der Stream sofort abgespielt ''' werden soll. Bei False muss dann nach dem Open Aufruf noch die Play ''' Methode ausgeführt werden. ''' </summary> Public Property AutoStart() As Boolean Get Return m_Player.settings.autostart End Get Set(ByVal value As Boolean) Try m_Player.settings.autostart = value Catch ex As Exception m_PlayerStatus = PlayState.Undefined RaiseEvent ErrorOccured(Me, ex) End Try End Set End Property
''' <summary> ''' Regelt die Lautsprecher Balance, oder liest diese aus. ''' </summary> ''' <value>Ein gültiger Wert zwischen 0 - 100</value> Public Property Balance() As Integer Get Return m_Player.settings.balance End Get Set(ByVal value As Integer) Try m_Player.settings.balance = value Catch ex As Exception m_PlayerStatus = PlayState.Undefined RaiseEvent ErrorOccured(Me, ex) End Try End Set End Property
''' <summary> ''' Gibt die Spieldauer des aktuellen Streams zurück. ''' </summary> Public ReadOnly Property Duration() As Double Get Return m_Player.currentMedia.duration End Get End Property
''' <summary> ''' Schaltet die Lautsprecher ein oder aus. ''' </summary> ''' <remarks>Die aktuelle Wiedergabe wird dabei nicht unterbrochen.</remarks> Public Property Mute() As Boolean Get Return m_Player.settings.mute End Get Set(ByVal value As Boolean) Try m_Player.settings.mute = value Catch ex As Exception m_PlayerStatus = PlayState.Undefined RaiseEvent ErrorOccured(Me, ex) End Try End Set End Property
''' <summary> ''' Öffnet einen Mediastream zur Wiedergabe. ''' </summary> ''' <param name="MediaStream">Einen gültigen Pfad oder URL zum Mediastream.</param> ''' <remarks>Der Media Player unterstützt ebenfalls Web-Radio Streams. ''' Hierbei können nur direkte URLs angegeben werden. SHOUTcast und ICEcast ''' Playlists werden nicht unterstützt. Diese müssen separat geparst werden, ''' um die Kanäle zu Ermitteln. Die ermittelten Kanäle können dann zur Wiedergabe ''' geöffnet werden.</remarks> Public Sub Open(ByVal MediaStream As String) If Not isInitialized Then Exit Sub Try Me.Stop() m_Player.url = MediaStream Catch ex As Exception m_PlayerStatus = PlayState.Undefined RaiseEvent ErrorOccured(Me, ex) End Try End Sub
''' <summary> ''' Unterbricht die aktuelle Wiedergabe. ''' </summary> Public Sub Pause() Try If m_PlayerStatus <> PlayState.Paused Then m_Player.controls.pause() End If Catch ex As Exception m_PlayerStatus = PlayState.Undefined RaiseEvent ErrorOccured(Me, ex) End Try End Sub
''' <summary> ''' Spielt den aktuell geöffneten Stream ab. ''' </summary> Public Sub Play() Try If m_PlayerStatus <> PlayState.Playing Then m_Player.controls.play() End If Catch ex As Exception m_PlayerStatus = PlayState.Undefined RaiseEvent ErrorOccured(Me, ex) End Try End Sub
''' <summary> ''' Gibt den Player-Status als PlayState Enum zurück. ''' </summary> Public ReadOnly Property PlayerStatus() As PlayState Get Return m_PlayerStatus End Get End Property
''' <summary> ''' Positioniert den aktuellen Wiedergabepointer, oder liest diesen aus. ''' </summary> ''' <value>Ein gültiger Wert zwischen 0 - Duration (Spieldauer)</value> ''' <remarks>Siehe auch die Eigenschaft "Duration"</remarks> Public Property Position() As Double Get Return m_Player.controls.currentPosition End Get Set(ByVal value As Double) Try m_Player.controls.currentPosition = value Catch ex As Exception m_PlayerStatus = PlayState.Undefined RaiseEvent ErrorOccured(Me, ex) End Try End Set End Property
''' <summary> ''' Gibt den Player-Status als Text zurück. ''' </summary> Public ReadOnly Property Status() As String Get Return m_Player.status End Get End Property
''' <summary> ''' Stoppt die Wiedergabe des aktuellen Streams. ''' </summary> Public Sub [Stop]() Try If m_PlayerStatus <> PlayState.Stopped Then m_Player.controls.stop() End If Catch ex As Exception m_PlayerStatus = PlayState.Undefined RaiseEvent ErrorOccured(Me, ex) End Try End Sub
''' <summary> ''' Fährt mit der unterbrochenen Wiedergabe fort. ''' </summary> Public Sub [Resume]() Try If m_PlayerStatus = PlayState.Paused Then Me.Play() End If Catch ex As Exception m_PlayerStatus = PlayState.Undefined RaiseEvent ErrorOccured(Me, ex) End Try End Sub
''' <summary> ''' Setzt den Lautstärkepegel, oder liest diesen aus. ''' </summary> ''' <value>Ein gültiger Wert zwischen 0 - 100</value> Public Property Volume() As Integer Get Return m_Player.settings.volume End Get Set(ByVal value As Integer) Try m_Player.settings.volume = value Catch ex As Exception m_PlayerStatus = PlayState.Undefined RaiseEvent ErrorOccured(Me, ex) End Try End Set End Property
''' <summary> ''' Delegate TimerTick ''' </summary> ''' <remarks>Der Timer feuert den Status als Event in die aufrufende Form zurück ''' </remarks> Private Sub TimerTick(ByVal sender As Object, ByVal e As System.EventArgs) Static LastState As PlayState = -1 Static CurrentState As PlayState = -1
CurrentState = m_Player.playstate If LastState <> CurrentState Then m_PlayerStatus = CurrentState LastState = CurrentState RaiseEvent StatusChange(Me, m_PlayerStatus) End If
RaiseEvent CurrentStatus(Me, Me.Status) End Sub End Class August 17 PictureBox mit Proxy-Server UnterstützungIn vielen Mittelständigen- und Großunternehmen wird zur Kommunikation mit dem Web ein Proxy-Server verwendet, über den die Mitarbeiter im Internet surfen. Dabei muss sich der Mitarbeiter an den Proxy-Server durch Benutzername und Passwort authentifizieren. Die Anwendung (wie bspw. der Internet Explorer) muss dabei in der Lage sein, mit einem solchen Proxy-Server kommunizieren zu können. Wenn Sie eine WebClient Anwendung programmiert haben, in dem das Webbrowser Steuerelement verwendet wird, ist das noch kein Problem. Das Webbrowser Steuerelement erkennt automatisch, aufgrund der Systemeinstellungen, den Proxy-Server und fordert eine Authentifizierung vom Benutzer an. Verwenden Sie in Ihrer Anwendung eine PictureBox um z.B. Grafiken, Diagramme oder gar Werbebanner aus dem Web abzurufen, so erhalten Sie die Fehlermeldung „Proxy authentification requiered“ vom Proxy-Server zurück. Die PictureBox ist schlichtweg nicht in der Lage, die Grafiken über einen Proxy-Server abzurufen, da sie diese Möglichkeit nicht vorsieht. Die nachfolgende Komponente „ProxyPictureBox“ schafft Abhilfe. Sie erbt von PictureBox und überschreibt die Eigenschaft „ImageLocation“, wobei weiterhin auch die ursprüngliche Verwendung, also ohne Proxy-Server, möglich ist. Das Abrufen der Daten über den Proxy-Server erfolgt dabei asynchron, so dass die Auslastung Ihrer Anwendung nicht beeinflusst wird. Hinweis: Wenn Sie die „ProxyPictureBox“ verwenden, müssen Sie erst die Eigenschaften für den Proxy-Server vornehmen, bevor Sie die Eigenschaft „ImageLocation“ setzen.
Imports System.Net Imports System.Text Imports System.ComponentModel
''' <summary> ''' PictureBox mit Proxy Server Unterstützung ''' </summary> ''' <remarks> ''' Die Komponente erbt von PictureBox und erweitert diese umd die Möglichkeit, ''' den Download eines Images aus dem Web über einen Proxy Server zu realisieren. ''' Der Download des Images erfolgt dabei asynchron. ''' </remarks> Public Class ProxyPictureBox Inherits PictureBox
Private m_UseProxy As Boolean = False Private m_UseProxyIESettings As Boolean = False Private m_ProxyServer As String Private m_ProxyPort As Integer = 8080 Private m_ProxyUserName As String Private m_ProxyPassword As String Private m_ImageLocation As String
Private isInitCompleted As Boolean = False Private InitTimer As New Windows.Forms.Timer
Public Event ProxyError(ByVal sender As Object, ByVal ex As Exception) Public Event ProxyDownloadCompleted(ByVal sender As Object, ByVal e As EventArgs)
Public Sub New() AddHandler InitTimer.Tick, AddressOf InitTimerTick InitTimer.Interval = 250 InitTimer.Enabled = True End Sub
Private Sub InitTimerTick(ByVal sender As Object, ByVal e As System.EventArgs) isInitCompleted = True InitTimer.Enabled = False Me.ImageLocation = m_ImageLocation End Sub
''' <summary> ''' Legt den Web-Speicherort fest, aus dem das Image geladen wird. ''' </summary> ''' <remarks> ''' Die überladene Eigenschaft unterstützt den Download des Images über ''' einen Proxy Server. Legen Sie zuerst alle Proxy Eigenschaften fest, ''' bevor Sie dieser Eigenschaft einen Wert zuweisen. Belassen Sie die ''' Eigenschaft "UseProxy" auf False, so wird das Image ohne Proxy ''' angezeigt. (Default) ''' </remarks> Public Overloads Property ImageLocation() As String Get Return m_ImageLocation End Get Set(ByVal value As String) m_ImageLocation = value If String.IsNullOrEmpty(m_ImageLocation) Then Exit Property Else If isInitCompleted Then If m_UseProxy Then Dim dWeb As New WebClient AddHandler dWeb.DownloadDataCompleted, AddressOf dWebDownloadDataCompleted
Try If m_UseProxyIESettings Then dWeb.Proxy = Net.WebRequest.GetSystemWebProxy Else dWeb.Proxy = New WebProxy(m_ProxyServer, m_ProxyPort) End If dWeb.Proxy.Credentials = New NetworkCredential(m_ProxyUserName, m_ProxyPassword) dWeb.Encoding = Encoding.Default dWeb.CachePolicy = New System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore) dWeb.DownloadDataAsync(New Uri(m_ImageLocation)) Catch ex As Exception RaiseEvent ProxyError(Me, ex) Finally dWeb.Dispose() End Try Else MyBase.ImageLocation = m_ImageLocation End If End If End If End Set End Property
''' <summary> ''' Delegated Sub, wird aufgerufen wenn der Download über den Proxy Server beendet wurde ''' </summary> Private Sub dWebDownloadDataCompleted(ByVal sender As Object, ByVal e As System.Net.DownloadDataCompletedEventArgs) Try If Not e.Cancelled Then Dim MS As New IO.MemoryStream(e.Result) MyBase.Image = Image.FromStream(MS) RaiseEvent ProxyDownloadCompleted(Me, New EventArgs) Else RaiseEvent ProxyError(Me, New Exception("Download cancelled")) End If Catch ex As Exception RaiseEvent ProxyError(Me, ex) End Try End Sub
''' <summary> ''' Bestimmt, ob ein Proxy Server verwendet werden soll. ''' </summary> <Category("Proxy"), Bindable(True), _ DefaultValue(GetType(System.Boolean), "False"), _ Description("Bestimmt, ob ein Proxy Server verwendet werden soll.")> _ Public Property UseProxy() As Boolean Get Return m_UseProxy End Get Set(ByVal value As Boolean) m_UseProxy = value End Set End Property
''' <summary> ''' Bestimmt, ob die Proxy Einstellungen des Internet Explorers verwendet werden sollen. ''' </summary> <Category("Proxy"), Bindable(True), _ DefaultValue(GetType(System.Boolean), "False"), _ Description("Bestimmt, ob die Proxy Einstellungen des Internet Explorers verwendet werden sollen.")> _ Public Property UseProxyIESettings() As Boolean Get Return m_UseProxyIESettings End Get Set(ByVal value As Boolean) m_UseProxyIESettings = value End Set End Property
''' <summary> ''' Legt die Adresse für den Proxy Server fest. ''' </summary> <Category("Proxy"), Bindable(True), _ Description("Legt die Adresse für den Proxy Server fest.")> _ Public Property ProxyServer() As String Get Return m_ProxyServer End Get Set(ByVal value As String) m_ProxyServer = value End Set End Property
''' <summary> ''' Legt den Port des Proxy Servers fest. ''' </summary> <Category("Proxy"), Bindable(True), _ DefaultValue(GetType(System.Int32), "8080"), _ Description("Legt den Port des Proxy Servers fest.")> _ Public Property ProxyPort() As Integer Get Return m_ProxyPort End Get Set(ByVal value As Integer) m_ProxyPort = value End Set End Property
''' <summary> ''' Legt den Benutzernamen des Proxy Servers fest. ''' </summary> <Category("Proxy"), Bindable(True), _ Description("Legt den Benutzernamen des Proxy Servers fest.")> _ Public Property ProxyUserName() As String Get Return m_ProxyUserName End Get Set(ByVal value As String) m_ProxyUserName = value End Set End Property
''' <summary> ''' Legt das Passwort des Proxy Servers fest. ''' </summary> <Category("Proxy"), Bindable(True), _ PasswordPropertyText(True), _ Description("Legt das Passwort des Proxy Servers fest.")> _ Public Property ProxyPassword() As String Get Return m_ProxyPassword End Get Set(ByVal value As String) m_ProxyPassword = value End Set End Property
End Class |
||||
|
|