Thomas Woelfers Baustatik Blog

Baustatik-Software und was sonst des Weges kommt

Freuden auf dem Amt

Ich habe heute einen neuen Personalausweis abgeholt. Dazu muss man hier in München in einem Warteraum eine Nummer aus einem Automaten ziehen. Über den Schalter befindet sich dann eine Anzeige, in der die Nummer angezeigt wird die 'dran' ist. Ich hatte 254, 'dran' war die Nummer 170.

Geöffnete Schalter: Einer von dreien.

Begeisterung brach aus.

Ich stoppte also zunächst mal die Zeit für die nächsten zehn Nummer - und die brauchten etwa 1 Minute im Schnitt.  Ich hatte also 10 Minuten gewartet und noch etwa 70 Minuten vor mir. Hurra. Also erstmal raus, Zeitung kaufen - damit was zu lesen da ist. Das dauerte nochmals 10 Minuten: Also noch 60 Minuten warten.

Doch dann legten die Damen hinter den Schaltern den Turbo rein - und öffneten auch die beiden anderen Schalter. Mit vereinten Kräften ging es dann (fast) dreimal so schnell und dauerte - 60 Minuten. :-(

Zum Glück hält das Ding nun wieder 10 Jahre.

 

Windows.Forms DesignMode-Flag: Wenig hilfreich

Die 'Control' Klasse von Windows.Forms hat ein 'DesignMode'-Flag. Steht das auf true, dann befindet sich das Control im Designer, ansonsten nicht. Sollte man zumindest anhand des Namens und der Dokumentation annehmen - so ist das aber leider nicht. Das ist besonders dann extrem ärgerlich, wenn man selbst programmierte UserControls verwendet, denn die greifen nunmal gern auf Daten zu, die im DesignMode nicht unbedingt vorhanden sind. Also schaut man vor derartigem Code erstmal nach, ob DesignMode gesetzt ist - und ist das der Fall, lässt man die Sache eben bleiben.

Dummerweise: Das Flag ist nur gesetzt, wenn das direkte Parent des Controls im DesignMode ist. Sind einige Control ineinander verschachtelt, dann klappt das ganze nicht mehr, und man bekommt ein 'false' - auch dann, wenn sich das Control momentan im Forms-Editor befindet. Resultat: Absturz des Controls im Forms-Editor.

Um wirklich sicher zu gehen, ob man sich im Design-Mode befindet, müsste man rekursiv in der Control-Verschachtelung bis ganz nach oben gehen und nachsehen, ob eines der Parents im DesignMode ist. Das geht aber nicht, weil DesignMode 'Protected' ist. Suuuuper.

Statt dessen kann man aber auf die 'Site' schauen - das geht so:

    public static class ControlHelper
    {
        public static bool IsInDesignMode( Control control )
        {
            if( control.Parent != null )
            {
                if( control.Parent.Site != null )
                {
                    return true;
                }
                else
                {
                    return IsInDesignMode( control.Parent );
                }
            }

            return false;

        }
    }

An manchen Tagen passiert einfach das unerwartete

Gestern war so ein Tag. So befand ich mich am Abend plötzlich in einem Auto auf dem Weg zu einem Konzert von Vanessa Mason, von der ich vorher noch nie im Leben was gehört hatte.

Mit im Auto: Meine alte Freundin Andrea, eine chinesischen Dame deren Namen ich nicht verstanden habe, sowie Udo Lindenberg. Das Konzert war dann zwar etwas mau, aber ansonsten wars ein lustiger Abend.

Die Chinesin wollte mich als IT-Sicherheitsberater beschäftigen. Geht natürlich nicht, ich baue nämlich lieber Statiksoftware wie bisher. Manchmal trifft man in München echt die verrücktesten Leute. :-)

Achso: Vom Rotwein in der Muffathalle kann ich nur abraten.

ISO Images unter Windows mounten

Kommt bei mir öfter mal vor: Ich habe ein ISO-Image einer CD und will da kurz eine Datei rausholen - das brennen einer CD anhand des Images ist mir aber zu umständlich.

Muss man auch nicht: Man kann ein ISO-Abbild einfach als Laufwerk mounten und dann so darauf zugreifen, als wäre das ISO-Image ein Laufwerk. Dazu braucht man das kostenlose 'Virtual CD Control Panel'.

ASP .Net 1.1 und 2.0 gleichzeitig betreiben

Wenn man den alten Code nicht gleich neu kompilieren kann oder will, und darum parallel zu einer bereits bestehenden ASP.Net 1.1 Codebasis auch ASP.Net 2.0 in einer Webseite verwenden will, dann ist das ein ganz klein bisschen hakelig. Es geht - aber man muss wissen was man tut...

Zunächst ist die Sache ganze einfach: Als erstes installiert man das .Net 2.0 Beta. Dabei werden die benötigten Einträge in der IIS Metabase ganz automatisch vorgenommen - man muss nichts weiter tun.

Dann legt man ein neues virtuelles Verzeichnis mit passenden Rechten an und kopiert die ASP 2 Website hinein. Jetzt wird es ein bisschen trickreich, denn man muss in den Eigenschaften des virtuellen Verzeichnisses auf dem ASP-Reiter einstellen, das dieses virtuelle Verzeichnis die 2er Version verwenden soll - ansonsten geht die Sache durch den 1.1er Stack, und das klappt natürlich nicht.

Das einstellen allein reicht aber nicht: Bei den Default-Einstellungen verhält es sich nämlich so, das alle Webanwendungen einer Domain von Haus aus im gleichen Prozess ausgeführt werden: Man kann aber nicht .Net 2 und .Net 1 gleichzeitig im gleichen Prozess ausführen.

Darum ist ein weiterer Schritt notwendig: Man legt einen neuen Application Pool an, und stellt dann unter den Eigenschaften für das virtuelle Verzeichnis ein, das die darin befindliche Anwendung in diesem neuen Pool ausgeführt werden soll: Dann gehts.

GMX mag uns nicht. Oder: Wieso die Lizenzen nicht kommen

In letzter Zeit hatten wir verstärkt bemerkt, das die Lizenzen für die kostenlosen Studentenversionen unserer Statikprogramme, vor allem bei Personen mit eMail-Accounts bei GMX, irgendwie nicht so recht zu den Empfängern kamen. Daraufhin haben wir heute eine kleine Untersuchung gestartet, und siehe da: Die eMails mit den Lizenzen kamen sehr wohl bei den Empfängern an - wurden aber von GMX direkt in den Spam-Ordner verfrachtet. Und da fand sie natürlich niemand.

Grund dafür ist der bei GMX eingesetzte Anti-Spam Engine 'Spam Assassin'. Den setzen wir auf unserem Mail-Server übrigens unter anderem auch ein - allerdings wohl mit anderen Regeln als das bei GMX der Fall ist. Eine der Regeln bei GMX kommt wohl mit unserem Firmennamen nicht klar, und der stand im Titel dieser Mails: 'Ihre Lizenzen für die D.I.E. Programme'.

Das Kürzel 'D.I.E.' riecht dem Antispam-Tool wohl aus mir völlig schleierhaften Gründen nach Reklame - und schwupps, schon waren sie weg, die Mails.

Ab sofort versenden wir die Mails daher mit einem anderen Betreff - und mit diesem landen die Lizenzen nun auch wieder bei GMX sicher in der ganz normalen Inbox.

Wenn Sie unsere Software übrigens auch für die Uni oder eine sonstige Ausbildung kostenlos verwenden möchten: Hier gibts die notwendigen Informationen.

.Net 2.0 - Wichtiger Unterschied bei der Implementierung von Collections

Bei .Net vor der Version 2.0 gab es keine Generics: Wollte man ein Dictionary-Objekt (Hashtable, Map...), dann verwendete man dafür das ganz normale Hashtable-Objekt.

Bei .Net 2.0 gibt es nun die Generics, die unter anderem den großen Vorteil haben typensicher zu sein. Um eine Hashtable für 'string' auf 'object' anzulegen, geht man einfach wie folgt vor:

Dictionary<string,object> map = new Dictionary<string,object>;

Soweit - so gut. Auf eines muss man aber aufpassen: Die Implementierung von Lookups ist etwas anders als früher. Bisher konnte man in etwa das folgende verwenden:

Hashtable ht = new Hashtable();
ht[ "paul"] = new Person();

Wollte man dann später eine Person rausholen, so ging das wie folgt:

Person p = ht["paul"];
if( p != null) // .... dann hatte man die Person

Bei der Dictionary-Klasse ist das anders: Ist der Key nicht enthalten, dann wird der Zugriff über eckige Klammern eine Exception. Statt dessen gibt es aber eine alternative Funktion zum erfragen anhand des Keys.

Software-Tipp für Vielreisende

Wer viel auf der Welt unterwegs ist und seinen Laptop dabei hat - oder auch, jeder mit Bekannten auf der ganzen Welt - wird dieses kleine Programm sehr hilfreich finden: Microsoft Time Zone. Läuft in der Taskleiste und zeigt auf Wunsch die aktuelle Uhrzeit an beliebigen Orten an. Kostenloser Donwload hier.

Mehr zu den Objekteinstellungen

Ich hatte ja schon gestern etwas über die Objekteinstellungen im kommenden Faltwerksprogramm geschrieben. Heute ist mir aufgefallen, das ich ein paar wichtige Details vergessen habe. Und die stehen nun hier :-)

Eines der ärgerlicheren Dinge bei den bisherigen Programmen im Zusammenhang mit den Einstellungen für die einzelnen Objekte ist die Tatsache, das diese zu einer neuen Version hin nicht gerettet werden können. Hat man also seine eigenen 'perfekten' Einstellungen gefunden - dann sind die dummerweise verloren, sobald man ein Update installiert.

Das ist beim neuen Programm nicht länger der Fall: Die Einstellungen bleiben auch über Versionwechsel hinweg erhalten. Um genau zu sein - die Einstellungen sind sowohl vorwärts als auch rückwärtskompatibel: Selbst wenn Sie eine ältere Version des Programms benutzen und bereits Einstellungen mit einer neueren gemacht haben - die Werte bleiben erhalten.

Um wer ganz sicher gehen will, der kann diese Einstellungen dann auch mit ins Backup aufnehmen. Anders als bisher, wo diese Einstellungen in der Windows-Registry abgelegt wurden, befinden sich die Einstellungen nun in einer sepraten Datei, die einfach mit gesichert werden kann. Dabei ist es so, das jeder Benutzer-Account auf einem Rechner eine eigenen Datei bekommt: Es ist also auch möglich auf einem einzelnen System unterschiedliche Einstellungen für unterschiedliche Benutzer vorzunehmen. (Das ging allerdings auch schon früher...)

Besonders nett finde ich dabei die Tatsache, das diese Datei(en) - wie eigentlich fast alle - in einem von Menschen lesbaren Format vorliegen: Wer mag, kann darin also auch einfach mit einem Text-Editor herumeditieren. Das müssen Sie aber natürlich nicht tun, denn es gibt logischerweise eine Dialogbox, mit der man alle Einstellungen vornehmen kann.

Objekteinstellungen im Faltwerks-Programm

Schon in Programmen wie dem Rahmenprogramm oder dem Plattenprogramm können Sie ja für jedes Objekt-Art eine ganze Menge an Darstellungsparametern einstellen. Dazu gehört zum Beispiel die Farbe, die Strichstärke, usw.

Das wird sich auch im kommenden Programm nicht ändern, es gibt allerdings eine Erweiterung: Sie können diese Einstellungen dort zum einen für die Objektart (also Knoten, Balken, ...) oder aber für ein einzelnes Objekt vornehmen. Das geht so ähnlich, wie die Zuweisung eines Materials an einen Balken - die Darstellungsparameter sind also eine Eigenschaft des Objektes. Wenn Sie keine Darstellungsparameter definieren, dann werden die 'Vorgabe'-Parameter verwendet.

Wenn Sie diese Vorgabwerte ändern, dann ändern sich einfach alle Elemente mit - es sei denn, Sie haben für ein einzelnes Element einen anderen Satz an Parametern ausgewählt. Damit können Sie dann zum Beispiel Gruppen von Elementen unsichtbar machen, oder aber bestimmte Stockwerke oder Bauelemente farblich markieren.