
Den ersten Teil der ASP.NET MVC User Group Tour habe ich nun hinter mich gebracht.
Ich war in
- Karlsruhe
- Ulm
- Konstanz
- Ingolstadt
- Nürnberg
Hier nun wie versprochen der erweiterte Quelltext des Beispiels welches ich Live entwickelt habe. Der Quelltext wurde erweitert, umgebaut, verbessert usw. usf.
Zum Download: MvcUserGroupTourJuni2009.zip
Die nächsten geplanten Orte sind
Sobald die Termine genau feststehen könnt Ihr diese auf den Websites der UserGroups nachlesen.

Thursday, June 25, 2009 7:24 PM |
Gestern twitterte Thomas über ein Problem beim Mocken, nach der Lösung blogte er darüber.
Das Problem ist dass Rhino Mocks bei object.AssertWasCalled() bei der Parameter-Überprüfung auf die Gleichheit eines Objektes geprüft wird und somit wenn man nur auf eine bestimmte Property prüfen will dies nicht geht.
Somit schlug dieser Test fehl.
[TestMethod]
public void ChangeEmail_POST_sendet_eine_Aktivierungs_Email_an_den_Benutzer()
{
// Snipp (Nicht vorhandene Logik des Tests nicht beachten :))
notificationService.AssertWasCalled(
n => n.Send(configurationService.GetValue("Email.Sender"),
new EmailRecipient { To = "abc@efg.hij" });
}
Für die Lösung musste er .Equals() überschreiben, nur für den Test. Desweiteren gibt es auch Probleme wenn man nur einzelne Properties eines Objektes überprüfen will. Gerade bei komplexeren Klassen kommt dies öfters vor.
Hier eine Lösung wo man .Equals() nicht überschreiben muss, und auch auf einzelne Properties überprüfen kann.
Das Beispiel von Thomas würde damit so aussehen.
[TestMethod]
public void ChangeEmail_POST_sendet_eine_Aktivierungs_Email_an_den_Benutzer()
{
// Snipp (Nicht vorhandene Logik des Tests nicht beachten :))
notificationService.AssertWasCalled(
n => n.Send(configurationService.GetValue("Email.Sender"),
Args<EmailRecipient>.MatchProperties( new { To = "abc@efg.hij" });
}
Hiermit wird nur das To-Property des Objekte welches als Parameter übergeben wird überprüft und alle anderen Properties werden ignoriert (sofern man ein anonymes Objekt übergibt). Natürlich kann man auch ein Objekte eines bekannten Typs übergeben, dann müssen jedoch auch alle Properties angegeben werden.
Hier nun der Code dazu.
using System;
using Rhino.Mocks;
using Rhino.Mocks.Constraints;
namespace DerAlbert.UnitTest.Constraints
{
public static class Anonymous
{
public static AbstractConstraint MatchProperties(object expected)
{
return new AnonymousPropertyConstraint(expected);
}
}
public static class Args<T> where T : class
{
public static T MatchProperties(object expected)
{
return Arg<T>.Matches(Anonymous.MatchProperties(expected));
}
}
}
und
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
using Rhino.Mocks.Constraints;
namespace DerAlbert.UnitTest.Constraints
{
public sealed class AnonymousPropertyConstraint : AbstractConstraint
{
private readonly object expected;
private readonly IList<string> messages = new List<string>();
public AnonymousPropertyConstraint(object expected)
{
if (expected == null)
{
throw new ArgumentNullException("expected");
}
this.expected = expected;
}
public override bool Eval(object current)
{
return EvalExpectations(current);
}
private bool EvalExpectations(object current)
{
var expectedPropertyInfos = expected.GetType().GetProperties();
foreach (var expectedInfo in expectedPropertyInfos)
{
object currentValue;
object expectedValue = GetExpectedValue(expectedInfo);
if (TryGetCurrentValue(expectedInfo, current, out currentValue))
{
if (!Equals(expectedValue, currentValue))
{
messages.Add(string.Format(@"'expected value on [{0}.{1}] should be [{2}] but was [{3}]'",
current.GetType().Name,
expectedInfo.Name,
expectedValue,
currentValue));
}
}
}
return messages.Count == 0;
}
private object GetExpectedValue(PropertyInfo expectedInfo)
{
return expectedInfo.GetValue(expected, new object[0]);
}
private bool TryGetCurrentValue(PropertyInfo expectedInfo, object current, out object value)
{
value = null;
var currentInfo = current.GetType().GetProperty(expectedInfo.Name);
if (currentInfo == null)
{
messages.Add(string.Format(@"'expected property [{0}.{1}] does not exists'", current.GetType().Name, expectedInfo.Name));
return false;
}
value = currentInfo.GetValue(current, new object[0]);
return true;
}
public override string Message
{
get
{
var sb = new StringBuilder();
foreach (var message in messages)
{
sb.AppendLine(message);
}
return sb.ToString();
}
}
}
}
Viel Spaß bei der Anwendung.
Technorati-Tags:
TDD,
Rhino Mocks,
C#,
.NET

Wednesday, May 27, 2009 8:50 AM |
Die Vorträge und Sprecher der dotnet Cologne 2009 stehen nun fast komplett fest.
Von Silveright Mobile, über Datenbindung und Datenaustausch über Multitouch ist so einiges vertreten. Natürlich bleibt Silverlight 3 nicht auf der Strecke.
Warum die Konferenz?
Die Idee zur Konferenz entstand auch aus einer gewissen Frustration heraus über die Art und Weise, wie WPF und Silverlight in der Vergangenheit der Öffentlichkeit präsentiert wurden. Wir sind der Meinung, dass WPF und Silverlight eine weitere Verbreitung als bisher verdient haben.
So konnte man u.a. mehrfach in Vorträgen erleben, dass die Frage von Zuschauern "was denn das Ganze für normale Anwendungen bringt" entweder nicht oder eher unbefriedigend beantwortet wurde.
Dies wollen wir mit der dotnet Cologne 2009 ändern, so dass am Ende des Tages vieles klarer wird, dass man weiss wo die Vorteile von XAML basierter Anwendungsentwicklung liegen und dass man Idealerweise motiviert Projekte damit stemmt.
Vortragsübersicht
http://www.dotnet-cologne.de/Vortraege.ashx
Wer sich jetzt noch nicht angemeldet hat, der kann dies jetzt noch machen. Für 15€ geballtes Silverlight & WPF Wissen. Zusätzlich zu den zwölf Vorträgen erwarten Dich mindestens 150 gleichgesinnte mit denen Du Dich den Tag über austauschen.
Nur allzulange sollte man mit der Anmeldnung doch nicht mehr warten. Es wird zwar eine Warteliste geben, aber wer will schon da drauf sein.
Teilnahmehinweise
Wer sich schon angemeldet hat der kann sein Blog oder Website mit folgende Grafiken verschönern.
sowie 
Twitter
Auch das eigene Twitter Profilbild kann dank @kcu einfachst gekennzeichnet werden http://barcampomat.zeitgeisty.net/event/dnc09.
Und teile Deinen Followern mit dass Du Dich zur dotnet Cologne 2009 angemeldet hast. Einfach mit einem Statusupdate (vorausgefüllt),
Hashtag
Das offizielle Tag zur dotnet Cologne ist dnc09 und kann in Flickr, Ipernity, Blogs, Twitter etc. verwendet werden.

Sunday, March 22, 2009 10:37 PM |
Da kam ich gestern spät Abend aus Hannover nach Hause und fand auch einen Brief im Briefkasten.
Adressiert an mich und mit dem .NET-Logo versehen, Inhalt noch eine dünne Pappe mit Microsoft-Tag und vielen Nullen und Einsen. Ich erinnerte mich an einen Twitter-Eintrag vom Thomas Freudenberg der auch sowas erhalten hatte, und schriebe dass Tag auf einen Twitter-Account verweist. Na, Super. Mal wieder virales Marketing, mistige Impressums-Pflicht. Und legte es in die Ecke.
Wollte es schon ignorieren, hatte aber langweile und der Müll wird erst morgen mit runter genommen. Mir geht es da eher wie Kay Giza.
Auch habe ich gerade keinen Scanner, Nullen und Einsen abtippen ist nichts für mich.
Der Twitter Account verweist auf eine Webseite: http://fec4a7a6-9bdc-4bfb-8217-cf6a118fde67.de/ eine Website die eine GUID ist. Die Aktion hat also definitiv was mit .NET, Microsoft zu tun und ist an Software-Entwickler gerichtet.
Jedoch gibt es ein paar andere die schon etwas geforscht haben.
Jan fand raus das die Nullen und Eines ein Ausspruch von Jonathan Swift ist der Gullivers Reisen geschrieben hat. Auch gibt es jemanden bei Microsoft der so heißt.
Michael schaute sich den Domain Inhaber an, “Herr Stockend Marketing”. Google Maps zeigt an “dessen” Adresse eher ein Privathaus als dass einer Firma.
Mit diesen Infos schaute ich als ein wenig rum.
Der Microsoft Jonathan Swift schreibt auch Bücher über Silverlight.
Auf der Website ist ein kleiner Counter der in Silverlight (ClientBin/neledhia.xap) geschrieben ist. Dieser zählt Binär runter. Der Counter endet am 01. April 2009 um 00:00 Uhr (Uhrzeit im Client). Mehr macht das Teil irgendwie nicht. Auch ist keine Aktion für den 01.04.2009 im Silverlight Code vorhanden.
“Follow the white Rabbit” ist der Text der als Standardtext in der Counter Box drin steht bevor zum ersten mal die Zeit anzeigt. Grüße ins Wunderland.
Gibt man “Jonathan Swift” in die TextBox auf der Seite an und klickt auf den DNKDE-Button. So erscheint der Text “stockendmarketing” in Silverlight, dieser wird durcheinander gewürfelt.
Die Website läuft im Debug Modus und verwendet Microsoft Analytics für die Statistiken. Die Site läuft auf einem Windows 2003 Server und wird bei Hetzner gehostet.
Tja, noch nicht viel mehr an Informationen. Also mal auf anderen Wege geforscht.
Die Website läuft auf der IP 213.239.211.109. Der Reverse DNS gibt anheledir.net zurück, was im übrigen eine fehlerhafte Konfiguration ist, den anheldedir.net verweist mittlerweile auf einen anderen Server. Anheledir ist der Name den Gordon Breuer in dem RunUO basierten Rollenspiel Land of Dreams verwendet. Auch bei Twitter verwendet er ihn und sein Blog ist entsprechend betitelt. Auch er verwendet Microsoft Analytics.
Gordon arbeitet bei http://www.dmde.net/ einer sogenannten Cross-Media Agentur, diese ist auch auch Microsoft Partner. Leider schafft sie es keine vernünftige Flash-Weiche zu entwickeln/verwenden. So dass bis auf den Hinweis dass die Seite Flash braucht nichts zu sehen bekommen. Weder bei IE oder beim FF bekomme ich mehr angezeigt und Flash ist installiert. Also keine weiteren Infos dazu.
Es werden noch paar andere Sites auf dem Server gehostet. Neben den Sites für Land of Dreams, Hunde-Sites, der eine oder andere Blog auch die http://kegelparty-bocholt.de. Eher alles privater Natur oder Firmen-Websites die mit Hilfe von Nachbarskindern erstellt worden sind.
Es findet sich ein Test-Blog für DNK dnkblog.anheledir.net dort. Was wohl dafür spricht dass es früher oder später zu DNK(DE) noch ein Blog geben wird.
Was ist also am 1. 4 2009?
- Steckt Microsoft dahinter?
- Ist das ein privat Projekt von Gordon der sich gerade einen Ast lacht?
- Ärgert er sich sich dass er schon aufgeflogen ist?
- Ist das ein Projekt der Firma wo er arbeitet.
- Wem gehört die Profile ID D706 bei Microsoft Analytics?
Tja, mal schauen was passiert, und ob da noch was passiert. Keine Ahnung ob ich mich noch weiter damit beschäftigen werden.

Sunday, March 08, 2009 3:41 PM |
Die .NET User Groups Bonn (Bonn-to-Code.Net, http://www.bonn-to-code.net) und Köln (.net user group Köln, http://www.dnug-koeln.de) veranstalten am 15. Mai 2009 in Köln in den Räumen der neuen Microsoft-Niederlassung die dotnet Cologne 2009, ein gemeinsames Community Event zu den Themen Windows Presentation Foundation (WPF) und Silverlight.
Nur wenn Ihr euch noch noch bis zum 15. März 2009 anmeldet habt Ihr die Chance die komplette Veranstaltung für gerade mal 10 € zu buchen. Danach wird es viel prozentual viel mehr Kosten. B
Den ganzen Tag mit zwei parallelen Tracks rund um WPF und Silverlight sollte sich niemand entgehen lassen, der auch nur einen hauch Interesse dafür hat.
Wie schon beim sehr erfolgreichen AfterLaunch in Köln im April letzten Jahres wird besonderen Wert auf praxisrelevante Informationen gelegt. Ziel ist es, bei aller Begeisterung über die technischen Möglichkeiten von WPF und Silverlight stets den konkreten Einsatz in echten Projekten im Blick zu haben
Anmeldung und weitere Informationen auf http://www.dotnet-cologne.de

Friday, March 06, 2009 12:48 PM |
Deutsch
Ich habe die Version Beta 10 des MbUnit-2.x-Test-Runner für ReSharper veröffentlicht. Neben ein paar Fehlerkorrekturen funktioniert diese Version nun auch mit dem R# 4.5 (getestet mit EAP Version 1183).
Download Beta 10
English
I have released the version Beta 10 of the MbUnit-2.x-Test-Runner for ReSharper. Some Bug fixes and the possiblity to use it on R# 4.5 (testet with EAP Build 1183) are the main features.
Download Beta 10

Monday, March 02, 2009 9:34 PM |
Nachdem ich nun auch meinen Arbeitslaptop auf Windows 7 umgestellt habe (es gab Probleme mit einer speziellen VPN-Software). Wurde natürlich einiges neu installiert, so auch der Live Writer.
Ich war also auf der Suche nach dem PlugIn für LiveWriter mit dem man Quelltexte mit für SyntaxHighlighter den ich hier zur Formatierung dieser verwenden einfach einfügen kann.
Der Name war natürlich entfallen und den Blogpost von Scott Hanselmann war auch nicht so schnell griffbereit.
Also zum Glück mal Tante Google gefragt und dabei ist folgendes zum vorschein gekommen.
http://www.codeplex.com/wlwSyntaxHighlighter
Es ist nicht das von Scott Hanselmann empfohlene, sondern ein besseres.
Die Vorteile gegenüber dem anderen, dessen Namen ich immer noch nicht weiß.
- Vorschau in LiveWriter
- Quelltexte wieder bearbeitbar
- Optionen einfach änderbar ohne neu einzufügen
Großartig bekannt scheint es nicht zu sein, wie die Download zahlen zeigen, dies jedoch zu unrecht.
Also hiermit sowohl Download- und Installations-Befehl!
Eine Anmerkung noch, es kann noch nicht die neue Syntax vom Syntaxhighlighter 2.0. Somit muss für die Version 2.0 das Kompatibilitätsskript eingebunden werden.

Tuesday, February 24, 2009 12:46 PM |
So kann es gehen, aus einem kleine Tweet wurde eine kleine User Group Tour.
Ich bin somit dieses Jahr Unterwegs in Deutschland und werde ausführlich über das ASP.NET MVC Framework berichten und zeigen wie man damit Web-Anwendungen entwickelt.
Folgende Termine sind bis jetzt geplant.
3. März 2009
In meiner Heimat-User Group geht es los http://www.dnug-koeln.de und warte bis zum
10. Juni 2009
wo ich Karlsruhe gastiere, bei der http://www.dotnet-ka.de/ von dort aus geht’s am
11. Juni 2009
nach Ulm http://www.dotnet-ulm.de/ zur dortigen Usertreffen.
18. Juni 2009
Da verschlägt es mich an den Bodensee zur frisch gegründeten http://www.dotnet-kk.de/
21. Juli 2009
Nach etwas Pause begebe ich mich nach http://www.dotnet-braunschweig.de/ zum derzeitigem Abschluss der Tour.
Ich freue mich total drauf unterwegs zu sein und andere User Groups und deren Leute kennenzulernen.

Friday, February 20, 2009 11:28 AM |
Am Montag den 23.02.2009 findet im Rahmen von VAN DE ein Vortrag über Test Driven Development/Behavior Driven Development statt.
Gabrial Schenker hat sich bereit erklärt in seiner unnachahmlichen Art uns TDD/BDD näher zu bringen.
Wie können wir Code schreiben, der möglichst fehlerfrei, robust, und leicht änderbar ist und es auch bleibt? Wie implementieren wir nur wirklich benötigte Funktionalität und sind von allem Anfang an auf zu erwartende Änderungswünsche des Kunden vorbereitet? Die Antwort auf diese Fragen lautet Test-getriebene Entwicklung (TDD).
Wie erreichen wir, dass Entwickler und Fachexperten oder allgemein Stakeholder dieselbe Sprache sprechen? Behavior driven development (BDD) liefert uns eine mögliche Antwort darauf.
Start ist 20 Uhr, seid pünktlich.
Anmeldung und Teilnahmeinformationen:.
http://www.altdotnet.de/OnlineMeeting_090223.ashx
Ein Headset hilft wenn man Fragen stellen möchte, jedoch besteht auch die Möglichkeit nur mitzuhören und Fragen per Tastatur einzureichen.
Wir freuen uns euch dort zu begrüßen.

Monday, February 16, 2009 12:14 PM |
Hier und da ist es notwendig dass man die MasterPage zur Laufzeit ändern möchte. Bei ASP.NET MVC kann man dies auf mittels eines eigenen ActionFilterAttribute machen.
public class MasterPageSwitchAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var viewResult = filterContext.Result as ViewResult;
if (viewResult != null)
{
viewResult.MasterName = "NeueMasterPage";
}
}
}
Dieses Attribute einfach an den gewünschten Controller, oder die Action hinzufügen und schon bekommt man die gewünschte MasterPage angezeigt.
Die MasterPage wird über die üblichen ASP.NET MVC Suchpfade ermittelt und der MasterName darf keinen Suffix ".master” enthalten.
Natürlich macht ein fest einprogrammierter Name der neuen MasterPage keinen großen Sinn. Man sollte diese mit einer gewissen Logik ermitteln. Ich nehme im echten Code einen kleinen Settings-Provider.

Monday, February 09, 2009 8:17 AM |
Am Montag den 09.02.2009 findet der Clean Code Developer Talk im Rahmen von VAN DE statt.
Stefan Lieser und Ralf Westphal haben sich Ende 2008 zusammengesetzt und Ihre Gedanken zum Thema professionelle sowie qualitative Softwareentwicklung und der Weg dorthin ausgetauscht. Rauskommen ist der Clean Code Developer.
http://www.clean-code-developer.de
Beim Online Clean Code Developer-Tak stellen sie kurz die Beweggründe dar und stehen für Fragen zu Verfügung. Start ist 20 Uhr, seid pünktlich.
Anmeldung und Teilnahmeinformationen:.
http://www.altdotnet.de/OnlineMeeting_090209.ashx
Ein Headset hilft wenn man Fragen stellen möchte, jedoch besteht auch die Möglichkeit nur mitzuhören und Fragen per Tastatur einzureichen.
Wir freuen uns euch dort zu begrüßen.

Sunday, February 08, 2009 1:15 PM |
Am Montag den 26. Januar ab 20 Uhr findet das 2. ALT.NET DE Online
Meeting statt.
http://www.altdotnet.de/OnlineMeeting_090126.ashx
Sebastian Jancke hat sich bereit erklärt einen kurzen Vortrag zu Domain
Driven Design (DDD) zu halten. Danach ist Zeit für Diskussion und Fragen
(daran darf sich natürlich jeder beteiligen). Ein Headset ist dafür Hilfreich, aber nicht erforderlich.
Damit wir einen ungefähre Ahnung haben mit was für einem Andrang gerechnet werden (ich muss bei LiveMeeting die ungefähre Zahl der Teilnehmer angeben) tragt euch bitte im Wiki ein, oder hinterlasst hier kurz einen Hinweis. Dann trage ich euch dort ein. Natürlich darf man auch unangemeldet auftauchen.
Die nächsten geplanten Termine sind der 9. Februar 2009 (Clean Code
Developer) und der 23. Februar 2009 (T/BDD).
Technorati-Tags:
ALT.NET,
VAN,
DDD,
CCD,
TDD,
BDD

Monday, January 12, 2009 10:44 AM |
Kurz vor Jahresende findet das erste ALT.NET DE Online Treffen statt
Beim ersten Treffen gibt es noch kein spezielles Thema.
Jeder interessierte kann Teilnehmen, sofern ein Headset vorhanden ist, eine WebCam dazu schadet nicht, jedoch muss der Live Meeting Client installiert sein (kann man auf der Testseite machen)
Wie das ganze abläuft steht noch nicht fest, es wohl erst einmal ein wenig Open Space sein um dies zu erarbeiten.
Offiziell geht es ab 20 Uhr los, die Lobby ist aber 19:30 Uhr geöffnet.
Weitere Informationen zum Online-Meeting

Sunday, December 28, 2008 9:14 PM |
Am besten gar nicht!
Eine der Standard-Fragen von Foren und Newsgroups scheint mir zu sein wie man von Control A auf Control B zugreift. Oft übergreifend zwischend UserControls welche auf einer WinForm/WebForm eingesetzt wird.
Bei ASP.NET wird dann oft versucht mit FindControl() dass jeweilige Control auf welches man nun unbedingt zugreifen muss zu suchen um dieses dann, sofern gefunden, entsprechend den Vorstellungen zu bearbeiten.
Dann Frage ich mich, ob der Sinn von Objekt-Orientierung in Ansätzen verstanden wurde? Soll dieses UserControl wirklich nur auf dieser speziellen Seite mit eingesetzt werden? Warum dann ein UserControl? Was wird gemacht wenn das UserControl mal auf einer anderen Seite eingesetzt wird? Wird dann je nach Seite entschieden welches andere Control gebraucht wird? und und und.
Warum denn nicht?
Durch die Verwendung eines UserControls erhält man eine potentiell wiederverwendbare Komponente die sich an verschiedenen Stellen einsetzen lässt. Damit dies jedoch funktioniert sollte ein Control so wenig wie möglich von seiner Umgebung wo es eingesetzt wird wissen, am besten gar nichts.
Doch es wird häufig in einem Control direkt auf die Datenbank zugegriffen, aus einem Control wird versucht zu erahnen in welchem Kontext es läuft um Entscheidungen zu treffen. Z.B. ein- und ausblenden von fremden - nicht im Control verwendeten - Controls oder fremden Text zu Modifizieren oder was auch immer nicht im Einflussbereichs der Control liegt.
Damit ist eine Wiederverwendung so gut wie unmöglich und kann direkt sein gelassen werden. Man hat eine sehr enge Kopplung an die Umgebung. Früher oder später knallt einem das Control um die Ohren (falsche Daten, keine Änderung des fremdem Controls etc.), man ärgert sich, schiebt Frust und früher ohne Objektorientierung war eh alles besser.
Ein paar Faustregeln
What Happens in Vegas, stays in Vegas.
- Es geht das Control nichts an wo die Daten herkommen.
- Es geht das Control nichts an wo es eingesetzt wird.
- Es geht das Control nichts an was andere Controls machen
- Es geht das Control nichts an welche Entscheidungen aufgrund bestimmter Zustände des Controls gemacht werden.
- Die Steuerung und Reaktion auf ein Control übernimmt eine übergeordnete Instanz wie z.B die Seite auf der das Control verwendet.
- Es geht die übergeordnete Instanz nichts an was im Control im Detail passiert.
- Das Control (bzw. dessen Entwickler) entscheidet was für Verwendung wichtig ist und kommuniziert nur dies nach außen.
Die ASP.NET WebControls machen zum Beispiel machen es so, die WinFoms-Controls ebenso auch Control-Libraries arbeiten so. Warum? Damit sie überall eingesetzt werden können. Also spricht doch nichts dagegen die eigenen Sachen auch so zu gestalten.

Tuesday, December 16, 2008 11:43 AM |
Ich bin ja schon seit Jahren ein Verfechter davon mit mehreren Monitoren zu arbeiten. So gab es ein paar Dinge die mich störten, nur Kleinigkeiten, aber nervig. Was jedoch an Windows liegt und nicht an den mehreren Monitoren ;)
Habe dann vor einigen Wochen (erst!) UltraMon entdeckt. Doch ich habe es dann sofort in mein Herz geschlossen. Es ist nicht alles Perfekt, aber das was ich davon nutze gefällt mir.
TaskBar auf den anderen Monitoren
Windows zeigt die TaskBar nur auf dem primären Monitor an, was nervt wenn man auf einen anderen Monitor fokussiert ist und dann der Blick nach unten schweift um in der TaskBar was auszuwählen und es ist nicht da. Mit UltraMon hat jeder Monitor eine eigenen TaskBar, entweder nur mit den Fenster die auf dem Monitor sind, oder auf jeder Taskbar denselben Inhalt.
Ich bevorzuge die erste Variante. Jedoch kommt es bei mir vor dass ich hier und da ein Programm wie Notepad++ oder so doppelt starte weil es nicht auf der im Fokus befindlichen TaskBar angezeigt wird. Dies kommt aber selten vor. Schade finde ich auch dass ich den Task-Manager nicht über die UltraMon-TaskBars anzeigen lassen kann.
Verschieben von Fenstern auf den anderen Monitor
Wenn man ein Fenster auf einem anderen Monitor zieht, dann passt Windows nicht die Größe an wenn die Monitore unterschiedliche Auflösungen haben. Ärgerlich. Mit UltraMon verschiebe ich auf Mausklick bzw. Tastendruck ein Fenster von A nach B und die Proportionen des Fensters werden beibehalten. Sehr schön.
Dies sind so ziemlich die einzigen Features von UltraMon die ich bewusst einsetze. UltraMon kann noch mehr, so “Kleinkram” wie Desktop-Hintergründe für mehrere Monitore eintragen, merken von Icon Positionen etc.
Anpassbar
UltraMon ist sehr granular anpassbar, so kann man entscheiden wo Buttons hinkommen, Menü erweitertet werden und ob überhaupt. Für problematische Anwendungen gibt es wohl auch spezielle Einstellungen, jedoch habe ich keine Probleme ausmachen können die auf UltraMon zu führen waren. Die TaskBar und die Fenster-Buttons fügen sich schön dem Vista-Aero-Look. Auch hält es sich direkt im Hintergrund wenn man plötzlich keinen zweiten Monitor mehr am System hat (was bei mir des öfteren vorkommt, da ich nur noch am Laptop arbeite).
Missen möchte UltraMon nicht mehr, ob es einem 40 Dollar wert ist muss man für sich selbst entscheiden. Es gibt eine mir bekannte alternative MultiMonitor Taskbar, die passt sich in der kostenlosen Version jedoch nicht dem Look & Feel des System an.

Tuesday, December 09, 2008 5:16 PM |