December, 2006

  • <dw:daniel_walzenbach runat="server" />

    Frohe Weihnachten…

    • 0 Comments

    … sowie einen guten und erfolgreichen Start in das neue Jahr wünsche ich allen Lesern meines Blogs!

    Frohe Weihnachten!

    Festliche Grüße

    Daniel Walzenbach

  • <dw:daniel_walzenbach runat="server" />

    Das Chamäleon ASP.NET

    • 1 Comments

    Ein beständiger Quell der Freude bei der Entwicklung von Webseiten ist, dass verschiedene Browser und verschiedene Versionen des gleichen Browsers jeweils unterschiedliche Features unterstützen. Als Resultat stellen verschiedene Browser die gleiche HTML-Seite unterschiedlich dar und Entwickler waren jahrelang gezwungen Ihre Seiten für verschiedene Browser zu optimieren, wollten Sie dem Besucher ihrer Seite eine optimale "User Experience" anbieten.

    Für ASP.NET Entwickler gehört dieses Problem sei der ersten Version von .NET (bis auf ein paar Ausnahmen) der Vergangenheit an. ASP.NET Webseiten setzen sich zu einem großen Teil aus ASP.NET Controls zusammen. Diese Controls sind anhand der Benutzeragenteninformationen in der Lage den Browser, der die Seite anfordert, zu erkennen und können daraufhin die Ausgabe auf die Darstellung des Browsers entsprechend anpassen. Die Benutzeragenteninformationen stehen übrigens als UserAgent-Eigenschaft oder als HttpRequest-Objekt zur Verfügung.

    Entsprechend der Fähigkeit von Browsern, bestimmte Inhalte darstellen zu können, werden Browser in zwei Klassen unterteilt: "uplevel"-Browser (neuere Versionen) und "downlevel"-Browser (frühere Versionen).

    Browser und Clientgeräte, die als "uplevel" bezeichnet werden, bieten in der Regel Unterstützung für:

    • ECMAScript (JScript, JavaScript), Version 1.2.
    • HTML, Version 4.0
    • Microsoft Document Object Model (MSDOM, Microsoft-Dokumentobjektmodell).
    • Cascading Stylesheets (CSS).

    Browser und Clientgeräte, die als "Downlevel" bezeichnet werden, unterstützen nur HTML, Version 3.2

    Um die Darstellung der Seite explizit zu steuern, anstatt sich auf die automatische Browsererkennung zu verlassen, kann die ClientTarget-Eigenschaft der Seite über die vordefinierten Standardeinstellungen ie5, ie4, uplevel und downlevel festgelegt werden. Mit der Angabe des downlevel-Alias kann die Darstellung einer Seite – unabhängig von dem eingesetzten Browser – mit HTML 3.2-kompatiblen Elementen erzwungen werden. Analog erzwingt die Angabe von uplevel die Ausgabe von CSS-Formatattributen, unabhängig davon, ob der Browser, der die Seite anfordert, diese verwenden kann oder nicht.

    Ein kleines Beispiel soll dieses Konzept illustrieren. Zu diesem Zweck wurde in diesem Codebeispiel die ClientTarget-Eigenschaft in der Seitendirektive der Webseite explizit auf uplevel gesetzt ist.

    <%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" ClientTarget="uplevel" %>

     

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

     

    <html xmlns="http://www.w3.org/1999/xhtml" >

    <head runat="server">

        <title>Benutzerverwaltung</title>

    </head>

        <body>

            <form id="form1" runat="server">

                <div>

                    <asp:Label

                        ID="Label1" runat="server" Text="Benutzerverwaltung"

                        Font-Bold="False" Font-Italic="True"

                        Font-Names="Verdana" ForeColor="DarkGray"

                        Font-Size="Larger" />

                    <br />

                    <br />

                    <asp:Label

                        ID="Label2" runat="server" Text="Name:"

                        Font-Names="Verdana" ForeColor="DarkGray"

                        Font-Bold="False" Font-Size="Small" />

                    <br />

                    <asp:TextBox ID="txtName" runat="server" />

                    <asp:RequiredFieldValidator

                        ID="RequiredFieldValidator1" runat="server"

                        ControlToValidate="txtName"

                        ErrorMessage="Bitte geben Sie einen Namen ein." />

                    <br />

                    <br />

                    <asp:Button ID="btnLaden" runat="server" Text="Laden" />

                </div>

            </form>

        </body>

    </html>

    Entsprechend dieser Einstellungen rendern die ASP.NET Server Controls (<asp:Label />, <asp:TextBox />, <asp:RequiredFieldValidator />, <asp:Button ID="btnLaden" />) in dem Beispiel den Inhalt der Seite unterschiedlich.

    ClientTarget="uplevel"

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

     

    <html xmlns="http://www.w3.org/1999/xhtml" >

    <head><title>

          Benutzerverwaltung

    </title></head>

        <body>

            <form name="form1" method="post" action="Default.aspx" onsubmit="javascript:return WebForm_OnSubmit();" id="form1">

    <div>

    <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />

    <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />

    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMTQ5OTQxNDc3ZGSc409E/rebtnJIGPY4lpj9UKIcHg==" />

    </div>

     

    <script type="text/javascript">

    <!--

    var theForm = document.forms['form1'];

    if (!theForm) {

        theForm = document.form1;

    }

    function __doPostBack(eventTarget, eventArgument) {

        if (!theForm.onsubmit || (theForm.onsubmit() != false)) {

            theForm.__EVENTTARGET.value = eventTarget;

            theForm.__EVENTARGUMENT.value = eventArgument;

            theForm.submit();

        }

    }

    // -->

    </script>

     

     

    <script src="/ClientTarget/WebResource.axd?d=OF_ycAeEyoS1YxGgAoI3Fg2&amp;t=632969108944906146" type="text/javascript"></script>

     

     

    <script src="/ClientTarget/WebResource.axd?d=wFFdy1h0cE0vw88ojJditOq7o464AD3s8S-LqSeUmxk1&amp;t=632969108944906146" type="text/javascript"></script>

    <script type="text/javascript">

    <!--

    function WebForm_OnSubmit() {

    if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false;

    return true;

    }

    // -->

    </script>

     

    <div>

        <span id="Label1" style="color:DarkGray;font-family:Verdana;font-size:Larger;font-weight:normal;font-style:italic;">Benutzerverwaltung</span>

        <br />

        <br />

        <span id="Label2" style="color:DarkGray;font-family:Verdana;font-size:Small;font-weight:normal;">Name:</span>

        <br />

        <input name="txtName" type="text" id="txtName" />

        <span id="RequiredFieldValidator1" style="color:Red;visibility:hidden;">Bitte geben Sie einen Namen ein.</span>

        <br />

        <br />

        <input type="submit" name="btnLaden" value="Laden" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;btnLaden&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" id="btnLaden" />

    </div>

     

    <script type="text/javascript">

    <!--

    var Page_Validators =  new Array(document.getElementById("RequiredFieldValidator1"));

    // -->

    </script>

     

    <script type="text/javascript">

    <!--

    var RequiredFieldValidator1 = document.all ? document.all["RequiredFieldValidator1"] : document.getElementById("RequiredFieldValidator1");

    RequiredFieldValidator1.controltovalidate = "txtName";

    RequiredFieldValidator1.errormessage = "Bitte geben Sie einen Namen ein.";

    RequiredFieldValidator1.evaluationfunction = "RequiredFieldValidatorEvaluateIsValid";

    RequiredFieldValidator1.initialvalue = "";

    // -->

    </script>

     

    <div>

     

          <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAwLr3vKqCwLEhISFCwKct5SxA0qg7S78OUEVS+kzdJhDLF6zY2mx" />

    </div>

     

    <script type="text/javascript">

    <!--

    var Page_ValidationActive = false;

    if (typeof(ValidatorOnLoad) == "function") {

        ValidatorOnLoad();

    }

     

    function ValidatorOnSubmit() {

        if (Page_ValidationActive) {

            return ValidatorCommonOnSubmit();

        }

        else {

            return true;

        }

    }

    // -->

    </script>

            </form>

        </body>

    </html>

    ClientTarget="downlevel"

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

     

    <html xmlns="http://www.w3.org/1999/xhtml" >

    <head><title>

          Benutzerverwaltung

    </title></head>

        <body>

            <form name="form1" method="post" action="/ClientTarget/Default.aspx" id="form1">

    <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />

    <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />

    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMTQ5OTQxNDc3ZGSc409E/rebtnJIGPY4lpj9UKIcHg==" />

     

    <script type="text/javascript">

    <!--

    var theForm = document.forms['form1'];

    if (!theForm) {

        theForm = document.form1;

    }

    function __doPostBack(eventTarget, eventArgument) {

        if (!theForm.onsubmit || (theForm.onsubmit() != false)) {

            theForm.__EVENTTARGET.value = eventTarget;

            theForm.__EVENTARGUMENT.value = eventArgument;

            theForm.submit();

        }

    }

    // -->

    </script>

     

     

    <script src="/ClientTarget/WebResource.axd?d=OF_ycAeEyoS1YxGgAoI3Fg2&amp;t=632969108944906146" type="text/javascript"></script>

     

    <div>

        <span id="Label1"><i><font face="Verdana" color="DarkGray">Benutzerverwaltung</font></i></span>

        <br />

        <br />

        <span id="Label2"><font face="Verdana" color="DarkGray" size="3">Name:</font></span>

        <br />

        <input name="txtName" type="text" id="txtName" />

        &nbsp;

        <br />

        <br />

        <input type="submit" name="btnLaden" value="Laden" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;btnLaden&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" id="btnLaden" />

    </div>

     

    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAwLr3vKqCwLEhISFCwKct5SxA0qg7S78OUEVS+kzdJhDLF6zY2mx" /></form>

        </body>

    </html>

    Schöne Grüße

    Daniel

  • <dw:daniel_walzenbach runat="server" />

    Übungsaufgabe und Lösung zu „Get the BASICs, Visual Basic für Einsteiger und Umsteiger“, Teil 6

    • 0 Comments

    Aufgabe

    • Schreiben Sie die zwei Klassen Amateurspieler und Profispieler
    • Beide Klassen sollen ein Interface ISpieler implementieren
      • Property SpielerName
      • Property Position
      • Methode Torschiessen
    • Schreiben Sie eine Methode welche die Namen, Position und geschossenen Tooooore der Spieler ausgibt

    Lösung (1)

    Option Strict On

    Option Explicit On

     

    Module Module1

     

        Sub Main()

     

            Dim Amateur As New Amateurspieler

            Amateur.SpielerName = "Amateur XYZ"

            Amateur.Position = "Sturm"

            Amateur.Torschiessen()

     

            Dim Profi As New Profispieler

            Profi.SpielerName = "Profi ABC"

            Profi.Position = "Tor"

            Profi.Torschiessen()

            Profi.Torschiessen()

     

            Ausgabe(Amateur)

            Ausgabe(Profi)

     

        End Sub

     

        Public Sub Ausgabe(ByVal Spieler As ISpieler)

     

            Console.WriteLine(String.Format("Name des Spielers: {0}", Spieler.SpielerName))

            Console.WriteLine(String.Format("Position des Spielers: {0}", Spieler.Position))

            Console.WriteLine(String.Format("Geschossene Toooore: {0}", Spieler.AnzahlTore))

            Console.WriteLine()

            Console.WriteLine()

     

        End Sub

     

    End Module

     

    Interface ISpieler

     

        Property SpielerName() As String

        Property Position() As String

        ReadOnly Property AnzahlTore() As Integer

        Sub Torschiessen()

     

    End Interface

     

    Public Class Amateurspieler

        Implements ISpieler

     

     

        Private _Position As String

        Private _SpielerName As String

        Private _AnzahlTore As Integer

        Private _Gehalt As Double

     

     

        Public Property Position() As String Implements ISpieler.Position

            Get

                Return _Position

            End Get

            Set(ByVal value As String)

                _Position = value

            End Set

        End Property

     

        Public Property SpielerName() As String Implements ISpieler.SpielerName

            Get

                Return _SpielerName

            End Get

            Set(ByVal value As String)

                _SpielerName = value

            End Set

        End Property

     

        Public Property Gehalt() As Double

            Get

                Return _Gehalt

            End Get

            Set(ByVal value As Double)

                _Gehalt = value

            End Set

        End Property

     

        Public ReadOnly Property AnzahlTore() As Integer Implements ISpieler.AnzahlTore

            Get

                Return _AnzahlTore

            End Get

        End Property

     

     

        Public Sub Torschiessen() Implements ISpieler.Torschiessen

            _AnzahlTore += 1

            _Gehalt += 50

        End Sub

     

    End Class

     

    Public Class Profispieler

        Implements ISpieler

     

        Private _Position As String

        Private _SpielerName As String

        Private _AnzahlTore As Integer

        Private _Gehalt As Double

     

     

        Public Property Position() As String Implements ISpieler.Position

            Get

                Return _Position

            End Get

            Set(ByVal value As String)

                _Position = value

            End Set

        End Property

     

        Public Property SpielerName() As String Implements ISpieler.SpielerName

            Get

                Return _SpielerName

            End Get

            Set(ByVal value As String)

                _SpielerName = value

            End Set

        End Property

     

        Public Property Gehalt() As Double

            Get

                Return _Gehalt

            End Get

            Set(ByVal value As Double)

                _Gehalt = value

            End Set

        End Property

     

        Public ReadOnly Property AnzahlTore() As Integer Implements ISpieler.AnzahlTore

            Get

                Return _AnzahlTore

            End Get

        End Property

     

     

        Public Sub Torschiessen() Implements ISpieler.Torschiessen

            _AnzahlTore += 1

            _Gehalt += 1000

        End Sub

     

    End Class

     

    Wie in o.g. Lösung zu sehen ist stellt die Implementierung des Interfaces ISpieler in den Klassen Amateurspieler und Profispieler sicher, dass beide Klassen alle Properties und alle Methoden des Interfaces implementieren. Unschön ist jedoch, dass beide Klassen sehr viel gleichen Code beinhalten wie in dem nachfolgend skizziertem Klassendiagramm ersichtlich ist.

    Implementierung der Aufgabe mit Hilfe eines Interfaces.

    Aus diesem Grund wurden in der zweiten Lösung Teile beider Klassen in eine allgemeine Basisklasse Spieler ausgelagert. An dem neuen Klassendiagramm wird sehr schön deutlich, wie der davor doppelt vorhandene Code jetzt nur noch an einer Stelle implementiert werden muss.

    Auslagern von gemeinsam verwendetem Code in einer Basisklasse.

    Lösung (2)

    Option Strict On

    Option Explicit On

     

    Module Module1

     

        Sub Main()

     

            Dim Amateur As New Amateurspieler

            Amateur.SpielerName = "Amateur XYZ"

            Amateur.Position = "Sturm"

            Amateur.Torschiessen()

     

            Dim Profi As New Profispieler

            Profi.SpielerName = "Profi ABC"

            Profi.Position = "Tor"

            Profi.Torschiessen()

            Profi.Torschiessen()

     

            Ausgabe(Amateur)

            Ausgabe(Profi)

     

        End Sub

     

        Public Sub Ausgabe(ByVal meinSpieler As Spieler)

     

            Console.WriteLine(String.Format("Name des Spielers: {0}", meinSpieler.SpielerName))

            Console.WriteLine(String.Format("Position des Spielers: {0}", meinSpieler.Position))

            Console.WriteLine(String.Format("Geschossene Toooore: {0}", meinSpieler.AnzahlTore))

            Console.WriteLine()

            Console.WriteLine()

     

        End Sub

     

    End Module

     

    Public Class Spieler

     

        Private _Position As String

        Private _SpielerName As String

        Private _AnzahlTore As Integer

        Private _Gehalt As Double

     

     

        Public Property Position() As String

            Get

                Return _Position

            End Get

            Set(ByVal value As String)

                _Position = value

            End Set

        End Property

     

        Public Property SpielerName() As String

            Get

                Return _SpielerName

            End Get

            Set(ByVal value As String)

                _SpielerName = value

            End Set

        End Property

     

        Public Property Gehalt() As Double

            Get

                Return _Gehalt

            End Get

            Set(ByVal value As Double)

                _Gehalt = value

            End Set

        End Property

     

        Public Property AnzahlTore() As Integer

            Get

                Return _AnzahlTore

            End Get

            Set(ByVal value As Integer)

                _AnzahlTore = value

            End Set

        End Property

     

    End Class

     

    Interface ISpieler

     

        Sub Torschiessen()

     

    End Interface

     

    Public Class Amateurspieler

        Inherits Spieler

        Implements ISpieler

     

        Public Sub Torschiessen() Implements ISpieler.Torschiessen

            AnzahlTore += 1

            ' AnzahlTore = AnzahlTore + 1

            Gehalt += 50

        End Sub

     

    End Class

     

    Public Class Profispieler

        Inherits Spieler

        Implements ISpieler

     

     

        Public Sub Torschiessen() Implements ISpieler.Torschiessen

            AnzahlTore += 1

            Gehalt += 1000

        End Sub

     

    End Class

     

    P.S. Da die Frage während des Webcasts aufkam: Die Bilder wurden mit dem Klassendesigner des Visual Studios 2005 erstellt. Der Klassendesigner ist ab der Standard Version enthalten.

    Referenzen:

    Objektorientiertes Programmieren in Visual Basic
    http://msdn2.microsoft.com/de-de/library/b86b82w0(VS.80).aspx

    Class-Anweisung
    http://msdn2.microsoft.com/de-de/library/wa0hwf23(VS.80).aspx

    Vererbung in Visual Basic
    http://msdn2.microsoft.com/de-de/library/5x4yd9d5(VS.80).aspx

    Schnittstellen in Visual Basic
    http://msdn2.microsoft.com/de-de/library/28e2e18x(VS.80).aspx

    Schöne Grüße

    Daniel

  • <dw:daniel_walzenbach runat="server" />

    Beyond rational thought...

    • 0 Comments
    MSDN Solve Adventskalender 2006

    Seitdem ich bei Microsoft arbeite, wollte ich schon immer einen Artikel mit dieser Überschrift schreiben. Alleine die Tatsache hier zu arbeiten... beyond rational thought! Direkt weiter ging's mit der MGX 2006 in Orlando mit ca. 13000 Microsoft Mitarbeitern und der anschließenden TechReady 2006 in Seattle. Beyond rational thought! Direkter Zugriff auf atemberaubende Technologien (die leider zum größten Teil "internal only" sind...). Beyond rational thought! Ähnlich atemberaubende Eindrücke gab es seitdem noch zuhauf nur heute war's dann doch viel zu viel zu viel ;-)

    MSDN Solve Adventskalender 2006

    Wir haben vor einiger Zeit MSDN Solve – ein Portal welches Antworten für Entwickler gibt – online gestellt. Da inzwischen Weihnachten vor der Tür steht (wie immer überraschend! Geschenke??? Naja… der 23. ist ja ein Samstag…) dachten wir uns, eine kleine Anleitung zu veröffentlichen, wie der geneigte Entwickler seinen eigenen Adventskalender mit ASP.NET erstellen kann. Und jetzt kommt's! Beworben wird mein CodeClip, der "MSDN Solve Adventskalender 2006", derzeit auf http://www.microsoft.com/germany/default.aspx. BEYOND RATIONAL THOUGHT!

    MSDN Solve Adventskalender 2006 auf microsoft.com
     

    In diesem Sinne... Eine besinnliche Adventszeit!

  • <dw:daniel_walzenbach runat="server" />

    Übungsaufgabe und Lösung zu „Get the BASICs, Visual Basic für Einsteiger und Umsteiger“, Teil 7

    • 0 Comments

    Aufgabe:

    Implementieren Sie Fehlerbehandlung für das Programm "Kreisinhalt berechnen" aus Webcast #2

    Schreiben Sie ein Programm welches den Kreisinhalt (A) berechnet.
    A = πr²

    Verwenden Sie Console.WriteLine() und/oder Console.Write() und/oder Console.ReadLine() und System.Math.PI

    Bitte geben Sie den Radius des Kreises in cm ein: 5
    Der Kreisinhalt eines Kreises mit Radius 5cm beträgt ca. 78,5cm².

    Lösung:

    Option Strict On

    Option Explicit On

     

    Module Module1

     

        Sub Main()

     

            Dim RadiusEingabe As String

            Dim Radius As Double

     

            Dim Kreisinhalt As Double

     

            Console.Write("Bitte geben Sie den Radius des Kreises in cm ein: ")

            RadiusEingabe = Console.ReadLine()

     

            Try

                Radius = Convert.ToDouble(RadiusEingabe)

     

            Catch ex As System.FormatException

                Console.WriteLine("Es wurde keine Zahl eingegeben.")

                Return

     

            Catch ex As Exception

                Console.WriteLine("Ein unbekannter Fehler ist aufgetreten.")

                Console.WriteLine(ex.Message)

                Return

     

            End Try

     

            ' Alternative Lösungsmöglichkeit

            '

            ' If Double.TryParse(RadiusEingabe, Radius) = False Then

            '    ' es wurde ein Wert eingegeben, der nicht

            '    ' in ein Double konvertiert werden kann

     

            '    ' Fehlermeldung ausgeben

            '    Console.WriteLine("Es wurde eine ungültige Zahl eingegeben.")

     

            '    ' Programm beenden

            '    Return

     

            'End If

     

     

            ' Kreisinhalt berechnen

            Try

                Kreisinhalt = Math.PI * Math.Pow(Radius, 2)

     

                Console.WriteLine("Der Kreisinhalt eines Kreises mit " & _

                "Radius {0}cm beträgt ca. {1}cm².", Radius, Kreisinhalt)

     

            Catch ex As Exception

                Console.WriteLine("Ein unbekannter Fehler ist aufgetreten.")

                Console.WriteLine(ex.Message)

     

            End Try

     

        End Sub

     

    End Module

  • <dw:daniel_walzenbach runat="server" />

    Properties vs. Konstruktoren

    • 0 Comments

    Eine Frage, die im Zusammenhang mit der aktuellen Webcastserie "Get the BASICs, VB.NET für Einsteiger und Umsteiger" aufkam, war, wie sich Properties von Konstruktoren abgrenzen.

    Grundsätzlich dienen Properties dazu, Felder (Variablen) in einem Objekt kontrolliert setzen zu können indem sie die Ausführung von Code gestatten, wenn Eigenschaftenwerte festgelegt oder abgerufen werden.

    Mit Konstruktoren können Objekte aus Klassen instanziieren werden – sie steuern die Erstellung von Objekten. Sind diese überladen vorhanden (mehrere Konstruktoren mit unterschiedlichen Parametern) können schon bei der Instanziierung eines Objekts bestimmte Objekteigenschaften gesetzt werden.

    Zur Verdeutlichung ein kleines Beispiel:

    Option Strict On

    Option Explicit On

     

    Module Module1

     

        Sub Main()

     

            Dim Daniel As New Person("Daniel", "Walzenbach", 1976)

     

            Console.WriteLine(Daniel)

            Console.WriteLine()

     

     

            Dim Bernhard As New Person

            Bernhard.Vorname = "Bernhard"

            Bernhard.Nachname = "Frank"

            Bernhard.Geburtsjahr = 2007

     

            Console.WriteLine(Bernhard)

     

        End Sub

     

    End Module

     

    Public Class Person

     

    #Region "Variablen"

     

        Private _Nachname As String

        Private _Vorname As String

        Private _Geburtsjahr As Integer

     

    #End Region

     

    #Region "Properties"

     

        Public Property Nachname() As String

            Get

                Return _Nachname

            End Get

            Set(ByVal value As String)

                _Nachname = value

            End Set

        End Property

     

        Public Property Vorname() As String

            Get

                Return _Vorname

            End Get

            Set(ByVal value As String)

                _Vorname = value

            End Set

        End Property

     

        Public Property Geburtsjahr() As Integer

            Get

                Return _Geburtsjahr

            End Get

            Set(ByVal value As Integer)

     

                ' das Geburtsjahr überprüfen

                If value <= System.DateTime.Now.Year Then

                    ' alles ok

                    _Geburtsjahr = value

     

                Else

                    ' das Geburtsdatum darf nicht in der Zukunft liegen

                    Console.WriteLine("Das Geburtsdatum darf nicht in der Zukunft liegen.")

     

                End If

     

            End Set

        End Property

     

    #End Region

     

    #Region "Konstruktoren"

     

        Public Sub New()

     

        End Sub

     

        Public Sub New(ByVal Vorname As String, ByVal Nachname As String, ByVal Geburtsjahr As Integer)

            Me.Vorname = Vorname

            Me.Nachname = Nachname

            Me.Geburtsjahr = Geburtsjahr

        End Sub

     

    #End Region

     

    #Region "Methoden"

     

        Public Overrides Function ToString() As String

            Return String.Format("{0} {1}{2}Geburtsjahr: {3}" _

                , _Vorname, _Nachname, System.Environment.NewLine _

                , _Geburtsjahr)

        End Function

     

    #End Region

     

    End Class

    Referenzen:
    Klasseneigenschaften, Felder und Methoden
    Verwenden von Konstruktoren und Destruktoren

    Schöne Grüße

    Daniel

  • <dw:daniel_walzenbach runat="server" />

    Folien zur Serie "Get the BASICs, VB.NET für Einsteiger und Umsteiger", Teil 3, Teil 4 und Teil 5

    • 1 Comments

    Anbei o.g. Folien

    Folien VB.NET für Einsteiger und Umsteiger (Teil 3-10) - Programmausführung steuern (1.25 MB)
    Folien VB.NET für Einsteiger und Umsteiger (Teil 4-10) - Klassen und Strukturen (1.27 MB)
    Folien VB.NET für Einsteiger und Umsteiger (Teil 5-10) - Noch mehr Klassen und Strukturen (1.23 MB)

    Bis morgen zum nächsten Teil VB.NET für Einsteiger und Umsteiger (Teil 6-10) - Interfaces.

    Viele Grüße

    Daniel

  • <dw:daniel_walzenbach runat="server" />

    Folien zur Serie "Get the BASICs, VB.NET für Einsteiger und Umsteiger", Teil 8

    • 0 Comments

    Anbei die Folien

    Folien VB.NET für Einsteiger und Umsteiger (Teil 8-10) – Arrays (1.51 MB)

    Schöne Grüße von Daniel

  • <dw:daniel_walzenbach runat="server" />

    Lösung zur Übungsaufgabe „Get the BASICs, Visual Basic für Einsteiger und Umsteiger“, Teil 5

    • 0 Comments

    Aufgabe

    Schreiben Sie eine Klasse, die alle Daten einer Person verwaltet

    • Name, Vorname, PLZ, Ort, Straße, Telefon
    • Überschreiben Sie die Methode ToString für die Ausgabe der Daten
    • Implementieren Sie Eigenschaften zum Setzen der Daten
      • Schreiben Sie eine einfache Prüfroutine für die PLZ (PLZ > 0 und PLZ < 99999).

     Lösung

    Option Strict On

    Option Explicit On

     

    Module Module1

     

        Sub Main()

     

            Dim myPerson As New Person

            myPerson.Name = "Walzenbach"

            myPerson.Vorname = "Daniel"

            myPerson.Strasse = "Konrad-Zuse-Straße 1"

            myPerson.PLZ = 85716

            myPerson.Ort = "Unterschleissheim"

            myPerson.Telefon = "+49 (0) 89 - 3176 - 0"

     

            Console.WriteLine(myPerson)

     

        End Sub

     

    End Module

     

     

    Public Class Person

     

    #Region "Private Variablen"

     

        Private _Name As String

        Private _Vorname As String

        Private _Strasse As String

        Private _PLZ As Integer

        Private _Ort As String

        Private _Telefon As String

     

    #End Region

     

    #Region "Properties"

     

        Public Property Name() As String

            Get

                Return _Name

            End Get

            Set(ByVal value As String)

                _Name = value

            End Set

        End Property

     

        Public Property Vorname() As String

            Get

                Return _Vorname

            End Get

            Set(ByVal value As String)

                _Vorname = value

            End Set

        End Property

     

        Public Property Strasse() As String

            Get

                Return _Strasse

            End Get

            Set(ByVal value As String)

                _Strasse = value

            End Set

        End Property

     

        Public Property PLZ() As Integer

            Get

                Return _PLZ

            End Get

            Set(ByVal value As Integer)

                ' Überprüfen, ob die PLZ kleiner 0 gesetzt werden soll

                If value < 0 Then

                    Console.WriteLine("Die Postleitzahl darf nicht kleiner als 0 sein.")

                    Return

                End If

     

     

                ' Überprüfen, ob die PLZ größer 99999 gesetzt werden soll

                If value > 99999 Then

                    Console.WriteLine("Die Postleitzahl darf nicht größer als 99999 sein.")

                    Return

                End If

     

                ' alles ok --> PLZ setzen

                _PLZ = value

            End Set

        End Property

     

        Public Property Ort() As String

            Get

                Return _Ort

            End Get

            Set(ByVal value As String)

                _Ort = value

            End Set

        End Property

     

        Public Property Telefon() As String

            Get

                Return _Telefon

            End Get

            Set(ByVal value As String)

                _Telefon = value

            End Set

        End Property

     

    #End Region

     

    #Region "Methoden"

     

        Public Overrides Function ToString() As String

            Return String.Format("Name: {0} {1}{2}Adresse: {3}, {4} {5}{2}Telefon: {6}", _

                _Vorname, _Name, System.Environment.NewLine, _

                _Strasse, _PLZ, _Ort, _

                _Telefon)

        End Function

     

    #End Region

     

    End Class

  • <dw:daniel_walzenbach runat="server" />

    Folien zur Serie "Get the BASICs, VB.NET für Einsteiger und Umsteiger", Teil 6 und Teil 7

    • 1 Comments

    Anbei die Folien

    Folien VB.NET für Einsteiger und Umsteiger (Teil 6-10) - Interfaces (0.99 MB)
    Folien VB.NET für Einsteiger und Umsteiger (Teil 7-10) - Strukturierte Ausnahmebehandlung (1.15 MB)

    Bis bald!

  • <dw:daniel_walzenbach runat="server" />

    December CTP of “WPF/E” is public available

    • 0 Comments

    On December 4th, 2006 Microsoft announced the public availability of the December CTP of "WPF/E" (Codename). First announced at Microsoft's Professional Developer's Conference (PDC) in late 2005, "WPF/E" is a cross platform presentation technology for rich web applications, that uses a subset of the XAML (eXtensible Application Markup Language). It enables the creation of rich, visually stunning interactive web content running on multiple browsers, and operating systems (Windows and Mac), and beyond.

    Key benefits for content providers delivering content with "WPF/E" will include:

    • Rich, interactive media support including interactive 2D animation, vector graphics, & font support with video, downloaded or streamed.
    • Enhanced Web audio/video playback with industry-leading Windows Media including support for interactive video overlays and ad insertion.
    • Cross-platform, cross-browser presentation for Windows and Mac, IE, Firefox, Safari and beyond.
    • ASP.NET AJAX + "WPF/E" means developers can use web-standards friendly tools to create experiences that are more discoverable by major search engines than compiled, "black box" solutions.
    • Friction free client install with a lightweight browser plug-in (CTP release for Windows is ~1MB).
    • Lower-cost deployment and distribution of streamed audio and video when compared to other comparable solutions (up to 50% today reported by CDNs).
    • Broad tools support for designers, developers, and video professionals, that tap into Web standards and a breadth of Microsoft application platform features:
      • For designers, Expression Blend, for visually creating Web-based controls, components, and
      • For developers, Visual Studio-based editing with IntelliSense, and support for ASP.NET AJAX.
      • For both, Expression Web, for Web-standards-based development with HTML, XML, XSLT, and more.
      • Expression Media Encoder, a feature of Expression Media for import, enhancement, and publishing of "WPF/E" optimized video.

    This being our first CTP for "WPF/E" we have a lot of information to share with you. Below are the key links to "WPF/e" content:

    MSDN: http://msdn2.microsoft.com/en-us/asp.net/bb187358.aspx

    Channel9: http://channel9.msdn.com/playground/wpfe/

    SDK Download: http://www.microsoft.com/downloads/details.aspx?FamilyId=2B01EC7E-C3B8-47CC-B12A-67C30191C3AA&displaylang=en

    Samples Download: http://www.microsoft.com/downloads/details.aspx?FamilyId=8AEEBE39-6699-4F4F-9732-CA732E57AE21&displaylang=en

    "WPF/E" (codename) CTP (December 2006) SDK Samples

    Page Turn Media

    The Page Turn sample shows how "WPF/E" uses XAML to create a compelling presentation of images. It also shows an additional navigation element that allows users to quickly jump to a specific image.

    Media Library

    This example uses a real world scenario of a video site. The sample is rendering a progressive download video feed from Channel 9 and uses ASP.NET AJAX to improve the interaction parameters of this sample (watch how back button works). Notice how resize works as the underlying presentation player (XAML) is vector-based.

    Sprawl Game

    "WPF/E" is perfect for creating casual games. This sample shows a typical casual game. All the elements of this game were created using the Microsoft Expression suite.

    Simple Video Playback

    The simple video playback samples provide the essentials you need for showing video playback on your site. The minimalist control uses an efficient design that hides the control when it is not needed using subtle animations.

    Film Strip Slideshow

    Learn the value proposition of "WPF/E" while viewing a "WPF/E" sample. This example uses animation to implement a slide show style presentation.

    Cheers

    Daniel

  • <dw:daniel_walzenbach runat="server" />

    Gegen die Langweile: Ein paar neue MSDN Artikel

    • 0 Comments

    Passend zu den immer kürzer werdenden Tage ein paar interessante Artikel…

    Windows Vista Application Development Requirements for User Account Control Compatibility
    Author: Jennifer Allen and the User Account Control team
    Publishing Date: 11/13/2006 

    Getting started with "WPF/E" (Code Name)
    Author: lmoroney; barakc
    Publishing Date: 12/04/2006
    http://msdn2.microsoft.com/en-us/library/bb190632.aspx

    CLR Inside Out: Inside Diagnostic Tools for .NET
    Author: Jonathan Keljo
    Publishing Date: 11/22/2006
    http://msdn.microsoft.com/msdnmag/issues/06/12/CLRInsideOut/

    Data access; Database design; Performance
    Optimizing Microsoft Office Access Applications Linked to SQL Server
    Author: Andy Baron
    Publishing Date: 11/30/2006
    http://msdn2.microsoft.com/en-us/library/bb188204.aspx

    Extend ASP.NET: Simplify Data Binding In ASP.NET 2.0 With Our Custom Control
    Author: Rick Strahl
    Publishing Date: 11/22/2006
    http://msdn.microsoft.com/msdnmag/issues/06/12/ExtendASPNET/

    Cutting Edge: The Client Side of ASP.NET Pages
    Author: Dino Esposito
    Publishing Date: 11/22/2006
    http://msdn.microsoft.com/msdnmag/issues/06/12/Cutting%20Edge/

    Schöne Grüße

    Daniel

  • <dw:daniel_walzenbach runat="server" />

    Übungsaufgabe zu „Get the BASICs, Visual Basic für Einsteiger und Umsteiger“, Teil 8

    • 0 Comments

    Berechnen Sie die Wurzeln von 1 bis n in einer for Schleife

    • n soll von dem Anwender frei eingegeben werden
    • Speichern Sie die Wurzeln in einem Array der richtigen Größe
    • Bilden Sie den Mittelwert aller Wurzeln in dem Array
      • Implementieren Sie Ausnahmebehandlung um potentielle Fehler abzufangen
    • Geben Sie alle Wurzeln und deren Mittelwert aus

    Viel Erfolg! Daniel

  • <dw:daniel_walzenbach runat="server" />

    Fragen und Antworten zum fünften Webcast "Get the BASICs, VB.NET für Einsteiger und Umsteiger"

    • 0 Comments
    Q: Soll man aus Geschwindigkeitsgründen einen Parameter ByRef übergeben (da dann kein Kopieren erforderlich ist), obwohl man ihn nicht ändern möchte, oder ist das schlechter Programmierstil?
    A: Sie sollten einen Parameter NUR dann als ByRef übergeben, wenn Sie auf eine Variable innerhalb einer Methode Einfluss nehmen möchten und den geänderten Wert an die aufrufende Methode zurückgeben möchten.
    Die genannte Methode würde ich aus mehreren Gründen nicht empfehlen. Allgemein könnte ich nicht sagen, dass es generell schneller ist Werte ByRef statt ByVal zu übergeben da Referenztypen ohnehin nur ByRef übergeben werden (Siehe in diesem Zusammenhang Argument Passing ByVal and ByRef) und Wertetypen sich auf dem Stack befinden uns somit aller Wahrscheinlichkeit irgendwo im L1 oder L2 Cache. Argumentieren könnte man, dass es bei großen Strukturen schneller sein könnte, diese ByRef zu übergeben. In diesem Fall würde ich allerdings zuerst die Architektur der Anwendung überdenken um sicherzugehen, dass dieser Fall wirklich notwendig ist.
    Entscheidend ist meiner Meinung allerdings, dass Sie sich eine potentielle Fehlerquelle in Ihrem Programm einhandeln.
     
    Q: Sie hatten im Laufe der ersten Demo h1 und h2 (Hunde) definiert. Einmal "as new hund" einmal nicht. Warum? Mir ist nicht klar, wann ich das Schlüsselwort "new" verwenden soll, obwohl ich doch "zwei Sandförmchen backe...".
    A: Das erste Mal (Dim h1 As New Hund) wollte ich eine Instanz der Klasse Hund erstellen. Das zweite Mal (Dim h2 As Hund) ging es mir nur darum eine Variable (einen Platzhalter sozusagen) vom Typ Hund zu erstellen, der ich später eine Instanz vom Typ Hund zuweisen konnte (h2 = h1).
     
    Q: Ist es richtig, dass z.B. bei dem Beispiel "Hund" nur dann zwei unterschiedliche Objekte erzeugt werden, wenn BEIDE Objekte mit New instanziiert werden?
    A: Ja, absolut.
     
    Q: Die Präsentation kann derzeit leider nicht als PDF gespeichert werden. Kann man diese in einer E-Mail zugestellt bekommen?
    A:

    Die Folien können hier heruntergeladen werden.

     
    Schöne Grüße und bis zum fünften Teil!
  • <dw:daniel_walzenbach runat="server" />

    Übungsaufgabe zu „Get the BASICs, Visual Basic für Einsteiger und Umsteiger“, Teil 5

    • 0 Comments

    Aufgabe

    Schreiben Sie eine Klasse, die alle Daten einer Person verwaltet

    • Name, Vorname, PLZ, Ort, Straße, Telefon
    • Überschreiben Sie die Methode ToString für die Ausgabe der Daten
    • Implementieren Sie Eigenschaften zum Setzen der Daten
      • Schreiben Sie eine einfache Prüfroutine für die PLZ (PLZ > 0 und PLZ < 99999).

    Die Lösung gibt's im sechsten Teil "Get the BASICs, Visual Basic für Einsteiger und Umsteiger – Interfaces" am 04.12.2006, 16:00-17:00 Uhr.

    Bis bald!

    Daniel

  • <dw:daniel_walzenbach runat="server" />

    TechTalk „Vista für Developer“…

    • 0 Comments

    …oder die Reise durch Deutschland.

    TechTalk Tour "Vista für Developer" 

    Mein Kollege Oliver Scheer und ich touren Januar 2007 einmal quer durch Deutschland und sprechen über die neuen Features und Funktionalitäten von Windows Vista aus der Sicht des Entwicklers. Mit auf der Agenda stehen beispielsweise das .NET Framework 3.0, Glass, User Account Control (UAC), neue Features im Powermanagement und noch vieles mehr. Den Auftakt unserer Reise bildet Hamburg am 11.01.2007, die letzte Veranstaltung findet am 30.01.2007 in Dresden statt.

    Weitere Infos sowie die übrigen Termine gibt es auf der MSDN TechTalk Seite. Am besten gleich anmelden. Die ersten Veranstaltungsorte sind schon ausgebucht ;-)

    Bis dann. Daniel

Page 1 of 1 (16 items)