Thomas Woelfers Baustatik Blog

Baustatik-Software und was sonst des Weges kommt

Die Referenzliste von Bauingenieur-Büros

Auf unserer Webseite haben wir (im Menu links unter "Kundenreferenz") einen kurzen Auszug aus unserer Kundenliste stehen: Das soll nur eine kurze Referenz sein, mit der Sie vielleicht auch einen Statiker-Kollegen in der Nähe finden können. (Aus diesem Grund ist auch der Ort mit angegeben.) Bei allen Büros, von denen wir auch eine URL hatten, ist auch die Webadresse angegeben.

Wenn Sie auch auf diese Liste mit den Links möchten: Kein Problem - schicken Sie einfach eine Mail mit den notwendigen Angaben, und wir tragen Sie auch dort ein.

 

Nochmal Consolas

Ich hatte vor ein paar Tagen den "Consolas" Font von Windows Vista gezeigt - und dazu gab es nun ein paar Nachfragen, weil die Font bei anderen nicht so gut aussah, wie auf meinem Screenshot.

Grund: Die neuen Vista-Fonts sind darauf ausgelegt, das man ClearType eingeschaltet hat - das ist bei Vista per Default der Fall, bei XP aber nicht. Wenn man also einen der neuen Vista Fonts unter XP benutzen will, dann sollte man auf jeden Fall ClearType einschalten. Ich empfehle außerdem den ClearType Tuner von Microsoft: Jeder "sieht" nunmal anders - darum ist es sinnvoll, die Einstellungen für sich selbst zu personalisieren.

Das PropertyGrid und Change-Notifications

Das PropertyGrid Control ist ein unheimlich mächtiges Werkzeug - das einen aber manchmal auch zur Verzweiflung treiben kann. Ein Grund dafür sind die scheinbar "fehlenden" Events für viele wichtige Ereignisse: Wo zum Beispiel ist der "ObjectPropertyChanged" Event, der ausgelöst wird, wenn der Anwender mit Hilfe des PropertyGrids eine Eigenschaft eines Objektes verändert hat?

Genau: Gibts nicht.

Gibts aber eben doch: Das PropertyGird hat noch deutlich mehr an Funktionalität zu bieten, als aus der Liste der Methoden und Events herauszulesen ist - denn um da dranzukommen, muss man eine ISite Implementierung haben, und der "Site" Property des Grids zuweisen.

ISite hat eine wirklich interessante Eigenschaft - es ist auch IServiceProvider. Und der wiederum hat die schöne Methode GetService(), mit der das Grid - so es eine Site hat - nach verschiedenen Diensten fragt. (Hat man einen Dienst nicht implementiert, liefert man null - das Grid verwendet dann seine Default-Implementierung.

Will man nun zum Beispiel wissen, wenn eine Eigenschaft des bearbeiteten Objektes verändert wurde, dann muss mann den IComponentChangeServer implementieren. Fragt das Grid nach diesem Service, dann liefert man eine Instanz der eigenen Implementierung. Die wiederum hat die Methode "OnComponentChanged()" - und die ruft das Grid nach jeder Änderung auf.

Man sieht: Es geht - allerdings würde man sich schon ein wenig mehr Dokumentation dazu wünschen.

Schöner und Schneller: Statisches Typing mit Generics vs. Dynamisches Typing

Solch einen Fall habe ich relativ oft: Es gibt eine Liste von Objekten unterschiedlicher Art (in meinem Fall sind das immer Singletons), und ich brauche die Instanz, die einen bestimmten Typ hat. (In meine Fall gehts immer darum die Instanz zu finden, die ein bestimmtes Interface unterstützt.)

Um das zu simulieren verwende ich hier im Beispiel einfach eine große Menge an Objekten von Typ (A) und ein einzelnes von Typ (B). Nach (B) wird dann gesucht. Die Liste sieht also in etwa wie folgt aus und wird für den Test so aufgefüllt:

private List<object> objects = new List<object>;
for (int i = 0; i < 500000; i++)
{
   objects.Add(
new Button());
}
objects.Add(
new NumericUpDown());

(Wie gesagt: Eigentlich müsste es sich um lauter unterschiedliche Typen handeln.) Mit den Möglichkeiten von .Net < 2.0 sieht eine entsprechende Funktion zum suchen einer bestimmten Instanz dann so aus:

private object FindDynamic(Type type)
{
   foreach (object o in dynamic)
   {
     if (type.IsAssignableFrom(o.GetType())) return o;
   }
   return null;
}

Der Aufruf der Funktion wird dann sehr unschön: Der gesuchte Typ kommt dreimal vor, und außerdem braucht man noch  einen Cast:

NumericUpDown result = FindDynamic(typeof(NumericUpDown)) as NumericUpDown;

Laufzeit im Beispiel: etwa 90 ms.

Mit .Net 2.0 und Generics kann man die Funktion zum finden so hinschreiben, das man nur noch RTTI und statisches typing verwendet - es braucht keine Reflections mehr:

private T Find<T>() where T:class
{
   foreach (object o in dynamic)
   {
      T result = o
as T;
      if (result != null) return result;
   }
   return null;
}

Laufzeit im Beispiel : < 70 ms

Die verbesserung der Performance ist aber eigentlich nicht der Hauptvorteil - der liegt vielmehr darin, wie der Aufruf der Funktion nun aussieht: Der ist nämlich deutlich hübscher:

NumericUpDown result = Find<NumericUpDown>();

Die Kosten von Wartungsverträgen

Vom Deutschen Ingenieursblatt gibt es eine Übersicht über die Leistungen und Kosten von Wartungsverträgen, in der wir mit Work&Cash aufgelistet sind. Das ist zwar einerseits nicht ganz richtig - andererseits enthält ein Work&Cash Vertrag ja auch alle Updates, jede Form von Support und den Zugriff auf alle unsere Baustatikprogramme. Neben D.I.E. finden Sie in der Übersicht auch noch die Firmen Dlubal und InfoGraph.

Sie finden die Übersicht hier - die Baustatik-Software Hersteller befinden sich auf Seite 2 des PDFs. Allerdings ist die Übersicht alles andere als vollständig, jede Menge Hersteller fehlen. Eine etwas vollständigere Liste von Anbietern finden Sie bei mir in der Navigation, rechts auf der Seite.

Davon ab: Das Deutsche Ingenieursblatt sammelt noch bis zum 15. Dezember Meinungen und Erfahrungen zu Wartungs- oder Serviceverträgen. Wenn Sie also Ihre Meinung zu Work&Cash loswerden wollen - dann lautet die Adresse wartungsvertraege@baumedien.de

Gesucht werden Erfahrungen zu folgenden Themen: Werden zugesagte Leistungen auch eingehalten? Wie schnell wird auf Supportanfragen reagiert? Welche versprochenen Zusatzleistungen werden tatsächlich erbracht?

Neue Version: System.Drawing.Color - Betrachter

colors2.png

Das Programm zeigt die Farben aus System.Drawing.Color, auf Wunsch auch mit einem Alpha-Wert an - ich brauche das andauernd.

Neu in dieser Version: Man kann jetzt vernünftig scrollen; außerdem gibt es ein Kontrollelement mit dem man den Alpha-Wert einfacher einstellen kann. Schließlich gibt es jetzt auch eine Möglichkeit die Hintergrundfarbe zu setzen. Von Haus aus ist die Weiss, aber wenn man ein Alpha != 255 setzt ist es natürlich wichtig, das auch die Hintergrundfarbe gesetzt werden kann. 

Wer mag kann sich hier das Projekt runterladen. (VS 2005 RC, sollte aber mit dem Final problemlos geladen werden können.)

Vorabinformationen zum Faltwerk

Wir haben ja in den Blogs bei D.I.E. schon hin und wieder über den Fortschritt bei der Entwicklung des kommenden Faltwerksprogramms geschrieben. Das wird auch in Zukunft so bleiben - aber ab sofort gibt es auch die ersten "offiziellen" Informationen über das Programm.

Selbige finden sich auf der normalen Webseite zu unseren Statikprogrammen. Sie finden umfangreiche Beschreibungen von Teilen der Funktionalität, Informationen über die technischen Hintergründe wie zum Beispiel über das Bemessungskonzept und die verwendeten FEM-Elemente, sowie etwa 10 Videos die die Arbeit mit dem Programm demonstrieren. Link: Das Faltwerksprogramm

Es handelt sich natürlich bei weitem nicht um die vollständige Dokumentation - Sie sollten aber schon einen recht guten Eindruck von der Leistungsfähigkeit der Software bekommen.

Text aus Message-Boxen kopieren

Oft erscheinen Fehlermeldung von Windows-Programmen in sogenannten "Message-Boxen". Das sind die kleinen Fenster, die unten meist nur einen OK oder Abbrechen haben, rechts ein Icon anzeigen und ansonsten nur aus einem Nachrichtentext bestehen. Nun will man diesen Text oft gern anderen mitteilen - zum Beispiel für die Fehlersuche. Dabei ist es dann ein bisschen unhandlich, immer einen Screenshot von der Dialogbox zu machen und das ganze als Bild zu versenden.

Das muss aber auch nicht sein: Mit der Tastenkombination "Ctrl+C" kann man nämlich den Text der Nachricht in die Zwischenablage kopieren - und von dort zum Beispiel einfach in einer Mail einfügen.