Ein Makro zum auswählen und bearbeiten


Thomas Wölfer
Thomas Wölfer

04. Juli 2012


Heute kam die Frage auf, ob wir nicht ein Beispiel-Makro fürs auswählen und bearbeiten von Objekten hätten. Haben wir…

Der einfachste Weg ist natürlich der, einfach ein Objekt auszuwählen und dann den Eigenschaften-Dialog anzuzeigen. Fürs auswählen selbst braucht man kein Makro: Das geht ja “einfach so”. Ein Beispiel für das anzeigen des Eigenschaften-Dialoges gibt es im Makro “AuswahlBearbeiten”.

Was aber tun, wenn man in einer Schleife nacheinander mehrere Objekte auswählen und dann bearbeiten will. Also: Objekt auswähle, Objekt bearbeiten –> und dann wieder von vorne anfangen? Das ist etwas komplizierter (das vorige Makro ist ein Einzeiler), und darum gibts hier eine kurze Erklärung dazu, was das Ding tut. Der Quellcode dazu findet sich in “ObjektAuswählenUndBearbeiten”.

Neben dem normalen immer für Makros benötigten Kram gibt es im wesentlichen 3 Methoden:

1.) DoIt()

Das ist die Funktion, die die eigentliche Arbeit tut: Sie wird auch ganz am Anfang im Execute() des Makros aufgerufen. Das Ding tut folgendes:

  • Ein neues MouseTool vom Typ “ObjectSelectionMouseTool” erzeugen. MouseTools sind die Dinger, mit denen man in der Graphik interaktiv arbeiten kann. Wenn man z.B. in der Graphik mit der Maus irgendwo draufklickt und das angeklickte Objekt wird rot, dann war da das normale “SelectionMouseTool”. Wenn man mit der Maus einen Zoom durchführt, dann passiert das mit dem ZoomMouseTool etc.. Das ObjectSelectionMouseTool ist dafür da, ein (oder mehrere) Objekt(e) beliebigen Typs in der Graphik auszuwählen.
  • Das MouseTool hat mehrere Ereignisse, die man mitbekommen kann. Die beiden die man hier braucht sind “SelectCanceled” und “SelectFinished”. Das erste Ereignis tritt ein, wenn die Auswahl abgebrochen wurde (Rechte Maustaste gedrückt), das zweite tritt ein, wenn eine Auswahl durchgeführt und ein Objekt ausgewählt wurde.
  • Das Makro hängt sich nun an beide Ereignisse dran: Im Cancel-Fall wird dann die Methode Cancel() aufgerufen (die zeigt einfach nur eine Meldung an, damit man mitbekommt, das die Sache nun ein Ende hat), im anderen Fall wird Finished() aufgerufen.
  • Das MouseTool ist nun fertig und kann aktiviert werden. Das passiert mit FormBase.ActivateMouseTool().

2.) Cancel()

  • Tut wie gesagt nicht viel: Auf die Meldung darin kann man eigentlich verzichten, aber damit man hier im Beispiel mitbekommt, das irgendwas passiert, wird sie eben angezeigt.

3.) Finished()

  • Hier wird zunächst das erste der ausgewählten Objekte aus den Argumenten der Funktion extrahiert. Das Objekt ist garantiert vom Typ IDocObject (weil das MouseTool nichts anderes auswählen kann.). Das ganze sieht darum etwas kompliziert aus, weil das MouseTool eigentlich darauf ausgelegt ist, mehrere Objekte auszuwählen. In unserem Fall gibt es aber immer nur ein Objekt, und darum kann das aus dem Array-Parameter mit “[0]” rausgeholt werden.
  • Dann wird eine neue “DocObjectCollection” angelegt, und das eine ausgewählte Objekt wird in diese Sammlung reingesteckt. Die Sammlung braucht man – obwohl es nur um eine Element geht – weil auch der ganze restliche Code immer darauf ausgelegt ist, mehrere Objekte gleichzeitig zu bearbeiten.
  • Dann wird mit Hilfe des FactoryManagers ein Eigenschafts-Dialog erzeugt. Der Eigenschafts-Dialog ist dabei einer, der für den Typ Objekt zuständig ist, das ausgewählt wurde. Darum muss der Typ des Objektes übergeben werden. (Dieser Typ ist also der konkrete Typ “Beam”, “Node”, etc. – und nicht der “allgemeine” Fall “IDocObject”)
  • Als nächstes wird die zuvor vorbereitete Sammlung in den Dialog gesteckt.
  • Dann hängt sich der Code noch an das “Closed” Ereignis des Dialogs. Dieses Ereignis tritt ein, wenn das Fenster geschlossen wird. Ist das der Fall, wird wieder “DoIt” aufgerufen – die ganze Sache geht also wieder von vorne los.
  • Und schließlich wird die Dialogbox angezeigt.

Ich hoffe mal, mit dieser Erklärung wird das alles etwas klarer….