Thomas Woelfers Baustatik Blog

Baustatik-Software und was sonst des Weges kommt

Die nächsten Termine

Die Termine für die beiden nächsten Anwenderseminare (in München und Oberhausen) stehen fest - beide sind im März. Details und Links zu den Anmeldeformularen gibt es hier.

Auch der Termin für den nächsten Stammtisch in München steht fest: Der ist am Dienstag den 24.3. ab 19:30, wie immer im Pauls in der Maxvorstadt. Ich bitte um eine kurze Mail (an tw@die.de ), falls Sie kommen wollen - je frühzeitiger, umso besser :-)

Wie man herausfindet, ob die eigene C# Anwendung als x86 oder x64 läuft

Sofern man die "Platform Target" eines C# Projectes nicht explizit setzt, dann wird die Anwendung zur Laufzeit auf einer x86 Platform eine x86 Anwendung sein, und auf einer x64 Platform eine x64 Anwendung: Das ist praktisch, wenn man es nur mit managed Code zu tun hat, denn man bekommt die 64bit Variante quasi geschenkt.

Wenn man aber auch nativen Code hat muss man - je nachdem wie man die Anwendung baut - in Abhängigkeit der aktuellen Platform unterschiedliche DLLs laden. Also zum Beispiel die Calc32.dll für x86 und die Calc64.dll unter x64. Wie findet man aber nun heraus, ob man sich in einer x86 oder in einer x64 Umgebung befindet? MSDN läst sich zu diesem Thema nicht besonders aus; zumindest konnte ich nichts finden.

Allerdings liegt das vielleicht daran, das die Lösung mehr als einfach ist: Alles was man tun muss ist die Größe eines IntPtr anzusehen. Hat der Zeiger eine Größe von 8 Byte, dann befindet man sich in einer x64 Umgebung. (8 Byte mal 8 Bits => 64 bit).

Manche Dinge sind wirklich deutlich einfacher als man meinen sollte... :-)

Ausdruck von Navigationspunkten: Woher kommen die Überschriften?

Der Ausdruck von Navigationspunkten - bzw. der Ausdruck von deren Überschriften - ist ein wenig kompliziert. Um genau zu sein: Er funktioniert in der aktuellen nicht wirklich richtig.... was zwar bisher nicht wirklich viele Anwender gestört hat, es wird sich aber im nächsten Updaten trotzdem ändern - und hoffentlich besser werden :-)

Es bleibt aber dabei, das es vielleicht nicht auf den ersten Blick einsichtig ist, woher die Beschriftungen eigentlich kommen. Darum will ich hier einmal versuchen, das zu erklären. Beim Ausdruck eines Navigationspunktes gibt es bis zu zwei Überschriften. Die eine davon ist die Überschrift die angibt, welches Ergebnis gerade angezeigt wird. An dieser Überschrift kann man nichts umstellen und man kann sie auch nicht abschalten: Enthält der Navigationspunkt eine Ergebnisdarstellung, dann wird die Überschrift angezeigt. Enthält er keine, dann gibt es die Überschrift auch nicht.

Oberhalb der Ergebnisbeschreibung gibt es eine (optionale) weitere Überschrift. Diese zweite Überschrift kann man pro Navigationspunkt in der Ausdrucksteuerung ein- und ausschalten: Sie wird also entweder mit ausgegeben oder nicht. Wenn Sie ausgegeben wird, dann zeigt sie einen von zwei möglichen Texten an: Hat man im Navigationspunkt einen Kommentar eingegeben, dann wird der Kommentartext ausgegeben. Hat man keinen Kommentartext eingegeben, dann wird als Überschrift der Text "Abb.: " und der Name des Navigationspunktes ausgegeben.

Gestern in München: Vortrag von Oliver Scheer zu Silverlight 2

Etwa 4 Stunden rund um Silverlight 2: Wer es nicht weiss - Silverlight 2 ist im wesentlichen WPF im Browser (Safari, Firefox, IE), für verschiedene Systeme (OS/X, Windows, Linux [in Vorbereitung]) und auch auf verschiedenen Geräten (auch Telefone ohne Window Mobile).

Der Vortrag war nett und unterhaltsam, brachte aber nichts wirklich neues: Wer sich "von selbst" auf dem laufenden hält wird nicht viel gelernt haben - für alle anderen gab es eine schöne Rundum-Ansicht der zu Silverlight gehörenden Infrastruktur und deren Möglichkeiten. Besonders gefiel mir eines von Olivers Lieblingsausdrücken: Das Web 2.0 konforme Rechteck - mit runden Ecken... :-)

Jedenfalls kann ich den Vortrag jedem empfehlen, der sich auf die schnelle einen Einblick in Silverlight verschaffen will - es gibt, so glaube ich - auch noch ein paar Termine.

Von Managed C++ nach C++/CLI

In VS 2008 ist die Syntax von Managed C++ bereits deprecated - höchste Zeit, auf C++/CLI umzustellen. Die ausführliche Referenz dazu befindet sich hier: C++/CLI Migration Primer - ich denke für die meinsten Fälle kommt man aber mit einer Kurzfassung aus:

Zeiger
Ein Vorteil von C++/CLI über die "managed Extensions" ist die Tatsache, das viele Dinge viel schöner hingeschrieben werden können - und auch besser zu erkennen sind. Das geht mit Zeigern los: Ein Zeiger in den Managed Heap wird nun mit ^ statt mit * markiert:  Faselwurst^ pWurst zeigt also auf eine Instanz vom Typ Faselwurst, die sich im Managed Heap befindet.

Typen
Bisher wurde eine Klasse als gc__ class TypeName definiert - jetzt heist es statt dessen "ref class TypeName".

Arrays
Bisher war ein Array aus Instanzen im Managed Heap ein gc__[] variablenName TypeName. Das heist nun array<Type>(Dimension). Ein Zeiger auf so ein Array ist also ein array<Type>^ varName.

Properties
Die neue Syntax für Properties ähnelt doch sehr stark der von C#:
property int Zahl
{
    int get()
    {
    }
    void set( int v)
    {
        member = v;
    }
}

Interface-Implementierungen
Implementiert eine Klasse ein Interface, dann müssen die implementierten Member nun "virtual" sein.

Die bisher aufgeführten Änderungen sind weiter nicht dramatisch, sonfern man weiss, wie man die Dinge hinschreiben muss: Wirklich falsch machen kann man eigentlich nichts, denn der Compiler bewirft einen schon mit passenden Fehlermeldungen. Das ist in einem besonderen Fall aber nicht so, und dabei geht es um die Destruktoren. Das Problem: Der Compiler meckert hier nichts an, denn man kann zwar weiterhin die "alte" Destruktor-Notation verwenden: Dummerweise hat sich aber deren Semantik verändert. Macht man die Sache aber falsch und reagiert nicht auf die Semantik-Änderung, gibt es Speicher-Lecks im nativen Heap. Das passiert, wenn man eine C++/CLI Instanz hat, die als Member Zeiger auf den nativen Heap hat. Die Instanz an sich wird bei Notwendigkeit brav vom GC eingesammelt und verworfen. Dabei wird der normale Destruktor aber nicht unbedingt aufgerufen - zumindest nicht, wenn man nicht weiter tätig wird. Resultat: Leck. Das war früher nicht so - daher muss man auf diese Problematik gesondert achten. Die ausführliche Referenz zum Thema findet sich hier.

Im Wesentlichen läuft es aber auf folgendes hinaus: Damit die Destruktoren der C++/CLI Typen "richtig" aufgerufen werden, braucht man immer ein Konstrukt dieser Art:

ref class MyType
{
private:
   int* pNative;

// ..... weitere implementierungs-Details in deren Zuge pNative auf allozierten nativen Speicher zeigt.

public:
   // Das wird im IL ein Dispose()
   ~MyType() { Destruct(); }
   // Das wird im IL ein Finalizer.
   !MyType() { Destruct(); }

private:
   void Destruct()
   {
      if( pNative != 0)
      {
           delete pNative;
           pNative = 0;
      }
   }
};

Nur als Hinweis: Das ist so nicht unbedingt die effizienteste Methode, die Sache zu regeln - daher ist es u.U. ganz sinnvoll den oben verlinkten Artikel doch einmal genauer zu studieren.

Ersatzquerschnitte in der Baustatik

In der Baustatik erscheinen in den Dialogen für Querschnitte und Materialien immer nur die Elemente, die zu den eingangs ausgewählten Normen passen. Was aber, wenn man in einem gegebenen System Ersatzquerschnitte per A/I definieren will? Solche Querschnitte sind naturgegeben nicht Normbehaftet, und werden darum auch im normalen Querschnittsdialog nicht angeboten - denn sie passen ja "nie" zur ausgewählten Norm.

Man kann natürlich trotzdem Ersatzquerschnitte definieren, und das geht so: Zunächst wählt man den Befehl Datei -> Normen auswählen.

Der öffnet den Dialog zum hinzufügen von Normen zum aktuellen Dokument. Dort wählt man dann - ganz gleich, welche Norm(en) schon ausgewählt sind - zusätzlich die Option "Keine Norm".

Wenn man dann auf den Dialog für die Profileauswahl geht, erscheinen dort auch die nicht normbehafteten Querschnitte - und man kann neue per A/I definieren.

Baustatik hat einen Fehler entdeckt und muß beendet werden...

In letzter Zeit - um genau zu sein: Nach dem letzten Update - habe ich 2 "merkwürdige" Fehler gefunden, die aber dankbarerweise leicht zu beheben sind: Beide machen sich beim Start der Baustatik mit der oben genannten Fehlermeldung bemerkbar. Das Programm zeigt nur sein Logo und dann die Fehlermeldung an - starten tut es nicht.

Das erste Problem scheint mit dem "neue" Installationsprogramm zusammenzuhängen. Aus mir bisher noch immer unklaren Gründen wird manchmal die Komponente "vcredist_x86.exe" aus dem Installationsordner "vcredist_x86" nicht automatisch installiert. In allen unseren Testfällen klappt das natürlich wunderbar - nur gibt es ganz offenkundig Fälle auf Systemen von Kunden, bei denen diese Komponente nicht automatisch mit installiert wird. Wenn das passiert, gibts beim Programmstart die genannte Fehlermeldung. Ich versuche noch herauszufinden, woran das Problem eigentlich liegt - aber bis dahin kann man das Problem lösen, indem man diese Komponente einfach einmal von Hand installiert. (Ist das einmal geschehen braucht man das nicht wieder tun - auch nicht bei zukünftigen Updates: Zumindest so lange nicht, bis wir nicht wieder einmal die Entwicklungswerkzeuge wechseln [Also vermutlich Ende dieses Jahres :-)]).

Nummer 2 hat meiner Ansicht nach nichts mit der neuen Version des Installationsprogrammes zu tun: Aber in einem mir bekannten Fall lag eine "zerstörte" Installation der Baustatik vor, bei der teilweise DLLs einer alten und teilweise DLLs der aktuellen Version vorlagen. Sowas kann man eigentlich mit unserem Installationsprogramm gar nicht erzeugen - ich vermute, das da irgendwelche Anti-Viren (oder ähnliche) Programme im Spiel sind, und fröhlich die richtigen Dateiversionen durch falsche ersetzen - oder sowas in der Art. Das läßt sich aber folgendermaßen lösen: Einmal die "Baustatik" über die Systemsteuerung de-installieren und danach einfach nochmal installieren: Das entfernt alle "falschen" DLLs und stellt wieder eine funktionstüchtige Installation her.

Ausdruck von Überlagerungs-Ergebnissen: So wählt man die Bemessungs-Situation

Der komplette Ausdruck in der Baustatik wird über die Ausgabesteuerung kontrolliert. Wenn man Ergebnisse einmal nicht graphisch sondern tabellarisch ausdrucken will, dann kann man über die Ausgabesteuerung auch Einfluss darauf nehmen, was genau die Tabellen enthalten sollen. Auf jeder Ebene des Baumes der Ausgabesteuerung kann man dabei unterschiedliche Dinge festlegen, die dann "nach unten" vererbt werden. Um Einfluss auf den tabellarischen Ausdruck von Ergebnissen aus linearen Überlagerungsregeln zu nehmen, öffnet man zunächst den Baum an passender Stelle, und geht dann auf das Element, das man beeinflussen will.

Angenommen, man möchte die Bemessungssituation für den Ausdruck der Verformungen festlegen - dann braucht man folgendes Element:

Im unteren Bereich des Dialoges kann man dann die zugehörigen Parameter einstellen. Zur Auswahl der Bemessungssituation (und der Norm) klappt man die Normauswahl auf: Dort kann man dann alle Situationen auswählen, die man ausdrucken möchte. (Praktischerweise braucht man das alles aber normalerweise nicht zu tun - mit den Voreinstellungen des Programms werden im Allgemeinen schon die Dinge gedruckt, die man will...)

Graphiken mit der Baustatik ausgeben

Ich hatte heute eine Anfrage, ob es mit der Baustatik eine Möglichkeit gebe - abgesehen von einer Bildschirmhardcopy - Graphiken auf einem Drucker auszugeben. Und in der Tat - natürlich gibt es die: Um genau zu sein gibt es zur Zeit 4 Möglichkeiten.

1.) Per Zwischenablage und einem externen Programm
Dazu zeigt man eine Graphik an, wählt den Befehl Bearbeiten -> Kopieren, öffnet ein Graphikfähiges Programm (Word, Paint, etc.) und wählt dort Bearbeiten -> Einfügen.

2.) Per "Sofortbild"
(Diese Variante entspricht in Wesentlichem der Art und Weise, wie in Xpla gedruckt wurde.) Dazu zeigt man eine Graphik an und wählt dann Datei -> Drucken -> Sofortbild

3.) Per Navigationspunkt im normalen Ausdruckprotokoll
(Das ist die komfortabelste Variante, denn Navigationspunkte "überleben" auch Änderungen am System. Man kann also einen Navigationspunkt von einer Ergebnisgraphik anlegen, und dann das System verändern: Wird dann gedruckt, enthält der Navigationspunkt die Ergebnisse des geänderten Systems.). Dazu zunächst eine Graphik anzeigen, dann einen Navigationspunkt anlegen. Das geht mit dem Button mit der Kamera, oder oer per Erzeugen -> Navigationspunkt anlegen.

Alle Navigationspunkte erscheinen in der Ausgabesteuerung (Datei -> Drucken -> Ausgabesteuerung) und können dort einzeln ein- und ausgeschaltet werden.

4.) Für hochauflösende Graphiken mit "beliebigen" Auflösungen
Das geht mit dem Befehl "Bild aus Navigationspunkt". Der befindet sich im Objektmenü (rechtsklick) der Navigationspunkte in der Dokumenten-Ansicht.

Der neue Dialog für automatische Updates

Die Baustatik ist mit einem Mechanismus für automatische Updates ausgestattet. Wenn Sie das Programm starten, dann überprüft es, ob auf www.die.de eine neue Version vorliegt. Bisher passierte das alles im Hintergrund und wurde nur mit ein paar Meldungen im Meldungs-Fenster dokumentiert. Das führte allerdings zu einigen Problemen: Einige Kunden haben die Meldungen gar nicht gesehen und anderen fanden dann die heruntergeladene Update-Datei nicht mehr. Darum haben wir den Mechanismus grundlegend verändert - er ist nun viel sichtbarer, als das früher der Fall war.

Wenn das Programm gestartet wurde und eine neue Version verfügbar ist, dann erscheint nun folgende Dialogbox:

Mit den beiden Links rechts auf der Dialogbox öffnen Sie einen Web-Browser, der Hilfsinformationen von unserem Webserver anzeigt. Mit dem Button "Später erinnern" wird der Dialog geschlossen und es gibt erst beim nächsten Programmstart wieder einen Hinweis auf die Updates. Wenn Sie auf "Update herunterladen" klicken, dann öffnet sich ein normalen Datei-Speichern Dialog, mit dem Sie den Ort angeben können, wo die Update-Datei gespeichert werden soll. Danach ändert sich die Dialogbox und sieht so aus:

Der Fortschrittsmelder gibt an, wie weit der Download vorangeschritten ist. Bei mir dauert das mit Version 1.36 etwa eine Minute - das liegt aber nur daran, das das Update aus anderen Gründen dieses Mal sehr groß ausgefallen ist. Wenn einem die Sache zu lange dauert, dann kann man den Download per "Download abbrechen" beenden und das Update zu einem anderen Zeitpunkt herunterladen. Ist alles heruntergeladen, dann sieht der Dialog wie folgt aus:

Zu diesem Zeitpunkt kann man das Fenster mit "OK" schliessen. Danach sollte man das Programm beenden und die "Setup" Datei aus der heruntergeladenen ZIP-Datei ausführen: Erst dieser letzte Schritt installiert das Update auch tatsächlich.