Laptop oder Tablet? Erkennen und richtig Handeln!

Durch Windows 8 ist eine ganz neue Form von „mobilen“ Anwendungen auf den Markt gekommen. Die Windows 8 Apps. Ebenso kamen Systeme dazu, die sowohl Tablet als auch Laptop sind und ebenso welche, die beides sein und sich zur Laufzeit ändern können. Passend dazu kamen auch relativ zeitnah die ersten Anwendungen, die auf dieses Verhalten entsprechend reagieren und sich mit jeweils einer anderen angepassten Oberfläche zur Schau stellen.

Die hierfür notwendige API gibt es leider bei Intel nur für C++. Aber mithilfe von P/Invoke kann dies auch ganz einfach mit C# und WPF verwendet werden.

Weiterlesen

Netz- und Broadcast IP-Adresse finden leicht gemacht

Nachdem nun einige Monate keine neuen Beiträge kamen, habe ich nun endlich wieder etwas Zeit, um hier einen neuen Beitrag zu veröffentlichen. Diesmal beschäftigen wir uns mit dem einfachen Finden von Netz- sowie Broadcast IP-Adressen in einem Netzwerk. Auch wenn dies sehr simpel ist, benötigt es einige Aktionen auf Bit-Ebene, um das Problem zu lösen. Damit hier eine sichere Funktionalität gewährleistet ist, möchte ich darauf hinweisen, dass die Größe der Datentypen hierbei sehr entscheidend sein kann. Kommen wir nun zum Sourcecode.  Weiterlesen

Wusstet ihr schon… Enumerationen?

Enumerationen oder auch Aufzählungen sind für den Computer nicht mehr und nicht weniger als Integer-Typen. Jede Aufzählung (außer jene, bei welchen man dies verändert hat) lässt sich zum Integer wandeln und jeder Integer kann zu einer Aufzählung gewandelt werden (für letzteres gelten allerdings einige Einschränkungen, da die  Zahl in der Aufzählung präsent sein muss). Darum kann auch jedem Eintrag in einer Aufzählung eine Ganzzahl zugewiesen werden (in der Regel verwendet man hier die 2er-Potenzen um so mittels „Flag“-Attribut „oder“, „und“ „exklusiv oder“ und die anderen Bit-Operatoren verwenden kann).  Weiterlesen

Einfaches Model-View-ViewModel nutzen unter WPF/C#

Inzwischen gibt es einige Frameworks für MVVM, besonders in Verbindung mit WPF und C#. Besonders einfach möglich ist dies mittels Cinch, welches wiederum MEFedMVVM nutzt. Die Links zu diesen beiden Projekten befinden sich am Ende dieses Posts. Diese Frameworks sind zum Einen kostenlos nutzbar und zum Anderen sehr gut dokumentiert. Außerdem steht eine entsprechend große Community hinter diesen Frameworks, die bei Fragen sehr gut unterstützt (natürlich sollte man hier am Besten Englisch beherrschen, aber dies ist in der Softwareentwicklung so oder so Grundvoraussetzung). Aber was genau sind dies für Frameworks?  Weiterlesen

Typenwandlung in C#

Um einen Typen in einen anderen zu verwandeln, gibt es in C# mehrere Wege. Zum einen gibt es das typische „Casten“, zum anderen das „Safty Casten“ und dann noch die „Convert“-Klasse. Beginnen wir mit der „Convert“-Klasse, da diese sich ein wenig von den anderen unterscheidet. Diese bietet uns statische Methoden wie „ToInt32“, um z.B. einen String in einen Integer zu wandeln. Allerdings stehen hier nur die .NET Standard-Datentypen wie Byte, Short, Integer, Long, Float, Double, Decimal, Character und String jeweils Signed und Unsigned (zumindest die Ganzzahlen) zur Verfügung. Sollte hier eine Wandlung nicht möglich sein, wird eine Ausnahme ausgelöst.

Zusätzlich gibt es auch noch das typische „Casten“, welches in nahezu jeder objektorientierten Programmiersprache möglich ist. Auch hierbei wird eine Ausnahme ausgelöst, wenn die Typenwandlung nicht möglich ist. Zusätzlich gibt es im .NET über das „as“-Keyword noch das „Safty Casten“. Dies erledigt die Typenwandlung und im Falle des unmöglichen, wird keine Ausnahme ausgelöst, sondern der Standardwert des Zieltypen hergestellt. Bedingt durch das nicht auslösen der Ausnahme empfehle ich diese Art der Typenwandlung zu vermeiden, denn es sorgt dafür, dass Fehler länger gesucht werden müssen als nötig.

Visual Studio 2013: Der Stand der C++-Unterstützung

Kurzmitteilung

Microsoft wurde in der Vergangenheit immer wieder dafür kritisiert, die Sprach-Features neuerer C/C++-Standards nur zögerlich zu unterstützen. Insbesondere die Unterstützung von C99 und C++98 ist hier zu nennen, die bis heute nicht vollständig umgesetzt wurden und angesichts der Priorisierung auf C++11 und den Nachfolger C++14 weiterhin offen bleiben wird. Beim vor knapp zwei Jahren freigegebenen C++11 sieht es zumindest danach aus, dass das für Ende des Jahres angekündigte Visual Studio 2013 die wichtigsten Features des derzeit aktuellen Sprachstandards unterstützen wird.

Auf der BUILD-Konferenz war angekündigt worden, dass die nun freigegebene Preview der Entwicklungsumgebung die meisten neuen Sprachfunktionen implementiere. Andere Compiler-Infrastrukturen wie GCC und LLVM können auch erst seit kurzem mit sämtlichen Features von C++11 umgehen. Bis man bei Microsoft so weit ist, mag noch etwas dauern, zumindest gibt es für einen etwaigen Zeitpunkt keine konkreten Informationen. Weiterlesen

Zeilenumbrüche in Strings

Zeilenumbrüche in Strings lassen sich auf vielen Wegen erzeugen. Oftmals wird hierfür einfach ‚\n‘ dem String angefügt. Ist dies jedoch wirklich der beste Weg? Ich würde darauf mit nein antworten. C# bzw. das .NET-Framework sieht für Zeilenumbrüche eine bessere Variante vor. Und zwar folgende:

Environment.NewLine;

Hierbei wird sichergestellt, dass im aktuellen Kontext das für den jeweiligen Kontext relevante eingefügt wird, um den Umbruch zu erzeugen.

Mails vom Programm versenden

In der heutigen Zeit gewinnen E-Mail’s gegenüber Briefen immer mehr an Bedeutung. Auch kann man diese wirklich gut für Bugreports verwenden. Aber wie könnte es anders sein, als dass uns das .NET-Framework auch hierfür entsprechende Methoden bereitstellt. Kommen wir zunächst zum Sourcecode, bevor ich erläutere welcher Parameter durch was zu ersetzen ist.

MailMessage mail = new MailMessage
	{
		From = new MailAddress("report@mailhoster.de", "Report Benutzer"),
		Subject = "Der Betreff der e-Mail",
		Body = "Dies ist der Inhalt der e-Mail <b>sogar mit HTML</b>.", 
		IsBodyHtml = true
	};

mail.To.Add(new MailAddress("test@mailhoster.de", "Test Benutzer"));

SmtpClient mailClient = new SmtpClient("smtp.mailhoster.de", 25)
	{
		Credentials = new NetworkCredential("report", "passwort")
	};

mailClient.Send(mail);

Weiterlesen

Ein eigener „Mini“-Downloadmanager

Hin und wieder kommt es vor, dass eine Anwendung Dateien aus dem Internet herunterladen muss. Oftmals soll hierfür auch eine Fortschrittsanzeige dargestellt werden, z.B. bei einer eigenen Update-Routine. Schön wäre es doch, wenn der Download gestartet wird, noch während man die Dateien für ein etwaiges Update zusammen sucht. Oder etwa nicht? Auch schön wäre es, wenn wir den Fortschritt des aktuellen Downloads erfahren könnten und wenn das Ganze anschließend auch noch sauber asynchron ausgeführt wird. Mithilfe der Klassen „WebClient“ und „Queue<T>“ können wir dies auch mit Leichtigkeit realisieren. Da ich den Quellcode bereits soweit vorbereitet habe, sehen wir uns das Ganze erst einmal an.

public class DownloadManager
{
    private readonly string _downloadDirectory;
    private bool _shouldAbort;

    private readonly Queue<string> _queue;
    private readonly WebClient _client;

    public double ProgressOfCurrentFile { get; private set; }

    public DownloadManager()
        : this(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads"))
    { }

    public DownloadManager(string downloadDirectory)
    {
        _downloadDirectory = downloadDirectory;

        _queue = new Queue<string>();
        _client = new WebClient();

        _client.DownloadProgressChanged += (sender, args) => ProgressOfCurrentFile = args.ProgressPercentage;
    }

    public void Enqueue(string file)
    {
        _queue.Enqueue(file);
    }

    public void Abort()
    {
        _shouldAbort = true;
        _queue.Clear();
    }

    public void DownloadFiles()
    {
        Task result = DownloadFilesAsync();
        result.Wait();
    }

    public async Task DownloadFilesAsync()
    {
        _shouldAbort = false;
        if (!Directory.Exists(_downloadDirectory))
            Directory.CreateDirectory(_downloadDirectory);

        while (_queue.Count > 0 && !_shouldAbort)
        {
            string path = _queue.Dequeue();
            string filename = path.Split(new[] {'/', '\\'}).Last();

            await Task.Run(() => _client.DownloadFile(new Uri(path), _downloadDirectory + "\\" + filename));
        }
    }
}

Was haben wir hier nun? Zwei Konstruktoren, der eine ohne Parameter nutzt als Ziel für die Downloads den Benutzer-Download-Ordner, während der andere einen frei angegebenen Pfad nutzt. Zusätzlich haben wir eine Methode um Dateien dem Download hinzuzufügen, sowie eine Methode um das Ganze abzubrechen (aktuell würde diese nur zwischen Downloads abbrechen aber keine aktiven Downloads!). Und zu guter Letzt natürlich noch unsere beiden eigentlichen Download-Methoden, die eine synchron, die andere ssynchron, wobei in diesem Fall die synchrone die asynchrone nutzt und einfach auf dessen ending wartet.

Ein eigener Datentyp (Teil 6)

Im letzten Teil (siehe: Ein eigener Datentyp (Teil 5)) haben wir uns um die Konvertierung aus Standard-Datentypen gekümmert. In diesem Teil soll es nun um die überschriebenen Methoden der Basisklasse – Object – gehen. Hier müssen wir die Implementierung für drei Methoden vornehmen, „Equals(object)“, „GetHashCode()“ sowie „ToString()“. Beginnen wir mit der „Equals“-Methode. Diese ist eigentlich auch schon die „komplizierteste“ der drei genannten. Hier würde ich die folgende Implementierung vorschlagen:

public override bool Equals(object obj)
{
    return ((obj is Int24) && (Value == ((Int24)obj).Value)) || ((obj is int) && (Value == (int)obj));
}

Weiterlesen