Thomas Woelfers Baustatik Blog

Baustatik-Software und was sonst des Weges kommt

Design Changes

Vor ein paar Tagen hatte ich ein wenig über den kommenden Dialog zum sortieren von Objekten geschrieben. Kurz darauf stellte sich aber heraus, das die Sache so wie ursprünglich gedacht doch nicht so besonders hilfreich ist. Darum funktioniert das ganze nun anders: Zum einen operiert das Umsortieren nur noch auf der Auswahl - die Typen-Auswahl auf dem Dialog ist nur noch dafür da, aus allen ausgewählten Objekten diejenigen mit dem passenden Typ rauszupicken.

Außerdem kann man beim neuen bennen der Objekte nun auch einen Präfix angeben: Damit beginnt der Name dann immer, eine Zahl wird hinten automatisch drangehangen.

Kommende Attraktionen

Beim Ausdruck der Eingabedaten (und auch in der Dokumenten-Ansicht) werden die Objekte zur Zeit in der Reihenfolge berücksichtigt, in der sie erzeugt wurden. Wenn man dann hin- und wieder Objekte löscht und neue erzeugt, dann kommen die Objekte dem Namen nach "durcheinander". Besonders wenn man viele Objekte erzeugt hat, verliert die Sache stark an Übersichtlichkeit.

Ab der nächsten Version kann man da zwei Dinge gegen unternehmen: Es gibt dann nämlich einen neuen Befehl, mit dem man verschiedene Objekte anhand diverser Eigenschaften neu sortieren kann: Damit kann man zum Beispiel die Knoten in aufsteigender X-Richtung sortieren. Außerdem kann man damit auch neue Namen für die Objekte vergeben - dann haben die Elemente "aufsteigende" Namen...

Windows Vista: Mein Lieblingsfeature

Mein absolutes Lieblingsfeature von Windows Vista: Das Media-Center (das leider nicht bei allen Versionen von Vista dabei ist.)

Um genau zu sein: Das Media-Center hat eine ganze Menge Funktionen, und die, die ich so mag, ist der digitale Videorekorder. Man steckt eine TV-Karte an (ich habe eine Cinergy DT von TerraTec) und schon hat man einen Videorekorder und einen Fernseher. Das Fernsehprogramm holt sich das Media-Center selbstständig aus dem Internet: Komplett mit Liste der Schauspieler, Beschreibung der Sendung, und allem was man sonst so von einem Fernsehprogramm will.

Man kann dann "ganz normal" Fernsehen - aber im laufenden Programm auch einfach auf "Pause" drücken, wenn man zum Beispiel kurz telefonieren muss. Aufnehmen tut das ganze natürlich auch: Dabei gibt es mehrere Geschmacksrichtungen. Zum einen kann man ähnlich wie bei einem Videorekorder einen Sender, eine Uhrzeit und einen Aufnahmezeitraum angeben.

Man kann aber auch im Fernsehprogramm einfach auf die Sendung klicken und den Befehl "aufnehmen" auswählen. Am besten finde ich aber eigentlich die Aufnahme per Suchbegriff. Dabei gibt man einfach einen (oder mehrere Suchbegriffe) ein - und das Media-Center nimmt dann alle Sendungen auf, in deren Titel, Beschreibung oder Schauspieler-Liste der Begriff auftaucht. Mit dem Begriff "Bruce Willis" wird zum Beispiel alles rund um den guten Mann aufgenommen: Egal auf welchem Sender und zu welcher Uhrzeit.

Objekte anhand von Eigenschaften auswählen

Mit dem Befehl Bearbeiten -> Objektauswahl kann man Objekte im Faltwerksprogramm anhand von 2 unterschiedlichen Möglichkeiten auswählen: Auf dem ersten Reiter des zugehörigen Dialoges geht das über ihre Position im Raum, auf dem zweiten besteht die Möglichkeit, Objekte anhand ihrer Eigenschaften auszuwählen. Damit kann man dann zum Beispiel alle Stäbe auswählen, die einen bestimmten Querschnitt verwenden.

In diesem Zusammenhang gibt es aber noch eine "Spezialfunktion", die ein bisschen schwer zu finden ist: Wenn es sich bei der Eigenschaft um einen numerischen Wert handelt, dann kann man ein bisschen Unschärfe einbauen: Dazu gibt man einen Wertebereich vor.

Will man zum Beispiel alle Knoten die eine X-Koordinate im Bereich von -1 bis +1 haben auswählen, dann gibt man für "X" folgendes ein: 0.0:1.0.

Dadurch wird ein Bereich um den Wert "0" definiert, der einen Ausdehnung von "1" hat - also von -1 bis +1 geht. Drückt man dann auf "Zur Auswahl hinzufügen", dann werden alle Knoten mit X-Koordinaten innerhalb dieses Bereiches ausgewählt.

Symptom: Visual Studio 2005 stürzt schlagartig ab

Sowas kann man ganz leicht produzieren, nur wenn es dann passiert, kann man sich natürlich nicht mehr dran erinnern. Ich zumindest nicht.

Folgende Situation: Man hat eine Solution mit 2 Windows.Forms Projekten. Im einem Projekt baut man ein UserControl, im anderen ist eine Form, die das UserControl verwendet. Man wechselt in das Projekt mit dem User Control, weil man zum Beispiel ein zusätzliches Label, das das Control enthält, herausführen will. Dazu baut man folgenden Code ein:

private Label label;
public Label Label
{
   get { return this.Label; }
}

Das übersetzt sich ganz prima. Jetzt geht man zurück in das andere Projekt, und öffnet die Form, die das UserControl verwendet, um dort den Text des Labels zu setzen. Resultat: Visual Studio verabschiedet sich direkt und vollständig aus dem Speicher.

Grund: Der Property-Getter fürs Label wird vom Forms-Designer aufgerufen - und verursacht dann einen Stack-Überlauf, mit dem Visual Studio nicht klarkommt. Es müsste halt "return this.label" heissen...

Die Sache mit dem TypeDescriptionProvider

Seit .Net 2.0 gibt es mehr als eine Methode, einen CustomTypeDescriptor an eine Klasse zu hängen: Vorher gab es nur die Möglichkeite ICustomTypeDescriptor zu implementieren - seitdem gibt es auch eine weitere Methode, und die basiert auf dem TypeDescriptionProvider.

Die Dokumentation dazu ist allerdings, gelinde gesagt, nicht besonders aussagekräftig. Was man zunächst wissen muss ist die Tatsache, das man einen TypeDescriptionProvider über zwei Methoden mit einem Typ verknüpfen kann.

  1. Per Attribut an der Klassen und
  2. Dynamisch zur Laufzeit

Für den 2. Fall gibt es bei Partho eine ganz gute Beschreibung. Will man die Sache aber als Attribut benutzen, wird es unübersichtlich. (Ich habe jedenfalls heute relativ lange damit gekämpft.). Folgendes ist zu tun:

1. Die Klasse wird per TypeDescriptionProvider-Attribut mit dem Provider verknüpft.

[TypeDescriptionProvider(typeof(MyTypeDescriptionProvider))]
public class MyClass
{

2. Jetzt braucht man den Provider. Um den zu bauen ist es wichtig zu wissen, das die Provider als Stack vorliegen - man kann also mehrer Schichten von Providern übereinander lagern. Beim erzeugen des Providers muss der "Parent" Provider angegeben werden - sonst endet man hinterher ganz ohne Metadaten. Ist man in der ersten Schicht, dann ist der "Parent" Provider der ursprüngliche des behandelten Typs. Die Basisklasse des eigenen Providers ist einfach TypeDescriptionProvider. Die Klasse muss mindestens eine Methode überladen, und zwar die, die den eigentlichen CustomTypeDescriptor liefert:

public sealed class MyTypeDescriptionProvider : TypeDescriptionProvider
{
   public MyTypeDescriptionProvider()
   :
base(TypeDescriptor.GetProvider(typeof(MyClass)))
   {}

   public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
   {
      return new MyTypeDescriptor(base.GetTypeDescriptor(objectType, instance));
   }
}

3. Jetzt braucht es nur noch den Provider selbst. Wenn der zum Beispiel GetProperties() überladen soll, dann ist es dafür nur wichtig, die "ursprünglichen" Properties nicht per TypeDescriptor.GetProperties() zu erfragen (sonst gibts logischerweise einen Stack-Überlauf (logischerweise: Ist wirklich logisch, hat mich aber trotzdem mindestens eine Stunde gekostet :-)), sondern die passende Methode der Basisklasse. Ach ja: Auch der eigene CustomTypeDescriptor hat ein "Parent". Das ganze sieht dann so aus:

    public sealed class MyTypeDescriptor : CustomTypeDescriptor
    {
        public MyTypeDescriptor(ICustomTypeDescriptor parent)
            : base(parent)
        {
        }

        public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
        {
            PropertyDescriptorCollection result = base.GetProperties(attributes);
            // hier wäre eine gute stelle, an den props rumzufummeln
            return result;
        }

    }