.NET Blog   ·   .NET Casts   ·   .NET GUI Foren   ·   .NET BlogBook   ·   WPF Blogger   ·   visual studio one   ·   ASP.NET professional

  • ACHTUNG - NEUES BLOG

    Ab sofort steht unter http://devtyr.norberteder.com mein neues Blog zur Verfügung. Dieses Blog wird nicht weiter betreut, bleibt aber erhalten. Neue Eintr%auml;ge erfolgen nur mehr im neuen Blog. Kommentare werden ebenfalls nicht mehr behandelt. Wer weiterhin meinen Einträgen und Aktivitäten folgen möchte, möge bitte RSS-Feeds, Verlinkungen etc. an die neue Location anpassen.
Download .NET Essentials Installer
Trickkiste

Community: Neue Kategorie und neues Glengamoi

09.03.06 - Community
Beitrag von Norbert Eder
 Zum einen habe ich heute die Neue Kategorie Community eingeführt, in der Themen/Informationen aus eben diesem Gebiet aufgegriffen werden.

Weiters hat sich Glengamoi weiterentwicklet und geht nun mit einem Forum ins Rennen. Die altbekannten Mailinglisten wird es (so sieht es aus) weiterhin geben.

Vielleicht liest man sich ja das eine oder andere Mal ;-)

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


C# Beginner: UserControl DoubleTrackBar Beispiel

04.03.06 - .NET, WPF
Beitrag von Norbert Eder
 Deisem Eintrag liegt ein Beispiel bei, welches zeigt, wie ein einfaches DoubleTrackBar-Control erstellt werden kann.

Mit Hilfe dieses Controls können mit zwei Schieberegler ein Minimum-Wert und ein Maximum-Wert eingestellt werden. Eigentlich ein recht simples Problem, jedoch nicht für C# Programmierer, die in Themen wie GDI+, UserControls wenig Erfahrung haben.

Der folgende Screenshot zeigt das Aussehen des UserControls in einer kleinen Testanwendung:



Zusätzliche Funktionalitäten sollten sich recht einfach einfügen lassen.

Anforderungen: .NET 2.0 für die Solution. Sourcecode auch unter .NET 1.1 nutzbar

Download

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Tools: DotLucene - Fulltext Search Engine for .NET

03.03.06 - 3rd Party Tools
Beitrag von Norbert Eder
 Wer für diverse Anwendungsfälle eine kostengünstige und vor allem schnell Volltextsuche benötigt, der sollte sich auf jeden Fall DotLucene genauer ansehen.

Hinter diesem Open-Source-Projekt verbirgt sich eine vielversprechende Lösung für dieses Thema.

Ein kurzer Auszug aus der Featureliste:
- Gute Performance
- Ranking
- Hervorhebung der Suchbegriffe in den Ergebnissen
- Suche nach Metadaten
- Speicherung von vollindizierten Dokumenten

Durch die Benutzung der Online Demo kann man sich von der Geschwindigkeit und von einigen Features überzeugen.

Im gleichen Atemzug kann man sich auch den - auf der Seite von DotLucene vorgeschlagenen - Indexing Server Seek a File ansehen. Der Server läuft als Windows Dienst und kann folgende und weitere Dateitypen indizieren:

- DOC
- PDF
- XLS
- PPT
- RTF
- HTML
- TXT
- XML

Ein Blick auf diese Tools sollte sich als durchaus lohnen.

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


C#-Beginner: Exception-Handling unter C#

02.03.06 - .NET, Base Framework
Beitrag von Norbert Eder
 Das Thema Exception-Behandlung scheint bei vielen .NET Programmierern noch nicht richtig angekommen zu sein. Immer wieder finden sich in diversen Beispielen und Fragen traurige Konstrukte, die hauptsächlich negative Erscheinungen zu Tage fördern. Also Beispiel sei hier ein neulich gesichteter Code gezeigt werden (nicht kopieren!!!!!):


try
{
StreamReader sr = new StreamReader("path");
string text = sr.ReadToEnd();
sr.Close();
}
catch (Exception ex) {}


Das Ergebnis? Nun, ist die Datei nicht vorhanden wird eine Exception geworfen und auch abgefangen, aber es passiert damit nichts. Es erfolgt weder eine Meldung an den User, noch ein Log-Eintrag, um etwaige Fehler zu einem späteren Zeitpunkt nachvollziehen zu können. Ein weiterer Effekt ist, dass beim "Testen" durch den Entwickler "alles funktioniert" - was natürlich nicht stimmt.

Nun gut, aber wie soll das Exception Handling dann wirklich umgesetzt werden? Ganz einfach. Der grundlegende try-catch-Block sieht so aus:


try {
// Implementierung
} catch (IOException ex) {
// Fehlerbehandlung für IO-Fehler
} catch (Exception ex) {
// Fehlerbehandlung für andere Fehler
} finally {
// Abschlussarbeiten
}


Hier noch eine genaue Beschreibung:

try: Im try-Teil des gesamten Blockes erfolgt die Implementierung der tatsächlichen Funktion.

catch: Hier ist die Fehlerbehandlung zu implementieren. Dies kann realisiert werden, indem die Fehlermeldungen bzw. zusätzliche Einträge in eine Log-Datei geschrieben werden oder eine User-Interaktion verlangt wird. Wie oben gezeigt, können mehrere Exceptions gezielt abgefangen und behandelt werden. In der MSDN finden sich zu allen Methoden auch Angaben darüber, welche Exceptions geworfen werden. Prinzipiell ist mit diesen Exceptions zu arbeiten und nicht direkt mit Exception selbst.

finally: Dieser Teil des Blockes wird in jedem Fall ausgeführt, also sowohl nach erfolgreichem Durchlauf des try-Teiles, als auch im Falle eines Fehlers. Dadurch bietet es sich an, im finally-Block Aufräumarbeiten durchzuführen. Dies kann beispielsweise das Schließen einer Datenbank-Verbindung sein.

Beim catch-Block muss nicht zwingend ein Typ angegeben werden. Ist dies nicht der Fall, dann werden sämtliche Exceptions behandelt. Von dieser Schreibweise würde ich jedoch eher abraten:


try {

} catch {

}


Des weiteren sollten Exception nicht für die Ablaufsteuerung einer Anwendung verwendet werden. Darunter wird verstanden, dass gezielt auf Exceptions abgefragt wird, um aufgrund des Exception-Typs zu entscheiden, welcher weitere Code anschließend ausgeführt wird. Exceptions sind sehr "teuer". Dies bedeutet, dass dadurch viele Ressourcen verbraucht werden. Daher sind Exceptions auch als solche zu behandeln.

Natürlich besteht auch die Möglichkeit eigene Exceptions zu implementieren. Dies macht vor allem bei der Entwicklung von größeren Frameworks (die auch von anderen Entwicklern benutzt werden) Sinn. Folgendes Beispiel soll eine eigene Exception verdeutlichen:


using System;
class MyException : ApplicationException
{
public MyException(string str)
{
Console.WriteLine(str);
}
}


Wie zu erkennen ist, ist von der Basisklasse ApplicationException abzuleiten. Der Konstruktor erhält einen Parameter und damit ist die einfachste Variante einer benutzerdefinierten Exception fertig. Weitere Möglichkeiten können aus der MSDN bezogen werden.

Zum Schluss möchte ich noch kurz ansprechen, wie der Programmierer selbst Exceptions werfen kann. Dies wird mittels des Schlüsselwortes throw getan:


throw new MyException("Eine benutzerdefinierte Exception ist aufgetreten");


Eine so geworfene Exception muss natürlich auch entsprechend behandelt werden.

Referenzen und weiterführende Artikel:
[1] Exception Management Architecture Guide
[2] Exception Class

  3 Kommentare - 1662 mal angesehen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


www.norberteder.com wieder online

26.02.06 - Blog-Intern
Beitrag von Norbert Eder
 Seit heute ist meine Website www.norberteder.com wieder online. Die Seite war ja in den letzten Monaten durch einen Serverausfall down.

In den letzten Tagen habe ich etwas Zeit gefunden, um die Seite in einem neuen Design online zu stellen. Der komplette Content ist noch nicht online, wird jedoch in den nächsten Tagen nachgezogen.

  Kommentar hinzufügen - 3 mal angesehen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


C# Beginner: Beispiel für den Aufbau eines Strategie-Spieles

24.02.06 - .NET, WPF
Beitrag von Norbert Eder
 In diversen Foren wird oft nachgefragt, wie denn man denn ein Strategiespiel angehen könnte. Im Vordergrund stehen dabei keine Probleme á la Pathfinding, sondern bereits das Aufbauen des Spielfeldes bereitet oft Probleme.

Daher habe ich aus Lust und Laune eine kleine Demo erstellt, aus der man diverse Ansätze herauslesen kann.

Das Aussehen der Demo hatte hierbei keinen Vorrang und kommt daher mit folgender Oberfläche daher:



Nun zur Erklärung einige Punkte:

Darstellungsfläche stellt in diesem Beispiel ein ganz normales Panel dar, welches lediglich zum besseren Erkennen eingefärbt wurde. Wird nun der Button Generate Matrix betätigt, wird quasi eine Matrix auf die Spielfläche gelegt. Diese wird automatisch berechnet und kann durch den Parameter Length gesteuert werden. Dieser gibt die Seitenlänge des Quadrates an.

Der Button Add Building dient dazu, ein Building anzulegen. Es ist so vorzugehen, dass der Button zu klicken ist, danach ist auf eine beliebige Stelle des Panels zu klicken. Ist der Platz noch nicht belegt, wird das Gebäude auf diesem Feld "gebaut", andernfalls erscheint die entsprechende Meldung.

Dies ist im Endeffekt auch schon die gesamte Funktionalität dieser Demo. Trotz der Kürze der Entwicklungszeit habe ich dennoch versucht, dies möglichst einfach und erweiterbar zu gestalten, so dass aufgrund dieser "Vorlage" recht schnell unterschiedliche Bauten etc. eingefügt werden können.

Vorstellbar wären sicherlich noch Dinge wie Wiesen, Personen und auch Gebäude, die nicht auf ein Feld beschränkt sind. Ebenfalls müsste noch ein Pathfinding-Algorithmus implementiert werden und danach wäre eine erste spielbare Demo fast fertig.

Sollte ich Zeit finden werden noch die einen oder anderen Erweiterungen in diese Demo fließen, aber grundlegend sollte eine Basis für simple Strategie-Spiele vorhanden sein.

Hier noch das Demoprojekt inkl. Sourcecode: MatrixTestGame

  Kommentar hinzufügen - 3 mal angesehen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Patent: Webapplikationen, AJAX, Flash etc.

23.02.06 - Internet
Beitrag von Norbert Eder
 So wie es aussieht gibt es wohl ein Patent welches Webapplikationen die AJAX, Flash, etc. verwenden zugrunde liegt.

Nähere Informationen liefert golem.de.

Vielleicht muss man ja auch bald Lizenzgebühren bezahlen, wenn man die eigene sanitäre Einrichtung benutzen möchte.

Schön langsam reicht's dann ...

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


.NET User Group Styria Treffen

21.02.06 - Internet, Community
Beitrag von Norbert Eder
 Heute ist es wieder soweit, das nächste Treffen der .NET User Group Styria steht an. Zu bewundern gibt es heute den Vortrag von Max Hauser zum Thema SQL Server 2005 Reporting Services.

Die Verstaltung findet heute um 17:30 Uhr im Campus02 (Hörsaal C 203) der WIFI Steiermark statt.

Da ich beim letzten Treffen leider krankheitsbedingt verhindert war, freue ich mich heute umso mehr darauf.

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


C#: Google Web API schon getestet?

16.02.06 - .NET, Allerlei
Beitrag von Norbert Eder
 Nein? Dann wird's - wie bei mir - nun absolut höchste Zeit.

Als ersten Schritt muss man sich die Google API unter http://www.google.com/apis/ downloaden und sich einen Account erstellen. Nach dem Account bekommt man eine Google ID zugesendet, mit der 1000 Requests pro Tag durchgeführt werden können.

Nun, als nächsten Schritt einfach ein neues Projekt im Visual Studio erstellen. Nun eine Web-Referenz auf http://api.google.com/GoogleSearch.wsdl erstellen und dem Teil am besten den Namen Google geben. Nun ist das wildeste erledigt.

Eine Abfrage sieht dann in weiterer Folge so aus:


Google.GoogleSearchResult r = s.doGoogleSearch(googleID, keywords,
0, 10, false, "", false, "", "", "");
int estResults = r.estimatedTotalResultsCount;

Google.ResultElement[] elements = r.resultElements;


Damit lässt sich dann schon etwas machen. Und beispielsweise könnte eine sehr einfach Abfrage-Anwendung so aussehen:



  3 Kommentare - 1795 mal angesehen   |  0 Trackbacks   |  Permalink  |  Trackback-URL


Unit-Tests und Aufwand

16.02.06 - Entwicklung, Software Testing
Beitrag von Norbert Eder
 Danke für die vielen Rückmeldungen, die ich vor allem in Form von Emails erhalten habe. Dabei stand fast immer die Frage nach dem Aufwand im Vordergrund.

Zu diesem Thema kann ich folgendes sagen/behaupten:

Natürlich verursacht das Erstellen von Unit-Tests einen entsprechenden Aufwand, da jede Methode in allen erdenklichen Varianten getestet werden soll. Sinnvollerweise wird der Unit-Tests parallel zur zu testenden Klasse entwickelt. Dadurch erhöht sich zwar der Aufwand für die Entwicklung von Klassen, man bedenke aber das große ABER:

Durch die ständigen Test-Durchläufe kristallisieren sich sehr schnell Fehler heraus bzw. wo es nach einer durchgeführten Änderung ein wenig zwickt. Sollte dann doch einmal ein Fehler durchrutschen, kann mit Hilfe der Unit-Tests dieser recht schnell nachvollzogen bzw. überhaupt gefunden werden. Das erspart sehr viel Zeit. Vermutlich mehr, als man sich durch das Nichtschreiben von Unit-Tests sparen würde.

Jeder Leser kann sich nun selbst ein Bild davon machen. Einfach die durchschnittliche Anzahl der Bugs heranziehen und kurz darüber nachdenken, wie schwer so manche davon zu finden sind. Viele davon wären mit Unit-Tests erst gar nicht zustande gekommen.

Ich hoffe dieser Beitrag regt zum Nachdenken und Nachrechnen an und liefert so für jeden von Euch ein Ergebnis bezgl. der Sinnhaftigkeit von Unit-Tests.

  Kommentar hinzufügen   |  0 Trackbacks   |  Permalink  |  Trackback-URL



Zurück Weiter