Macros for Dummies - A MapTool Macro-Tutorial (german)

Doc requests, organization, and submissions

Moderators: dorpond, trevor, Azhrei

Post Reply
Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

14.7 - CSS im Header

Stelle dir vor du hast ein Makro mit drei Tabellen, und möchtest für jede dieser Tabellen einen Rahmen mit fünf Pixel Breite festlegen. Dann müsstest du die entsprechenden CSS-Anweisungen natürlich in jeder der drei Tabellen notieren. Das ist etwas mühselig, aber zum Glück geht es auch einfacher.

Im Kopfbereich eines HTML-Dokuments (<head>...</head>), auch "Header" genannt, kannst du für beliebige Elementtypen generelle Formatierungen festlegen. Du kannst also z. B. angeben, dass jede Tabelle innerhalb dieses Dokuments einen Rahmen erhält. Das spart natürlich eine Menge Schreibarbeit, da du nicht mehr jede Tabelle einzeln formatieren musst.

Die CSS-Anweisungen werden dabei innerhalb des style-Elemets notiert:

Code: Select all

<style>...</style>
Dort wird nun der Elementtyp angegeben, und dahinter die gewünschten Eigenschaften innerhalb geschweifter Klammer:

Code: Select all

table {border-width: 5px}
Natürlich können auch hier wieder mehrere Eigenschaften angegeben werden. Diese werden dann wie gewohnt durch ein Semikolon (;) voneinander getrennt:

Code: Select all

table {border-width: 5px; border-style: solid}
Wenn du möchtest kannst du natürlich auch für mehrere Elementtypen zentrale Formatierungen festlegen, schreibe sie dann einfach untereinander. Sagen wir, zusätzlich soll der Text in Tabellenzellen fett dargestellt werden:

Code: Select all

table {border-width: 5px; border-style: solid}
td {font-weight: bold}
Nun gibt es da aber noch ein Problem. Hast du es schon erkannt? Genau: die geschweiften Klammern. MapTool erwartet innerhalb geschweifter Klammern natürlich Makro-Befehle, dabei geht es ja nur um CSS-Anweisungen. Also notieren wir diese Anweisungen einfach als String:

Code: Select all

[r: "table {border-width: 5px; border-style: solid}
td {font-weight: bold}"]
Der Kopfbereich des HTML-Dokuments sieht am Schluss also so aus:

Code: Select all

<head>
  <title>
    CSS im Header
  </title>
  <style>
    [r: "table {border-width: 5px; border-style: solid}
    td {font-weight: bold}"]
  </style>
</head>
Und jetzt in einem kompletten Beispiel:

Code: Select all

[dialog("cssheader"): 
  {
    <html>
      <head>
        <title>
          CSS im Header
        </title>
        <style>
          [r: "table {border-width: 5px; border-style: solid}
          td {font-weight: bold}"]
        </style>
      </head>
      <body>
        <table>
          <tr>
            <td>
              Tabelle 1
            </td>
          </tr>
        </table>
        <br><br>
        <table>
          <tr>
            <td>
              Tabelle 1
            </td>
          </tr>
        </table>
      </body>
    </html>
  }
]
Denke daran: Das funktioniert nur in Fenstern, also Frames und Dialogen. Wenn du etwas in der Chatbox ausgibst kannst du den HTML-Aufbau nicht benutzen, bzw. hat er dort keine Wirkung. Bei der Ausgabe in der Chatbox musst du also doch wieder die CSS-Anweisungen direkt in den betroffenen Elementen angeben.

Achtung: In MapTool v1.3.b91 (und eventuell auch v1.3.b89) kann es in Verbindung mit JAVA 8 zu einem Fehler kommen, wenn du auf diese Weise mehr als sieben CSS-Anweisungen, bzw. Styles, in einem Makro festlegst. Wenn du die Anweisungen, wie bisher üblich, direkt in den HTML-Elementen notierst gibt es kein Limit. Ab MapTool v1.4 ist dieses Problem behoben.

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

14.8 - CSS auslagern

Statt die CSS-Anweisungen im Header zu notieren kannst du sie auch zentral in einem eigenen Makro notieren. Das nennt man dann ein Stylesheet. Auf dieses Makro kann dann jedes andere Makro zugreifen. Du musst die CSS-Anweisungen also nur einmal festlegen und kannst sie dann in jedem Makro nutzen. Praktisch, oder?

Probieren wir das doch aus. Erstelle zuerst ein neues Token, und zwar ein Library Token wie in Kapitel "3.1 - Wo werden Makros gespeichert?" beschrieben. Gib diesem Token den Namen "Lib:cssdesign". Erstelle in diesem Token ein neues Makro mit dem Namen "styles". In diesem Makro notierst du nun nur deine CSS-Anweisungen so wie im letzten Kapitel beschrieben, allerdings nicht als String (das ist wichtig). Wir bleiben auch beim selben Beispiel mit den Formatierungs-Anweisungen zu Tabellen (<table>) und Tabellenzellen (<td>). Der gesamte Inhalt des Makros ist also:

Code: Select all

table {border-width: 5px; border-style: solid}
td {font-weight: bold}
Das war es auch schon. Möchtest du nun in einem beliebigen Makro diese CSS-Anweisungen nutzen, musst du dort nur auf das Makro "styles" verweisen. Dieser Verweis wird auch wieder im Header notiert. Das sieht dann so aus:

Code: Select all

<link href='styles@Lib:cssdesign' rel='stylesheet' type='text/css'>
Das nötige HTML-Element ist also "link" und steht für sich alleine. Die Attribute "rel" und "type" müssen immer so angegeben werden wie im Beispiel, eine nähere Erklärung spare ich mir daher. Das Attribut "href" enthält als Wert nun den eigentlichen Verweis zu dem Makro mit den CSS-Anweisungen. Der Wert besteht aus dem Namen des Makros (styles) gefolgt von einem At-Zeichen (@), das oft auch Klammeraffe oder Affenschwanz genannt wird, und endet mit dem Namen des Tokens in dem das Makro gespeichert ist (Lib:cssdesign). Der gesamte Header sieht dann also so aus:

Code: Select all

<head>
  <title>
    CSS auslagern
  </title>
  <link href='styles@Lib:cssdesign' rel='stylesheet' type='text/css'>
</head>
Probiere es aus. Erstelle ein weiteres Makro, jetzt wieder im Kampagnenfenster, und verweise darin auf das Makro mit den CSS-Anweisungen. Vergiss nicht ein oder zwei Tabellen hinzuzufügen, damit du auch siehst, dass die CSS-Anweisungen Wirkung zeigen. Als Beispiel:

Code: Select all

[dialog("cssextern"): 
  {
    <html>
      <head>
        <title>
          CSS auslagern
        </title>
        <link href='styles@Lib:cssdesign' rel='stylesheet' type='text/css'>
      </head>
      <body>
        <table>
          <tr>
            <td>
              Tabelle 1
            </td>
          </tr>
        </table>
        <br><br>
        <table>
          <tr>
            <td>
              Tabelle 1
            </td>
          </tr>
        </table>
      </body>
    </html>
  }
]
Denke daran: Das funktioniert nur in Fenstern, also Frames und Dialogen. Wenn du etwas in der Chatbox ausgibst kannst du den HTML-Aufbau nicht benutzen, bzw. hat er dort keine Wirkung, und damit auch nicht der Verweis. Bei der Ausgabe in der Chatbox musst du also doch wieder die CSS-Anweisungen direkt in den betroffenen Elementen angeben.

Achtung: In MapTool v1.3.b91 (und eventuell auch v1.3.b89) kann es in Verbindung mit JAVA 8 zu einem Fehler kommen, wenn du auf diese Weise mehr als sieben CSS-Anweisungen, bzw. Styles, in einem Makro festlegst. Wenn du die Anweisungen, wie bisher üblich, direkt in den HTML-Elementen notierst gibt es kein Limit. Ab MapTool v1.4 ist dieses Problem behoben.

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

14.9 - Klassen

CSS-Anweisungen im Header eines Makros oder zentral in einem anderen Makro als Stylesheet festzulegen ist schon eine praktische Sache. Jetzt gehen wir aber noch einen Schritt weiter. Was wäre z. B., wenn du in einem Makro fünf Tabellen hättest, aber nur zwei davon einen Rahmen erhalten sollen? Da die bisherigen Möglichkeiten ja immer auf alle Elemente eines bestimmten Elementtyps angewandt werden, müsstest du dafür also doch wieder die Tabellen einzeln formatieren. Die Lösung ist das Definieren von Klassen.

Das Definieren einer Klasse funktioniert genauso wie das Festlegen von CSS-Anweisungen für einen bestimmten Elementtyp, und kann ebenfalls im Header oder in einem Stylesheet geschehen. Die Klasse selbst kann beliebige CSS-Anweisungen enthalten. Der Name einer Klasse beginnt immer mit einem Punkt (.) und darf keine Leer- oder Sonderzeichen enthalten. Hinter dem Namen kommt dann ein Leerzeichen und dann die CSS-Anweisungen in geschweiften Klammern.

Erstellen wir also zwei Klassen: für einen dicken Rahmen und für fett dargestellten Text. Im Header würde das so aussehen:

Code: Select all

<head>
  <title>
    CSS Klassen
  </title>
  <style>
    [r: ".rahmenDick {border-width: 5px; border-style: solid}
    .textFett {font-weight: bold}"]
  </style>
</head>
Wir benutzen aber das Stylesheet, also das Makro "styles". Lösche die alten Eintragungen und schreibe die Klassen hinein:

Code: Select all

.rahmenDick {border-width: 5px; border-style: solid}
.textFett {font-weight: bold}
Gut, jetzt hast du zwei Klassen erstellt. Diese Klassen kannst du jetzt beliebigen HTML-Elementen zuweisen. Dadurch werden die CSS-Anweisungen dieser Klasse automatisch auf das Element angewandt. Um eine Klasse einem Element zuzuweisen, benutzt du das Attribut "class" und gibst als Wert den Namen der Klasse an, allerdings ohne den Punkt am Anfang. Ein Beispiel:

Code: Select all

<span class='textFett'>...</span>
Beachte, dass du einem Element immer nur eine Klasse zuweisen kannst. Schauen wir uns das jetzt an einem komplette Beispiel an. Erstelle also ein neues Makro mit einem Fenster und verweise im Header auf das Stylesheet mit den Klassen. Dann erstellst du im Inhalt eine Tabelle mit zwei Zellen. Der Tabelle selbst weist du die Klasse "rahmenDick" zu, und der zweiten Zelle die Klasse "textFett". Los gehts:

Code: Select all

[dialog("klassentest"): 
  {
    <html>
      <head>
        <title>
          CSS Klassen
        </title>
        <link href='styles@Lib:cssdesign' rel='stylesheet' type='text/css'>
      </head>
      <body>
        <table class='rahmenDick'>
          <tr>
            <td>
              Zelle 1
            </td>
            <td class='textFett'>
              Zelle 2
            </td>
          <tr>
        <table>
      </body>
    </html>
  }
]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

15 - Bastelstunde II: Ein Charakterbogen

15.1 - Das Makro

In diesem Beispiel basteln wir einen kleinen Charakterbogen und verwenden dabei die Properties, die wir bereits in den Kampagneneigenschaften festgelegt haben. Es ist wirklich nur ein ganz kleiner Charakterbogen, aber für den Anfang soll das reichen.

Image

Zuerst schauen wir uns das gesamte Makro an, anschließend folgt die Schritt für Schritt Erklärung.

Code: Select all

[h: assert(hasImpersonated(), "Bitte erst einen Spielstein verkörpern.", 0)]

[frame("charbogen", "width=300; height=300; temporary=1"):
  {
    <html>
      <head>
        <title>
          Charakterbogen
        </title>
      </head>
      <body>
        <table style='border-spacing: 0px; background-color: #008000; width: 218'>
          <tr>
            <td style='text-align: center; padding: 6px'>
              <img src='[r: getTokenImage(50)]'>
            </td>
            <td style='font-size: 14pt; font-weight: bold; color: #ffffff; width: 150'>
              [r: getImpersonatedName()]
            </td>
          </tr>
        </table>
        <table style='color: #044004; border-spacing: 0px; border: 2px solid #008000; border-top: none; background-color: a4c8a4; width: 214'>
          <tr>
            <td valign='middle'>
              <table style='border-spacing: 0px'>
                <tr>
                  <td>
                    Stärke
                  </td>
                  <td style='text-align: right'>
                    [r: Staerke]
                  </td>
                </tr>
                <tr>
                  <td>
                    Geschick
                  </td>
                  <td style='text-align: right'>
                    [r: Geschick]
                  </td>
                </tr>
                <tr>
                  <td>
                    Klugheit
                  </td>
                  <td style='text-align: right'>
                    [r: Klugheit]
                  </td>
                </tr>
              </table>
            </td>
            <td style='width: 20px'>
               
            </td>
            <td>
              <table style='border-spacing: 0px'>
                <tr>
                  <td>
                    Angriff
                  </td>
                  <td style='text-align: right'>
                    [r: Angriff]
                  </td>
                </tr>
                <tr>
                  <td>
                    Verteidigung
                  </td>
                  <td style='text-align: right'>
                    [r: Verteidigung]
                  </td>
                </tr>
                <tr>
                  <td>
                    Rüstung
                  </td>
                  <td style='text-align: right'>
                    [r: Ruestung]
                  </td>
                </tr>
                <tr>
                  <td>
                    Hitpoints
                  </td>
                  <td style='text-align: right'>
                    [r: HP]
                  </td>
                </tr>
              </table>
            </td>
          </tr>
        </table>
      </body>
    </html>
  }
]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

15.2 - Die Erklärung

In Ordnung, schauen wir uns das Makro näher an. Beachte, dass jede Tabelle mit border: 0px formatiert wird, damit es keinen störenden Rahmenabstand gibt. Um das Beispiel einfacher zu halten verzichten wir auf zentrale CSS-Angaben im Header oder in einem Stylesheet.

Code: Select all

[h: assert(hasImpersonated(), "Bitte erst einen Spielstein verkörpern.", 0)]
Zuerst prüfen wir mit hasImpersonated() ob der User einen Token verkörpert hat. Diese Prüfung packen wir in eine assert()-Abfrage. Sollte also kein Token verkörpert sein erscheint eine Fehlermeldung und das Makro wird abgebrochen.

Code: Select all

[frame("charbogen", "width=300; height=300; temporary=1"):
  {
    <html>
      <head>
        <title>
          Charakterbogen
        </title>
      </head>
      <body>
Hier erstellen wir ein Fenster, in diesem Fall ein Frame, in dem der Charakterbogen angezeigt werden soll. Anschließend folgt der Anfang des HTML-Aufbaus inkl. dem Titel für das Fenster (Charakterbogen).

Code: Select all

<table style='border-spacing: 0px; background-color: #008000; width: 218'>
  <tr>
    <td style='text-align: center; padding: 6px'>
      <img src='[r: getTokenImage(50)]'>
    </td>
    <td style='font-size: 14pt; font-weight: bold; color: #ffffff; width: 150'>
      [r: getImpersonatedName()]
    </td>
  </tr>
</table>
Jetzt kommt die erste Tabelle, in der wir Tokenbild und Tokenname unterbringen. Für die Tabelle legen wir mit width eine Breite von 218 Pixel fest und wählen mit background-color ein dunkles Grün als Hintergrundfarbe.

Code: Select all

<td style='text-align: center; padding: 6px'>
  <img src='[r: getTokenImage(50)]'>
</td>
Die erste Zelle im Detail: Wir zeigen mit dem HTML-Element img das Tokenbild an. Um an die asset-Adresse des Bildes zu kommen benutzen wir die Funktion getTokenImage(), und geben als Parameter "50" an damit das Tokenbild in einer Breite von 50 Pixel angezeigt wird. Die Tabellenzelle selbst formatieren wir noch mit text-align, damit das Tokenbild zentriert in der Zelle angezeigt wird, und mit padding, damit das Bild noch einen etwas größeren Abstand zum Zellenrahmen bekommt. Das sieht einfach besser aus.

Code: Select all

<td style='font-size: 14pt; font-weight: bold; color: #ffffff; width: 150'>
  [r: getImpersonatedName()]
</td>
Die zweite Zelle im Detail: Mit getImpersonatedName() lassen wir den Tokennamen anzeigen. Der Tokenname soll sich deutlich abheben, also sorgen wir in der Tabellenzelle mit font-size für eine etwas größere Schrift, mit font-weight für fetten Text, und mit color legen wir als Schriftfarbe "Weiß" fest. Außerdem legen wir mit width eine Breite von 150 Pixel für die Zelle fest. Da die Tabelle selbst eine Breite von 218 Pixel hat, wird der restliche Platz also für die erste Tabellenzelle mit dem Tokenbild genutzt.

Code: Select all

<table style='color: #044004; border-spacing: 0px; border: 2px solid #008000; border-top: none; background-color: a4c8a4; width: 214'>
  <tr>
    <td valign='middle'>
      Platzhalter für Tabelle mit Eigenschaftswerten
    </td>
    <td style='width: 20px'>
       
    </td>
    <td>
      Platzhalter für Tabelle mit Kampfwerten
    </td>
  </tr>
</table>
Jetzt kommt die zweite Tabelle, die sich nahtlos an die erste anschließt. Im Charakterbogen ist also kein Abstand zwischen diesen beiden Tabellen zu erkennen. Die Tabelle hat eine Zeile mit drei Zellen und dient nur zur Struktur und zum Design.

In die erste Zelle tragen wir in Kürze eine weitere Tabelle mit den Eigenschaftswerten des Tokens ein. Die dritte Zelle benötigt in der Höhe mehr Platz, da es vier Kampfwerte aber nur drei Eigenschaftswerte gibt. Mit valign='middle' sorgen wir also dafür, dass die Tabelle mit den Eigenschaftswerten in der ersten Zelle vertikal zentriert angezeigt wird.

Die zweite Zelle mit einer Breite von 20 Pixel soll nur als Abstandshalter zwischen Eigenschaftswerten und Kampfwerten dienen, deswegen ist in der Zelle nur ein Leerzeichen eingetragen.

Dann kommt die dritte Zelle, in der wir in Kürze die Tabelle mit den Kampfwerten eintragen werden.

In der gesamten Tabelle sorgen wir mit color für eine andere Schriftfarbe, in unserem Fall ein sehr dunkles Grün. Mit border legen wir einen zwei Pixel breiten Rahmen fest, dessen Farbe dem Hintergrund unserer ersten Tabelle mit Tokenbild und Tokennamen entspricht. So wirkt nachher alles wie aus einem Guss. Die obere Seite der Tabelle sollte natürlich keinen Rahmen bekommen, sonst wirken die Abstände in der ersten Tabelle nicht mehr richtig. Mit border-top: none verhindern wir also die Anzeige des Rahmens an der oberen Seite.

Als Hintergrundfarbe für diese Tabelle bestimmen wir mit background-color ein helles Grün, und mit width legen wir eine Breite von 214 Pixel fest. Das sind vier Pixel weniger als die Breite der ersten Tabelle, aber wir dürfen ja auch nicht vergessen, dass noch der Rahmen links und rechts jeweils zwei Pixel breit ist.

Code: Select all

<table style='border-spacing: 0px'>
  <tr>
    <td>
      Stärke
    </td>
    <td style='text-align: right'>
      [r: Staerke]
    </td>
  </tr>
  <tr>
    <td>
      Geschick
    </td>
    <td style='text-align: right'>
      [r: Geschick]
    </td>
  </tr>
  <tr>
    <td>
      Klugheit
    </td>
    <td style='text-align: right'>
      [r: Klugheit]
    </td>
  </tr>
</table>
Das hier ist nun die Tabelle mit den Eigenschaftswerten, die den Platzhalter in der ersten Zelle der obigen Tabelle ersetzt. Die Tabelle hat drei Zeilen mit je zwei Zellen, in denen der Name der Eigenschaft und der Eigenschaftswert (durch Abrufen des passenden Properties) angezeigt wird. Die Zellen mit den eigentlichen Werten formatieren wir mit text-align, damit die Werte rechtsbündig in der Zelle ausgerichtet werden. Das sieht besser aus falls einige Werte aus zwei Stellen, und andere Werte nur aus einer Stelle bestehen, denn die Werte werden ja untereinander angezeigt.

Code: Select all

<table style='border-spacing: 0px'>
  <tr>
    <td>
      Angriff
    </td>
    <td style='text-align: right'>
      [r: Angriff]
    </td>
  </tr>
  <tr>
    <td>
      Verteidigung
    </td>
    <td style='text-align: right'>
      [r: Verteidigung]
    </td>
  </tr>
  <tr>
    <td>
      Rüstung
    </td>
    <td style='text-align: right'>
      [r: Ruestung]
    </td>
  </tr>
  <tr>
    <td>
      Hitpoints
    </td>
    <td style='text-align: right'>
      [r: HP]
    </td>
  </tr>
</table>
Das hier ist die Tabelle mit den Kampfwerten, die den Platzhalter in der dritten Zelle der obigen Tabelle ersetzt. Die Tabelle ist genauso aufgebaut wie die Tabelle mit den Eigenschaftswerten. Eine nähere Erklärung spare ich mir also.

Code: Select all

      </body>
    </html>
  }
]
Jetzt kommen noch die abschließenden HTML-Tags und die Klammern zum Schließen des Fensters (Frame). Fertig, der Charakterbogen ist einsatzbereit!

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

16 - Makros aufrufen

16.1 - Die Makro Roll-Option

Es gibt verschiedene Möglichkeiten Makros aufzurufen. Einige davon zeige ich dir, und mit der Makro Roll-Option fangen wir an. Zum Testen erstellst du erst mal ein neues Library-Token nach den bekannten Regeln und nennst es "Lib:makros". Erstelle in dem Library-Token ein neues Makro mit dem Namen "beispieltext". Mit dem Makro wollen wir einen einfachen Text in der Chatbox ausgeben, der Inhalt ist also:

Code: Select all

[r: "Das ist ein Beispieltext."]
Erstelle jetzt ein neues Makro im Kampagnenfenster (Campaign). Mit diesem Makro rufen wir das Makro im Library-Token auf. Schauen wir uns erst das Format dafür an:

Code: Select all

macro("makro-name@makro-speicherort"): makro-argument
Die nötigen Angaben im Detail:

makro-name
Der Name des aufzurufenden Makros.

makro-speicherort
Der Speicherort des aufzurufenden Makros.

makro-argument
Die Daten, die du an das aufzurufende Makro übergeben willst. Das kann ein String oder eine Variable sein. Willst du keine Daten weitergeben, notiere einfach einen leeren String, also zwei doppelte Anführungszeichen ("").

Und hier nun der Befehl um das Makro im Library-Token aufzurufen. Probiere es aus:

Code: Select all

[macro("beispieltext@Lib:makros"): ""]
Kombination mit hide

Die Makro Roll-Option lässt sich natürlich auch mit anderen Roll-Options kombinieren, also auch mit hide. Dabei musst du jedoch beachten, dass der gesamte Output den das aufzurufende Makro normalerweise ausgeben würde eben nicht ausgegeben wird, da das Makro mit hide aufgerufen wurde. Wiederhole das letzte Beispiel, aber rufe das Makro jetzt in Kombination mit hide auf:

Code: Select all

[h,macro("beispieltext@Lib:makros"): ""]
Wie du siehst, siehst du nichts. Das Makro "beispieltext" wird zwar ausgeführt, aber vom Output des Makros, in unserem Fall also der String "Das ist ein Beispieltext.", ist dieses mal nichts in der Chatbox zu sehen.


Speicherort angeben

Im obigen Beispiel haben wir als Speicherort für das auszuführende Makro das Library-Token "Lib:makros" angegeben. Makros lassen sich aber natürlich auch an anderen Stellen speichern. Hier alle Möglichkeiten die du als Speicherort angeben kannst:

campaign
Das Kampagnenfenster (Campaign).

global
Das Fenster "Allgemein" (Global).

TOKEN
Das aktuell verkörperte (impersonated) Token.

Lib:*
Ein beliebiges Library-Token, wobei das Sternchen (*) durch den eigentlichen Namen ersetzt werden muss (also z. B. "Lib:makros").

this
Wenn du in einem Makro, das in einem Library-Token gespeichert ist, ein anderes Makro aufrufst, das in dem gleichen Library-Token gespeichert ist, kannst du statt des vollen Namens des Library-Tokens (z. B. "Lib:makros") auch einfach "this" angeben.


Daten weitergeben

Wie bereits weiter oben angedeutet lassen sich auch Daten vom aktuellen, also vom aufrufenden Makro, zum aufzurufenden Makro weitergeben. Das kann ein einfacher String sein:

Code: Select all

[macro("beispieltext@Lib:makros"): "Ein wenig Text"]
Eine Zahl:

Code: Select all

[macro("beispieltext@Lib:makros"): 5]
Oder eine Variable:

Code: Select all

[h: wuerfelergebnis = 1d6]
[macro("beispieltext@Lib:makros"): wuerfelergebnis]
Denke daran: In eine Variable kannst du alles Mögliche reinpacken. So lassen sich z. B. auch String-Property-Lists, JSON-Objects oder eine ganze HTML-Tabelle weitergeben. Wobei beispielsweise eine String-Property-List ja auch wie ein String notiert wird (also innerhalb doppelter Anführungszeichen), und somit auch direkt angegeben werden könnte:

Code: Select all

[macro("beispieltext@Lib:makros"): "item1=Pistole; item2=Munition; item3=Halfter"]
Daten empfangen

Daten die du weitergibst müssen vom aufzurufenden Makro natürlich auch irgendwie empfangen werden, damit du diese Daten dann auch weiterverwenden kannst. Das geht mit der Spezialvariable macro.args, in der von MapTool automatisch die weitergegebenen Daten gespeichert werden. Diese Spezialvariable musst du in dem aufzurufenden Makro dann nur noch abrufen.

Probiere es mit einem einfachen String aus. Hier der Code für das aufrufende Makro:

Code: Select all

[macro("beispieltext@Lib:makros"): "Ein wenig Text"]
Und hier der Code für das aufzurufende Makro, also das Makro "beispieltext" im Library-Token:

Code: Select all

[r: macro.args]
Und jetzt noch ein Beispiel mit einer Variable. Ändere dafür nur das aufrufende Makro, der Code im aufzurufenden Makro kann so stehen bleiben wie im letzten Beispiel.

Code: Select all

[h: wuerfelergebnis = 1d6]
[macro("beispieltext@Lib:makros"): wuerfelergebnis]
Besonders für die Übersicht kann es im aufzurufenden Makro hilfreich sein die Spezialvariable zuerst einer normalen Variable zuzuordnen, bevor du die Daten dann nutzt. Also z.B.:

Code: Select all

[h: neueDaten = macro.args]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

16.2 - Makro in Makro ausgeben

Wenn du ein Makro innerhalb eines Makros aufrufst, kannst du auch den Output des aufzurufenden Makros, also das was das Makro nachher in der Chatbox oder in einem Fenster anzeigen würde, im aufrufenden Makro anzeigen lassen. Ein kleines Beispiel:

Erstelle im Kampagnenfenster (Campaign) ein neues Makro und benenne es wie du möchtest. Der Inhalt des Makros:

Code: Select all

Zeile 1
<br>
[r,macro("makroB@Lib:makros"): ""]
<br>
Zeile 3
Jetzt erstelle im Library-Token "Lib:makros" das neue Makro mit dem Namen "makroB". Der Inhalt:

Code: Select all

[r: "Zeile 2"]
Fertig, probiere es aus. Beachte aber: Du kannst in beiden Makros normalen Makro-Code verwenden, also auch Variablen. Es bleiben aber trotzdem zwei verschiedene Makros. Das bedeutet, dass du Variablen die du im aufrufenden Makro erstellt hast, nicht im aufzurufenden Makro verwenden kannst. Und umgekehrt funktioniert das selbstverständlich auch nicht. Mit Hilfe der verwendeten Makro Roll-Option kannst du aber natürlich weiterhin Daten an das aufzurufende Makro weitergeben.

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

16.3 - Ergebnisse zurückliefern

Du kannst innerhalb eines Makros ein weiteres Makro ausführen und dir eine Variable dieses Makros zurückliefern lassen, damit du im aufrufenden Makro dann damit weiterarbeiten kannst. Der zurückgelieferte Wert wird in der Spezialvariable macro.return gespeichert. Aber schauen wir uns das an einem richtigen Beispiel an:

Das aufrufende Makro

Erstelle ein neues Makro im Kampagnenfenster (Campaign) und nenne es wie du möchtest. Mit diesem Makro wollen wir ein Würfelergebnis in der Chatbox ausgeben, den Würfelwurf selbst aber in einem anderen Makro erledigen.

Code: Select all

Wurf mit 1W6:
[h,macro("wuerfel@Lib:makros"): ""]
[h: ergebnis = macro.return]
Du hast eine [r: ergebnis] gewürfelt.
In Zeile 2 rufen wir also das eigentliche Würfelmakro auf. Von diesem Makro wird, wie wir gleich sehen werden, das Ergebnis des Würfelwurfs zurückgegeben und in der Spezialvariable macro.return gespeichert. In Zeile 3 erstellen wir eine neue Variable und weisen ihr als Wert den Inhalt der Spezialvariable zu. In Zeile 4 geben wir das Ergebnis dann aus.


Das aufzurufende Makro

Erstelle jetzt das eigentliche Würfelmakro mit dem Namen "wuerfel" im Library-Token "Lib:makros":

Code: Select all

[h: wuerfelwurf = 1d6]
[h: macro.return = wuerfelwurf]
In Zeile 1 speichern wir das Ergebnis eines Würfelwurfs in einer Variable. In Zeile 2 weisen wir dann der Spezialvariable macro.return den Inhalt zu, der an das aufrufende Makro zurückgegeben werden soll. In unserem Fall also das Würfelergebnis.


Fertig

Alles klar soweit? Dann probiere es jetzt aus!

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

16.4 - Links mit HTML erstellen

Zum Aufrufen eines Makros können auch Links verwendet werden. Diese Links verhalten sich ähnlich wie Links im Internet. Klickt der User also auf den Link, wird das verlinkte Makro ausgeführt. So kannst du z. B. in einem Charakterbogen den Angriffswert verlinken, damit bei einem Klick darauf gleich ein Würfelmakro aufgerufen wird.


Die Linkadresse

Um ein Makro zu verlinken brauchst du, wie bei Internetlinks auch, eine Linkadresse. Die kann in MapTool z. B. so aussehen:

Code: Select all

macro://linkfenster@Lib:makros/none/Impersonated?
Der Aufbau der Adresse ist aber nicht so wichtig. Viel wichtiger ist zu wissen wie du so eine Linkadresse erstellst. Das geht mit der Funktion macroLinkText(). Schauen wir uns das Format dafür an:

Code: Select all

macroLinkText(macroName, output, args, target)
Der einzige zwingend nötige Parameter ist "macroName". Die anderen Parameter sind optional, gibst du sie nicht an wird ihr Standardwert verwendet. Kommen wir jetzt aber zu den Parametern im Detail:

macroName
Der Name des aufzurufenden Makros. Der Name folgt dabei dem gleichen Format wie bei der Makro Roll-Option: erst der eigentliche Name, dann ein AT-Zeichen (@), und dann der Speicherort des Makros. Also z. B.: "testmakro@Lib:makros".

output
Bestimmt wer den Output des aufzurufenden Makros sehen kann, also das was z. B. vom Makro in der Chatbox ausgegeben wird. Der Standardwert ist "none". Mögliche Angaben:
  • self - Die Person die den Link angeklickt hat
  • gm - Spielleiter
  • gm-self - Spielleiter und die Person die den Link angeklickt hat
  • all - Jeder kann den Output sehen
  • none - Niemand kann den Output sehen
args
Daten die an das aufzurufende Makro weitergegeben werden sollen. Das funktioniert genauso wie bei der Makro Roll-Option. Es kann sich also um einen String, eine Zahl oder eine beliebige Variable handeln.

target
Gibt an auf welchen Token das aufzurufende Makro Bezug nimmt, z. B. wenn in dem Makro Token-Properties verwendet werden. Der Standardwert ist "impersonated". Mögliche Angaben:
  • impersonated - Der verkörperte Token der Person die den Link angeklickt hat
  • selected - Der ausgewählte Token
  • Token ID - Die ID eines beliebigen Tokens
Beachte, dass du immer die Reihenfolge der Parameter einhalten musst. Willst du also den Parameter args nutzen um Daten weiterzugeben, musst du auch den Parameter output angeben. Möchtest du den Parameter target nutzen, musst du auch output und args angeben.

Und jetzt ein paar Beispiele. Zuerst eine ganz einfache Linkadresse:

Code: Select all

[r: macroLinkText("testmakro@Lib:makros")]
Hier wird der Output allen Spielern gezeigt:

Code: Select all

[r: macroLinkText("testmakro@Lib:makros", "all")]
Hier werden zusätzlich noch Daten an das aufzurufende Makro gesendet:

Code: Select all

[h: daten = 5]
[r: macroLinkText("testmakro@Lib:makros", "all", daten)]
Und ein letztes Beispiel mit allen Parametern, wobei keine Daten weitergegeben werden, für den entsprechenden Parameter also nur ein leerer String angegeben wird:

Code: Select all

[r: macroLinkText("testmakro@Lib:makros", "all", "", "impersonated")]
Den Link erstellen

Gut, die Linkadresse haben wir also, jetzt müssen wir noch den eigentlichen Link erstellen. Das machen wir wieder mit HTML. Das Format:

Code: Select all

<a href='linkadresse'>linktext</a>
  • Als linkadresse gibst du entweder direkt die Funktion an, oder eine Variable in der du die Adresse gespeichert hast.
  • Als linktext gibst du den Text an der als Link erscheinen soll. Hierbei kann es sich auch um ein Bild handeln.
Ein Beispiel:

Code: Select all

[h: link = macroLinkText("linkziel@Lib:makros")]
<a href='[r: link]'>Bitte klicke mich an</a>
Zum Ausprobieren erstellst du erst mal ein neues Makro in deinem Library-Token "Lib:makros". Das Makro nennst du "linkziel" und erstellst damit ein Fenster mit einem kleinen Beispieltext:

Code: Select all

[dialog("linkziel"):
  {
    Der Link wurde erfolgreich aufgerufen.
  }
]
Im Kampagnenfenster (Campaign) erstellst du nun das Makro "linkquelle". Es enthält ebenfalls ein Fenster und den Link um das Makro "linkziel" aufzurufen:

Code: Select all

[dialog("linkquelle"):
  {
    [h: link = macroLinkText("linkziel@Lib:makros")]
    <a href='[r: link]'>Bitte klicke mich an</a>
  }
]
Und jetzt Testen! Klickst du auf den Link öffnet sich das Fenster mit dem Beispieltext. Wie gesagt kann das Ziel des Links ein beliebiges Makro sein, nicht nur ein Fenster. Du könntest also z. B. auch ein Würfelmakro damit aufrufen.

Wie du siehst wird ein normaler Link immer blau und unterstrichen angezeigt. Das HTML-Element zum Anzeigen des Links lässt sich aber ganz normal auch mit CSS formatieren. Hier ein Beispiel zum Ausprobieren:

Code: Select all

<a href='[r: link]' style='font-size: 14pt; font-weight: bold; color: #ff0000; text-decoration: none'>Bitte klicke mich an</a>
Statt einen Text für den Link festzulegen kannst du auch ein Bild als Link benutzen:

Code: Select all

<a href='[r: link]'><img src='[r: tableImage("images", 1)]'></a>
Wie du siehst wird bei verlinkten Bildern immer ein blauer Rahmen um das Bild gelegt, den du leider auch mit CSS nicht wegbekommst. Hier hilft aber das HTML-Attribut "border" mit einem Wert von "0" weiter:

Code: Select all

<a href='[r: link]'><img src='[r: tableImage("images", 1)]' border='0'></a>

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

16.5 - Einfache Links

Es gibt noch eine weitere Möglichkeit Links zu erstellen, nämlich mit der Funktion macroLink(). Das Format:

Code: Select all

macroLink(linktext, macroName, output, args, target)
Wie du siehst ähnelt die Funktion macroLink() sehr der Funktion macroLinkText(), sogar die Parameter sind gleich, so dass ich sie hier nicht noch einmal erkläre. Der Unterschied ist, dass hier nicht nur die Linkadresse zurückgegeben wird, sondern auch gleich der dazugehörige HTML-Code um einen vollwertigen Link zu erstellen. Außerdem gibt es einen zusätzlichen Parameter, nämlich "linktext", der an erster Stelle zwingend angegeben werden muss. "linktext" beinhaltet den eigentlichen Text den der User anklicken muss damit der Link aufgerufen wird.

Als Beispiel füge deinem Makro "linkquelle" im Kampagnenfenster einen neuen Link hinzu:

Code: Select all

[r: macroLink("Bitte anklicken", "linkziel@Lib:makros")]
Auch hier wird der Link blau und unterstrichen angezeigt. Du kannst ihn mit CSS formatieren wenn du das span-Element benutzt:

Code: Select all

<span style='color: #008000'>[r: macroLink("Bitte anklicken", "linkziel@Lib:makros")]</span>

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

17 - HTML Formulare

17.1 - Grundlagen


Was ist ein Formular?

Eine Abfrage mit der input()-Funktion zu erstellen ist schon ein guter Weg um Daten vom User zu erhalten. Allerdings gibt es da auch ein paar Nachteile, z. B. sind die Gestaltungsmöglichkeiten eines solchen Abfragefensters sehr limitiert. HTML-Formulare sind eine weitere Möglichkeit der Usereingabe bei der du deutlich mehr Freiheiten zur Gestaltung hast. Das erfordert aber auch etwas mehr Arbeit.

input-Fenster pausieren das Makro, warten auf die Usereingabe, und führen dann den Rest des Makros aus. Bei Formularen benötigst du dagegen immer zwei Makros. Das erste Makro ist das eigentliche Eingabefenster für den User. Hat er die Eingabe beendet werden die eingegebenen Daten als String Property List an das zweite Makro gesendet, und dort dann verarbeitet.


Formulare erstellen

Formulare sind ein normales HTML-Element und werden mit <form>...</form> erstellt. Innerhalb eines Formulars kannst du wie üblich HTML und CSS verwenden, hast also die volle Kontrolle über das Design des Fensters. Schauen wir uns das an einem kleinen Beispiel an. Erstelle ein neues Makro im Kampagnenfenster (Campaign) und trage folgendes ein:

Code: Select all

[dialog("formtest"): 
  {
    <html>
      <head>
        <title>
          Testformular
        </title>
      </head>
      <body>
        <form>
          Name: <input type='text' name='charName'>
          <br>
          Klasse: <input type='text' name='charKlasse'>
        </form>
      </body>
    </html>
  }
]
Wenn du das Makro jetzt ausführst siehst du bereits ein Formular mit zwei Eingabefeldern, in unserem Fall Textfelder. Eingabefelder werden, je nach Art, mit <input>, <select> oder <textarea> erstellt. Egal welche Art von Eingabefeldern du nutzt muss zwingend das Attribut "name" für den Namen des Feldes angegeben werden. Der Name eines Feldes muss einmalig sein, darf also nur für ein einziges Feld verwendet werden.


Daten senden

Bevor wir uns die verschiedenen Eingabefelder näher ansehen, schauen wir uns erst mal an wie die vom User eingegebenen Daten weitergesendet werden. Erstelle ein weiteres Makro in deinem Library-Token "Lib:makros" und nenne es "formProcess". An dieses Makro wollen wir die Daten senden. Dafür sind noch einige Vorbereitungen im eigentlichen Formular nötig.

Zuerst brauchst du die Linkadresse, die du natürlich auch in einer Variable gespeichert werden kann. Die Adresse holen wir uns wieder mit der Funktion macroLinkText und geben für den output-Parameter noch "all" an, damit die Ausgabe des aufzurufenden Makros auch jeder sehen kann. Achte aber darauf, dass du mit der Funktion selbst keine Daten weitersenden darfst, das würde zu Problemen führen.

Code: Select all

[h: processLink = macroLinkText("formProcess@Lib:makros", "all")]
Jetzt hast du die Linkadresse in einer Variable gespeichert. Aber auch das Formular muss ja wissen, dass es seine Daten an diese Adresse senden soll. Dafür gibst du jetzt im form-Element (<form>) das Attribut "action" mit der Adresse als Wert an:

Code: Select all

<form action='[r: processLink]'>
Zum Schluss brauchen wir natürlich noch einen schönen Button auf den der User klicken kann, damit seine eingegebenen Daten weitergesendet werden. Diesen erstellst du am besten unter den Eingabefeldern:

Code: Select all

<input type='submit' name='processButton' value='Klicken zum Senden'>
  • Buttons erstellst du immer mit "<input>".
  • Bei "type" muss immer "submit" als Wert angegeben werden.
  • Auch bei einem Button muss ein Name vergeben werden.
  • Bei "value" gibst du als Wert den Text an, der auf dem Button erscheinen soll.
Unser Formular innerhalb des Makros sieht jetzt also so aus:

Code: Select all

[h: processLink = macroLinkText("formProcess@Lib:makros", "all")]
<form action='[r: processLink]'>
  Name: <input type='text' name='charName'>
  <br>
  Klasse: <input type='text' name='charKlasse'>
  <br><br>
  <input type='submit' name='processButton' value='Klicken zum Senden'>
</form>
Daten empfangen

In Ordnung. Probiere es gleich mal aus und klicke auch auf den Senden-Button. Natürlich passiert noch nichts, denn wir müssen das Makro "formProcess" ja noch auf den Empfang der Daten vorbereiten. Das machen wir wieder mit der Spezialvariable macro.args. Trage dort also folgendes ein:

Code: Select all

[h: daten = macro.args]
[r: daten]
Rufe danach wieder das Formular auf, trage irgendetwas in die Textfelder ein, und klicke dann auf den Senden-Button. In der Chatbox siehst du jetzt die empfangenen Daten in Form einer String Property List. Wie dir bestimmt auffällt wird der Name eines Eingabefeldes immer als Schlüssel benutzt, und der Inhalt des Eingabefeldes als Wert für diesen Schlüssel. Sogar der Senden-Button selbst sendet seine Daten, aber die brauchen wir normalerweise nicht.

Wenn du die Daten jetzt nutzen möchtest musst du sie nur noch aus der String Property Liste abrufen. Hier ein Beispiel:

Code: Select all

[h: daten = macro.args]
[h: name = getStrProp(daten, "charName")]
[h: klasse = getStrProp(daten, "charKlasse")]
Dein Charaktername ist [r: name], und deine Charakterklasse ist [r: klasse].
Daten als JSON-Object senden

Normalerweise werden die Daten eines Formulars automatisch als String Property List gesendet. Wenn du möchtest kannst du sie aber auch als JSON-Object senden. Dafür gibst du im form-Element das Attribut "method" mit "json" als Wert an:

Code: Select all

<form action='[r: processLink]' method='json'>
Auch in diesem Fall werden die Namen der Felder als Schlüssel, und der Inhalt der Eingabefelder als Wert für die Schlüssel benutzt. Natürlich musst du dann in dem aufzurufenden Makro auch JSON-Befehle benutzen um die Daten abzurufen. Hier ein Beispiel:

Code: Select all

[h: daten = macro.args]
[h: name = json.get(daten, "charName")]
[h: klasse = json.get(daten, "charKlasse")]
Dein Charaktername ist [r: name], und deine Charakterklasse ist [r: klasse].
Formularfenster schließen

Dir ist mittlerweile bestimmt noch etwas aufgefallen: Immer wenn du im Formular auf den Senden-Button geklickt hast, wurden die Daten zwar an das aufzurufende Makro weitergegeben und verarbeitet, aber das Fenster mit dem Formular hat sich nicht geschlossen. MapTool macht das hier auch nicht automatisch, dafür müssen wir selbst sorgen.

Um ein ein Fenster zu schließen benutzen wir closeDialog() für Dialogfenster und closeFrame() für Frames. Sie funktionieren beide auf die gleiche Weise: Als Parameter wird einfach der Name des Dialogs, bzw. des Frames angegeben. Das war es schon. Als Beispiel erweitern wir einfach den Code des ersten Beispiels für den Datenempfang und fügen die Funktion in der ersten Zeile des verarbeitenden Makros "formProcess" ein:

Code: Select all

[h: closeDialog("formtest")]
[h: daten = macro.args]
[h: name = getStrProp(daten, "charName")]
[h: klasse = getStrProp(daten, "charKlasse")]
Dein Charaktername ist [r: name], und deine Charakterklasse ist [r: klasse].
Wenn du jetzt im Formular auf den Senden-Button klickst wird das verarbeitende Makro aufgerufen, und damit auch das Formularfenster geschlossen.


Die nächsten Kapitel

In den nächsten Kapiteln zeige ich dir die unterschiedlichen Formularfelder die du benutzen kannst. Bei den Beispielen beschränke ich mich aber auf den Code des eigentlichen Formulars, denn wie ein Makro mit Formular aufgebaut ist und wie es funktioniert weißt du ja jetzt schon. Außerdem gehe ich davon aus, dass das Makro, welches die Daten des Formulars empfängt und verarbeitet, immer das Makro "formProcess" in deinem Library-Token ist.

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

17.2 - Einzeilige Textfelder

Textfelder sind, wer hätte das erwartet, für die Eingabe von Text gedacht. Da es jedoch keine speziellen Eingabefelder für Zahlen gibt, können Textfelder auch für die Eingabe von Zahlen benutzt werden. Textfelder werden mit <input> erstellt. Das Format:

Code: Select all

<input type='text' name='' size='' maxlength='' value=''>
Die Attribute ("type" und "name" müssen zwingend angegeben werden):

type
Für Textfelder muss hier zwingend "text" angegeben werden.

name
Der Name des Eingabefeldes.

size
Die Breite des Textfeldes. Dieses Attribut ist optional.

maxlength
Die maximale Anzahl an Zeichen die der User in das Textfeld eingeben kann. Dieses Attribut ist optional.

value
Vorbelegung des Textfeldes. Der angegebene Wert wird also bereits beim Aufruf des Formulars im Textfeld angezeigt. Dieses Attribut ist optional.

Beispiel für das Formular:

Code: Select all

[h: processLink = macroLinkText("formProcess@Lib:makros") "all"]
<form action='[r: processLink]'>
  Charaktername: <input type='text' name='charName' size='15' maxlength='20' value='Bitte Name eintragen'>
  <br><br>
  Hitpoints: <input type='text' name='charHP' size='3' maxlength='2'>
  <br><br>
  <input type='submit' name='processButton' value='Klicken zum Senden'>
</form>
Image

Beispiel für das verarbeitende Makro "formProcess":

Code: Select all

[h: daten = macro.args]
[h: char.name = getStrProp(daten, "charName")]
[h: char.hp = getStrProp(daten, "charHP")]
Charaktername: [r: char.name]<br>
Hitpoints: [r: char.hp]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

17.3 - Mehrzeilige Textfelder

Wenn du etwas mehr Platz benötigst bieten sich mehrzeilige Textfelder an, diese werden mit <textarea> erstellt. Das Format:

Code: Select all

<textarea name='' cols='' rows=''>
Die Attribute (alle Attribute müssen zwingend angegeben werden):

name
Der Name des Eingabefeldes.

cols
Die Breite des Textfeldes.

rows
Die Anzahl der Zeilen im Textfeld.

Beispiel für das Formular:

Code: Select all

[h: processLink = macroLinkText("formProcess@Lib:makros") "all"]
<form action='[r: processLink]'>
  Notizen: <textarea name='charNotiz' cols='30' rows='5'>
  <br><br>
  <input type='submit' name='processButton' value='Klicken zum Senden'>
</form>
Image

Beispiel für das verarbeitende Makro "formProcess":

Code: Select all

[h: daten = macro.args]
[h: char.notiz = getStrProp(daten, "charNotiz")]
Charakternotizen: [r: char.notiz]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

17.4 - Auswahllisten

Mit Hilfe von Auwahllisten kannst du dem User mehrere Möglichkeiten zur Auswahl anbieten. Er muss dann nur den gewünschten Eintrag aus der Liste aussuchen und anwählen. Auswahlisten werden mit <select> erstellt, die einzelnen Einträge in der Liste mit <option>. Das Format:

Code: Select all

<select name='' size=''>
  <option>A</option>
  <option>B</option>
  <option selected='selected'>C</option>
</select>
Die Attribute ("name" muss zwingend angegeben werden):

name
Der Name des Eingabefeldes.

size
Bestimmt die Anzahl der Einträge in der Auswahlliste die angezeigt werden sollen. Enthält die Liste mehr Einträge als angezeigt werden sollen kann der User in der Liste scrollen. Wird bei "size" eine "1" angegeben, oder das Attribut komplett weggelassen, wird die Liste zu einer Dropdown-Liste.

selected
Dieses Attribut dient der Vorselektierung eines bestimmten Listeneintrags (<option>), und darf daher auch nur bei einem einzigen Listeneintrag angegeben werden. Wird dieses Attribut nicht notiert wird immer der erste Eintrag in der Liste vorselektiert. Der Wert des Attributs ist immer "selected".

Beispiel für das Formular:

Code: Select all

[h: processLink = macroLinkText("formProcess@Lib:makros") "all"]
<form action='[r: processLink]'>
  Liste 1: <select name='list1' size='5'>
    <option>Eintrag 1</option>
    <option>Eintrag 2</option>
    <option selected='selected'>Eintrag 3</option>
    <option>Eintrag 4</option>
    <option>Eintrag 5</option>
  </select>
  <br><br>
  Liste 2: <select name='list2' size='3'>
    <option>Eintrag 1</option>
    <option>Eintrag 2</option>
    <option selected='selected'>Eintrag 3</option>
    <option>Eintrag 4</option>
    <option>Eintrag 5</option>
  </select>
  <br><br>
  Liste 3: <select name='list3'>
    <option>Eintrag 1</option>
    <option>Eintrag 2</option>
    <option selected='selected'>Eintrag 3</option>
    <option>Eintrag 4</option>
    <option>Eintrag 5</option>
  </select>
  <br><br>
  <input type='submit' name='processButton' value='Klicken zum Senden'>
</form>
Image

Beispiel für das verarbeitende Makro "formProcess":

Code: Select all

[h: daten = macro.args]
[h: auswahl1 = getStrProp(daten, "list1")]
[h: auswahl2 = getStrProp(daten, "list2")]
[h: auswahl3 = getStrProp(daten, "list3")]
Auswahl in Liste 1: [r: auswahl1]<br>
Auswahl in Liste 2: [r: auswahl2]<br>
Auswahl in Liste 3: [r: auswahl3]

Thargun
Giant
Posts: 188
Joined: Sun Sep 14, 2014 4:27 am

Re: Macros for Dummies - A guide to MapTool-Macros (german)

Post by Thargun »

17.5 - Radio Buttons

Hierbei handelt es sich auch um eine Art Liste, allerdings in Form einer Gruppe von Radio Buttons. Radio Buttons werden mit <input> erstellt. Durch die Zuordnung zu einer Gruppe können mehrere Radio Buttons zu einer Art Liste zusammengefasst werden. Das Format:

Code: Select all

<input type='radio' name='' value=''>
<input type='radio' name='' value=''>
<input type='radio' name='' value='' checked='checked'>
Die Attribute (alle Attribute müssen zwingend angegeben werden):

type
Für Radio Buttons muss hier zwingend "radio" angegeben werden.

name
Der Name des Radio Buttons. Die Benennung mehrerer Radio Buttons mit dem gleichen Namen ist hier erlaubt, dadurch fasst du sie zu einer Gruppe zusammen. Die Gruppe ist dann eine Art Liste, und die einzelnen Radio Buttons in der Gruppe sind die verschiedenen Listeneinträge.

value
"value" stellt den eigentlichen Inhalt des Radio-Buttons dar, also den eigentlichen Listeneintrag. Da der hier angegebene Wert bei der Ausgabe in einem Fenster nicht sichtbar ist, sollte hinter dem Radio Button der Wert oder eine andere Kennzeichnung noch einmal notiert werden. Nur so kann der User sehen was er da überhaupt auswählt.

checked
Dieses Attribut dient der Vorselektierung eines bestimmten Radio Buttons, und darf daher auch nur bei einem einzigen Radio Button innerhalb einer Gruppe angegeben werden. Der Wert des Attributs ist immer "checked".

Beispiel für das Formular:

Code: Select all

[h: processLink = macroLinkText("formProcess@Lib:makros") "all"]
<form action='[r: processLink]'>
  Gruppe 1: <input type='radio' name='group1' value='Eintrag 1'> Eintrag 1
  <input type='radio' name='group1' value='Eintrag 2' checked='checked'> Eintrag 2
  <input type='radio' name='group1' value='Eintrag 3'> Eintrag 3
  <br><br>
  Gruppe 2: <input type='radio' name='group2' value='Eintrag 1'> Eintrag 1
  <input type='radio' name='group2' value='Eintrag 2'> Eintrag 2
  <input type='radio' name='group2' value='Eintrag 3' checked='checked'> Eintrag 3
  <br><br>
  <input type='submit' name='processButton' value='Klicken zum Senden'>
</form>
Image

Beispiel für das verarbeitende Makro "formProcess":

Code: Select all

[h: daten = macro.args]
[h: auswahl1 = getStrProp(daten, "group1")]
[h: auswahl2 = getStrProp(daten, "group2")]
Auswahl in Gruppe 1: [r: auswahl1]<br>
Auswahl in Gruppe 2: [r: auswahl2]

Post Reply

Return to “Documentation Requests/Discussion”