Bob Swart (aka Dr.Bob)
Custom Live Templates voor Delphi 2006 en hoger

Wie al met Delphi 2006 heeft gewerkt, of demonstraties heeft gezien, zal het niet ontgaan zijn dat de code editor is uitgebreid met een feature genaamd Live Templates. In dit artikel zal ik laten zien hoe we zelf Live Templates kunnen maken voor Delphi 2006, en hoe we ze vervolgens kunnen gebruiken.

Live Templates zitten in een XML bestand. Als je een nieuw Live Template wilt maken kun je File | New | Other doen, en dan kiezen voor de Code Template in de Other Files category:

Het resultaat is een template1.xml bestand, met de volgende inhoud:

  <?xml version="1.0" encoding="utf-8" ?>
  <codetemplate xmlns="http://schemas.borland.com/Delphi/2005/codetemplates" version="1.0.0">
    <template name="" invoke="manual">
      <description>
      </description>
      <author>
      </author>
      <code language=""><![CDATA[]]>
      </code>
    </template>
  </codetemplate>
Waarbij de cursor midden tussen de twee dubbele quotes voor de name staat. Hier moet je de naam voor je code template invullen. Maar je kan niet zomaar alles invullen wat je wilt, want deze naam is meteen de tekst die je straks in de IDE moet intikken om de live template te activeren. Een korte pakkende naam als "log" is hierbij handiger dan een naam als "loganothermessageinlogfile". Als eerste voorbeeld wil ik hier "md" intikken, omdat ik een MessageDlg template wil maken.
Na de naam, zou je ook de invoke method een andere waarde kunnen geven. Deze staat default op "manual", maar kan ook op "auto" of "none" gezet worden. Als je invoke op "auto" zet, dan is een spatie na de naam van de live template genoeg om hem te activeren. Als je invoke op "manual" laat staan, dan moet je een Tab of Ctrl+J intikken om de live template te activeren. Als je invoke op "none" zet kun je alleen Ctrl+J of Ctrl+Space gebruiken in de code editor om de live template te activeren.
Deze kennis kun je trouwens ook gebruiken om bestaande code templates aan te passen. De for template bijvoorbeeld, vind ik persoonlijk erg irritant, en heb ik zelf inmiddels van invoke="auto" op invoke="manual" gezet.
Optioneel kun je de ruimte tussen de description en author tags invullen, met nadere informatie over wat je live template doet, wie de auteur was, etc. Het belangrijkste onderdeel is echter het stuk voor de code tags. Binnen de code tag vinden we allereerst het language attribuut. Hier kun je de taal opgeven, zoals Delphi, CSharp, C, etc. Voor ons voorbeeld kies ik hier voor "Delphi".
De code zelf moeten we niet tussen de code tags zetten, maar binnen de binnenste [] haken van de CDATA. Voor ons "MessageDlg" voorbeeld ziet dat er inmiddels als volgt uit:
  <?xml version="1.0" encoding="utf-8" ?>
  <codetemplate xmlns="http://schemas.borland.com/Delphi/2005/codetemplates" version="1.0.0">
    <template name="md" invoke="manual">
    <description>MessageDlg live template</description>
    <author>Bob Swart</author>
    <code language="Delphi">
      <![CDATA[MessageDlg('|', mtInformation, [mbOK], 0);]]>
    </code>
    </template>
  </codetemplate>
Het | teken dat tussen de quotes van de MessageDlg staat geeft aan waar de cursor komt nadat de live is geactiveerd. Hier kun je dus meteen je bericht intikken dat je wilt laten zien.

Live Template Points
Soms heb je meer dan n punt om in te vullen, en actieve Live Templates kunnen dan met behulp van de Tab toets van punt naar punt springen. Om dergelijke punten aan te geven moeten we vr de code tags eerst voor ieder punt een "point" tag opnemen, met daarin als attribuut de naam van het point, en optioneel een text en hint. De inhoud van de text verschijnt als default text in de template, terwijl de hint vertoond wordt om aan te geven wat de bedoeling is.
Als we in het bestaande voorbeeld zowel de Message als de MessageType en de MessageButtons als een "point" willen aangeven (en erdoorheen willen tabben), dan kunnen we dat als volgt aangeven:

  <?xml version="1.0" encoding="utf-8" ?>
  <codetemplate xmlns="http://schemas.borland.com/Delphi/2005/codetemplates" version="1.0.0">
    <template name="md" invoke="auto">
    <description>MessageDlg live template</description>
    <author>Bob Swart</author>
    <point name="Message">
      <text>Hello</text>
      <hint>Message</hint>
    </point>
    <point name="MessageType">
      <text>mtInformation</text>
      <hint>Message Type</hint>
    </point>
    <point name="MessageButtons">
      <text>mbOK</text>
      <hint>Message Buttons</hint>
    </point>
    <code language="Delphi" delimiter="|">
      <![CDATA[MessageDlg('|Message|', |MessageType|, [|MessageButtons|], 0);|end|]]>
    </code>
    </template>
  </codetemplate>
Let ook op de |end| die aan het eind van de live template staat, en aangeeft waar de cursor moet komen nadat de template gedeactiveerd is.

Deployment
Als je eenmaal een nieuw Live Template hebt beschreven in een XML bestand zoals we dat zojuist hebben gedaan, dan kun je dat bewaren, waarbij het default in de C:\Document and Settings\<user>\Local Settings\Application Data\Borland\BDS\4.0\code_templates directory komt. Dat is niet een fijne plek vind ik zelf, dus kopieer ik het meestal naar de plek waar de reeds bestaande Live Templates staan, namelijk in de C:\Program Files\Borland\BDS\4.0\Objrepos\code_templates directory, waarbinnen al subdirectories voor c, csharp, delphi en XML te vinden zijn. Mijn voorbeeld heb ik als md.xml in de BDS\4.0\Objrepos\code_templates\delphi directory bewaard.

Demo
Als je dan uiteindelijk in de code editor de tekst "md" intikt gevolgd door een spatie, dan wordt de "md" Live Template geactiveerd en krijg je het volgende effect:

We kunnen nu de message invullen, en met Tab of Shift+Tab navigeren van de Message naar de MessageType en de MessageButtons. Na een laatste Tab of een Escape wordt de Live Template weer gedeactiveerd, en staan we aan het eind van de gegenereerde code, precies als we met het |end| attribuut aangaven.


This webpage © 2006 by webmaster drs. Robert E. Swart (aka - www.drbob42.com). All Rights Reserved.