Januar 2007 - Einträge

Unix Filestamp in .NET Verwenden

Hin und wieder muss man sich doch auch mal mit den anderen unterhalten ;) Dabei kann es vorkommen, dass ein Datum nicht wie gewohnt in der komfortablen DateTime Version vorkommt, sondern als Unix Filestamp in einem Byte Array.

Aber für .NET ist die Konvertierung ein Kinderspiel:

''' <summary> ''' Converts a byte array representing a UNIX FileStamp to a datetime value. ''' </summary> Private Function UnixFileStampToDateTime(ByVal bytes As Byte()) As DateTime Dim lngSeconds As UInt32 lngSeconds = BitConverter.ToUInt32(bytes, 0) Return (New System.DateTime(1970, 1, 1, 0, 0, 0)).AddSeconds(lngSeconds) End Function
''' <summary> ''' Converts a datetime value to a byte array representing a UNIX FileStamp. ''' </summary> Private Function DateTimeToFileStamp(ByVal [date] As Date) As Byte() Dim lngSeconds As Long lngSeconds = CLng([date].Subtract(New System.DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds) Return BitConverter.GetBytes((CUInt(lngSeconds))) End Function

Hinweis: Bei Litte-Endian muss das byte Array vorher noch umgekehrt (Array.Reverse) werden.

Posted von Jan-Cornelius Molnar mit no comments
Abgelegt unter:

Visual Studio 2005 Team Edition for Database Professional Add-on

Die Visual Studio 2005 Team Edition for Database Professionals ist nun als Add-on für Visual Studio Team System (Vollversion und Trail) verfügbar.

http://www.microsoft.com/downloads/details.aspx?FamilyID=7de00386-893d-4142-a778-992b69d482ad&DisplayLang=en

Posted von Jan-Cornelius Molnar mit no comments
Abgelegt unter:

Popup Fenster im Outlook 2003 Stil

Jeder Outlook 2003 Nutzer kennt das kleine Info Popup, das beim erscheinen einer neuen Nachricht eingeblendet wird.

Bei http://www.codeproject.com gibt es ein .NET Control, das dessen Funktionaliät nachbildet.

http://www.codeproject.com/vb/net/PopupNotifier.asp

Posted von Jan-Cornelius Molnar mit no comments
Abgelegt unter:

DirectSound in der eigenen Anwendung nutzen

Microsoft bietet seit .NET 2.0 im Framework Methoden um Sounds wiederzugeben. Jedoch sind diese sehr unflexibel und stoßen schnell an ihre Grenzen, wenn es z.B. darum geht mehrere Sounds gleichzeitig wiederzugeben. Außerdem wird die vorhandene Hardware garnicht genutzt sondern immer alles im Softwaremodus wiedergegeben.

Abhilfe schafft hier DirectSound, für das auch ein .NET Layer namens MDX verfügbar ist. MDX wird automatisch bei der Installation des DirectX SDKs installiert.

Nach der Installation sind viele neue Assemblies verfügbar, wir benötigen lediglich Microsoft.DirectX.DirectSound.

Ist diese Referenz hinzugefügt ist man nur noch wenige Schritte von einem hörbaren Resultat entfernt.

Zunächst muss ein Device erstellt und initialisiert werden.

Dim dev As Microsoft.DirectX.DirectSound.Device dev = New Microsoft.DirectX.DirectSound.Device dev.SetCooperativeLevel(Me, CooperativeLevel.Priority)

Mit SetCooperativeLevel muss ein Bezug auf eine sichtbare Windows Form gesetzt werden.
Das Device sollte nur einmal zu Programmstart erstellt und initialisiert werden.

Mit dem initialisierten Device kann man nun einen SecondaryBuffer erstellen, in den der Sound geladen wird.

 

Dim buff As SecondaryBuffer buff = New SecondaryBuffer("D:\Windows Exclamation.wav", dev)

Nun kann der Sound mit der Play Methode abgespielt werden.

buff.Play(0, BufferPlayFlags.Default)

Analog dazu funktioniert das Abspielen eines Sounds aus einem Stream, wie das z.B. bei eingebetteten Resourcen der Fall ist. Anstatt des Pfads wird lediglich der Stream angegeben.

Dim buff As SecondaryBuffer buff = New SecondaryBuffer(stream, _SoundDevice) buff.Play(0, BufferPlayFlags.Default)

Zusammenfassung

DirectSound bietet eine einfache und kompfortable Möglichkeit Sounds abzuspielen. Dazu kann man die Methoden beliebig durch 3D wiedergabe oder Hardwarebeschleunigung erweitern. Auch das Abspielen von Sounds aus Streams ist problemlos möglich, was das weitergeben der Sounds als Resource sehr erleichtert.

Das einzige "Manko" ist, dass auf dem Zielrechner eine Installation von DirectX 9.0c und der hier benutzten MDX version vorausgesetzt wird. Die benötigten Setups hierfür befinden sich im Installationsverzeichnis des SDKs unter \Redist.

Source Code:

' Initialisierung ... Dim player As SoundPlayer player = New SoundPlayer(Me) ' Abspielen player.PlaySoundFromEmbeddedResource("Windows Exclamation.wav")
Public Class SoundPlayer Dim dev As Microsoft.DirectX.DirectSound.Device Public Sub New(ByVal owner As Form) dev = New Microsoft.DirectX.DirectSound.Device dev.SetCooperativeLevel(owner, CooperativeLevel.Priority) End Sub Public Sub PlaySoundFromFile(ByVal fileName As String) Dim buff As SecondaryBuffer buff = New SecondaryBuffer(fileName, dev) buff.Play(0, BufferPlayFlags.Default) End Sub Public Sub PlaySoundFromEmbeddedResource(ByVal fileName As String) Dim namesp As String Dim stream As System.IO.Stream namesp = System.Reflection.Assembly.GetExecutingAssembly.GetName.Name stream = System.Reflection.Assembly.GetExecutingAssembly.GetManifestResourceStream(namesp & "." & fileName) If stream Is Nothing Then Throw New ArgumentException(String.Format("Embedded Resource '{0}' wurde nicht gefunden!", fileName)) PlaySoundFromStream(stream) End Sub Public Sub PlaySoundFromStream(ByVal stream As System.IO.Stream) Dim buff As SecondaryBuffer buff = New SecondaryBuffer(stream, dev) buff.Play(0, BufferPlayFlags.Default) End Sub End Class
Posted von Jan-Cornelius Molnar mit no comments
Abgelegt unter:

Audio Wave Resource abspielen

Viele Anwendungen benutzen Sounds um den Benutzer über bestimmte Ereignisse zu informieren. Jedoch will man die Audio Dateien nicht "lose" im Dateisystem herumliegen lassen, sondern mit der Anwendung bündeln. Dazu bietet sich das Resourcen System von Visual Basic an.

Hier eine Schritt für Schritt Anleitung zum Abspielen von Wave Dateien aus Resourcen:

1. Wave Datei mittels Projekt\Vorhandenes Element hinzufügen in das Projekt einfügen
2. Das Item im Projekt Explorer auswählen und in den Eigenschaften als Build-Aktion Eingebettete Resource einstellen
3. Folgende Klasse bietet die Funktionalität zum Abspielen

Public Class Winmm Public Const SND_ASYNC As UInt32 = 1 Public Const SND_MEMORY As UInt32 = 4 Declare Auto Function PlaySound Lib "Winmm.dll" (ByVal rsc As IntPtr, ByVal hMod As IntPtr, ByVal dwFlags As UInt32) As Boolean Declare Auto Function PlaySound Lib "Winmm.dll" (ByVal Sound As String, ByVal hMod As IntPtr, ByVal dwFlags As UInt32) As Boolean Declare Auto Function PlaySound Lib "Winmm.dll" (ByVal data As Byte(), ByVal hMod As IntPtr, ByVal dwFlags As UInt32) As Boolean Public Shared Sub PlayWavResource(ByVal wav As String) Dim namesp As String Dim stream As System.IO.Stream namesp = System.Reflection.Assembly.GetExecutingAssembly.GetName.Name stream = System.Reflection.Assembly.GetExecutingAssembly.GetManifestResourceStream(namesp & "." & wav) If stream Is Nothing Then Return Dim data(CInt(stream.Length - 1)) As Byte stream.Read(data, 0, CInt(stream.Length)) PlaySound(data, IntPtr.Zero, SND_ASYNC Or SND_ASYNC) End Sub End Class

4. Die Resource MeineTolleWaveDatei.wav lässt sich so abspielen

Winmm.PlayWavResource("MeineTolleWaveDatei.wav")
Posted von Jan-Cornelius Molnar mit no comments
Abgelegt unter:

Vista Xaml Styles

Da WPF eine völlig eigenständige Renderengine ist, greift sie nicht auf die GDI Funktionen von Windows zu, sondern zeichnet alles selbst.
Dies bedeutet auch, dass alle Windows Styles also Vistas Aero, XPs Luna und der klassische Windows Style in WPF nachgebaut werden mussten.

Die WPF Samles des Windows SDKs enthalten diese Styles im Xaml Format.
In folgenden Verzeichnissen findet man die Styles:

Aero \WPFSamples\Core\AeroTheme\XAML
Luna \WPFSamples\Core\LunaTheme\XAML
Royale \WPFSamples\Core\RoyaleTheme\XAML
Classic \WPFSamples\Core\ClassicTheme\XAML

Viel Spaß damit!

Posted von Jan-Cornelius Molnar mit no comments
Abgelegt unter: ,

WPF lokalisieren

.NET setzt beim Programmstart die CultureInfo automatisch auf die systemweit Eingestellte.

WPF Elemente lassen sich jedoch von dieser Einstellung nicht beeindrucken.

Das wird vor allem dann zum Problem, wenn man z.B. Datums-Eingaben in Textfeldern parst ...

Die Lösung des Problems ist jedoch sehr einfach, indem man im Xaml Element das xml:lang Attribut setzt.

 

<Window x:Class="Window1" xml:lang="de-de" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >

Bisher habe ich jedoch noch nicht herausgefunden, wie man diesen Vorgang automatisiert, sodass sich die CultureInfo der im System eingestellten anpasst ...

Posted von Jan-Cornelius Molnar mit 1 comment(s)
Abgelegt unter: ,

Visual Studio 2005 + subversion

Nicht nur für Team Arbeit bietet sich ein SourceControl Provider an. Steht ein Projekt unter SourceControl, verfügt man über ein ständiges BackUp- und Versionierungssystem, durch das Änderungen schnell rückgängig gemacht aber auch gut nachvollzogen und dokumentiert werden können.

Der CVS Nachfolger subversion (im Folgenden SVN genannt) ist eine gute Alternative zu dem etwas in Vergessenheit geratenen Visual SourceSafe.
Wie für SourceSafe existiert auch für SVN ein Visual Studio PlugIn, wodurch angenehmes Arbeiten ermöglicht wird.

Dieser Artikel soll zeigen, wie man subversion für die Verwendung mit Visual Studio 2005 konfiguriert.

Vorbereitung

SVN ist sehr flexibel und benötigt keine Installation im eigentlichen Sinne. Ob auf SVN von einem remote client oder lokal zugegriffen wird spielt lediglich für die Firewall eine Rolle.
Hier wird eine lokale Installation im Verzeichnis C:\SVN erstellt.

Zunächst muss SVN selbst heruntergeladen werden (http://subversion.tigris.org/). Die Version 1.4.2 ist zurzeit aktuell.

Um SVN komfortabel zu verwalten, empfiehlt sich ebenfalls die Installation von TortoiseSVN (http://tortoisesvn.tigris.org/).

Letztlich wird noch das Visual Studio Plug-In Ankh benötigt (http://ankhsvn.tigris.org/).

Konfiguration

Das subversion .ZIP Archiv wird extrahiert und der Inhalt des bin Verzeichnisses nach C:\SVN\bin kopiert.

SVN legt Daten in einem speziellen Verzeichnis, einem sog. repository ab. Nach der ToroiseSVN Installation kann ein solches repository im Explorer mit dem Kommando „create repository here“ eingerichtet werden (z.B. in C:\SVN\repos\).

In diesem Verzeichnis wird nun die SVN Ordnerstruktur angelegt. Im Unterverzeichnis conf befindet sich die Datei svnserve.conf. Diese ermöglicht eine einfache Konfiguration des SVN repositorys.
Entfernt man alle # vor einer Zeile, wird diese aktiviert.

Passwortgeschützter Zugriff wird so aktiviert:

password-db = passwd

Hier kann eine beliebige Bezeichnung gewählt werden:

realm = My Local Repository

Bestimmt, dass nicht authentifizierte Benutzer keinen Zugriff haben:

anon-access = none

Bestimmt, dass authentifizierte Benutzer Schreibrechte haben.

auth-access = write

Für den passwortgeschützten Zugriff muss zusätzlich noch die Datei passwd bearbeitet werden, die die Benutzerkonten enthält.

Das Schema der Datei lautet.

benutzer = passwort

Ist die Konfiguration abgeschlossen, kann nun der SVN „Server“ gestartet werden.
Das dafür erforderliche Programm svnserve.exe befindet sich im bin Verzeichnis. Dieses Programm wird nun mit folgenden Parametern gestartet:

svnserve -d -r C:\SVN\repos

Dadurch wird das Repository C:\SVN\repos aktiviert.

Erster Test

Mit ToroiseSVN lässt sich die Konfiguration sofort überprüfen. Dazu wird ein beliebiges leeres Verzeichnis benötigt (ACHTUNG: keines der verwendeten SVN Verzeichnisse). Mit einem Klick auf „svn checkout“ kann eine Verbindung zum repository hergestellt werden.

Als Pfad ist nun svn://localhost/ anzugeben.

Bei aktiviertem Passwortschutz wird man nun aufgefordert, ein zuvor definiertes Benutzerkonto einzugeben.

TortoiseSVN zeigt daraufhin eine Erfolgsmeldung an. Des Weiteren ist in diesem Verzeichnis ein versteckter Ordner .svn erstellt worden.

SVN ist nun einsatzbereit!

Visual Studio 2005

Nach der Ankh Installation müssen noch Programme für Diff und Merge Funktionen konfiguriert werden. Diese sind nicht in Ankh integriert, da es eine Vielzahl von bereits verfügbaren Tools gibt. Ist TortoiseSVN ebenfalls installiert, können die Tortoise Tools dafür festgelegt werden.

Die Ankh Konfiguration kann mittels Tools\Ankh\Edit the Ankh configuration … geöffnet werden.

Dort kann ein DiffExePath und ein MergeExePath festgelegt werden. Für Tortoise sind entsprechende Templates vorhanden, die mit der Tastenkombination Strg-T angezeigt werden.

Nun kann ein Projekt in Visual Studio mit „Datei\Add solution to Subversion repository …“ eingecheckt werden.
 

Als url ist erneut svn://localhost/ anzugeben.

Veränderte Dateien sind an einem roten M zu erkennen, unveränderte an einem grünen Haken.
Änderungen an dem Projekt werden mit dem Commit Befehl an die SVN Datenbank übermittelt.

Daraufhin erscheint ein Fenster, das die Auswahl der zu sendenden Dateien ermöglicht.

Wurde das Projekt von außerhalb (z.B. von einem anderen Entwickler) verändert, kann man die aktuellste Version mit dem Update Befehl von der SVN Datenbank beziehen.

SVN ist nun vollständig für die Verwendung mit Visual Studio 2005 konfiguriert.

SVN als Service

Wird SVN auf einem Server aufgeführt, besteht die Möglichkeit svnserve auch als Windows Service zu starten. Mit folgendem Befhel kann man svnserve als Windows Service registrieren:

sc create svnserve binpath= "c:\SVN\bin\svnserve.exe --service -r c:\SVN\repos" displayname= "Subversion" depend= tcpip start= auto

Posted von Jan-Cornelius Molnar mit 1 comment(s)
Abgelegt unter: ,