# Description

This tool takes a CSV file with basic metadata and expand it into a source file(s) for use in Delphi based on pre-defined templates.

Using single and multi-file templates you can make almost any unit or form. Included example includes generating a *mORMot* `TSQLRecord` descendant as well as a CDS-based form for editing a single record/object.

It is not intended as a full-fledged RAD tool but rather to generate the bulk of repetitive code so you can copy to your project and edit from there on.

# Forum Thread

See http://synopse.info/forum/viewtopic.php?id=1911

# Usage

    Create CSV file 

e.g. `SampleObj.csv`:

    Code,RawUTF8,Edit,30
    Desc,RawUTF8,Edit,512
    ItemType,RawUTF8,ComboBox,30
    Cost,Currency,Edit
    LastCostD,TDateTime,DateEdit
    VatCat,Integer,RadioGroup
    Active,Boolean,CheckBox

# Format

    <Property/Field name>, DataType, Control[, Size]

Save with `FileName` of class name, e.g. `SampleObj.csv` would create e.g. classes:

    DataSampleObj.pas (class TSQLSampleObj)
    SampleObjFormU.pas (Class TSampleObjForm)
    SampleObjFormU.dfm


When creating template, keep in mind the following, there are few magic-cookies that get replaced with your text and some tags.

Some magic-cookies:

* MyObj = ClassName, e.g. SampleObj (Determined by filename)
* MyName = property name e.g. BirthDate
* MyType = property type, e.g. `RawUTF8`
* MyField = property CDS Field type `TStringField`
* MyFieldAs = CDS field get/setter str, e.g. `AsString`
* MyControl = If assigned, expanded control type, e.g. `TEdit`
* MyDBControl = If assigned, expanded DB control type, e.g. `TDBEdit`
* MyControlName = If assigned, control name, e.g. `EditBirthDate`
* MyTop = Value that start at 21 and get incremented by 21 on each control, to space controls underneath each other.
* MySize = Size of CDS string field, see 'Tags' below.

# Tags

There are 3 tags:

* `[Fields]...[/Fields]` Cause a loop, passing all properties
* `[Controls] ..[/Controls]` Cause a loop, passing all properties that have a control assigned.
* `[Size]` Only include this line (tag can be anywhere on the line) if the current field have a size>0, used for TStringField size.
* `[!Size]` Only onclude this line if current filed have `Size=0` (i.o.w. not a String field)

E.g.:

    [Fields][Size]Obj.MyName           :=StringToUTF8(CDSMyName   .MyFieldAs);
           [!Size]Obj.MyName           :=             CDSMyName   .MyFieldAs;[/Fields]

This would create a line for each field/property. String fields will get 1st line `[Size]` with `StringToRawUTF8`, other fields will be rendered with 2nd line `[!Size]`, e.g.:

    Obj.Code :=StringToRAWUTF8(CDSCode.AsString);
    Obj.Cost :=                CDSCost.AsInteger;

Templates for generated files can be edited/saved. It is saved in `TClientdataset` binary format, so make backups as upgrades might make it useless.

# Future needed changes

* Make magic-cookies customizable.
* Use syntax-highlighter for code editing.
* Better tags or scripting to make more versatile.
* Support for more data-types and control types. (In meantime, use `Integer`/`RawUTF8` or `TEdit` for unsupported types and edit code afterwards)
* Way to indent code - prettyfy.
* Save templates in separate text files that can be edited in external editor.

# Changelog

* 2014/07/28 - ver 1.1
 - Added Templates and non-DB controls.
 - Added Tags for Field/Control loops and [Size]/[!Size] to make conditional render of string fields. (Fields with a size limit)
