Table of Contents

Custom Theme

TTMSFNCMemoCustomTheme is a companion component that defines a colour theme for TTMSFNCMemo. Three themes ship out of the box; TTMSFNCMemoCustomTheme lets you define your own.

The three built-in themes: Visual Studio, Visual Studio Dark, High Contrast Dark

Built-in themes

Value Appearance
mtVisualStudio Visual Studio Code — light (default)
mtVisualStudioDark Visual Studio Code — dark
mtHighContrastDark High contrast dark
mtCustom Uses a TTMSFNCMemoCustomTheme definition
TMSFNCMemo1.Theme := mtVisualStudioDark;

Setup overview

  1. Drop a TTMSFNCMemoCustomTheme on the form.
  2. Set Colors and Rules.
  3. Add an entry to TTMSFNCMemo.CustomThemes and assign the component.
  4. Set TTMSFNCMemo.Theme := mtCustom.
TMSFNCMemo1.CustomThemes.Add.Theme := TMSFNCMemoCustomTheme1;
TMSFNCMemo1.Theme := mtCustom;
// Optionally name the theme:
// TMSFNCMemo1.CustomThemeName := 'solarized-dark';

Colors

TTMSFNCMemoCustomTheme.Colors exposes fixed colour slots that control the overall look of the editor (background, foreground, line highlight, ruler, etc.). The full list of available colour slots is defined by the Monaco exposed-colors specification.

TMSFNCMemoCustomTheme1.Colors.EditorBackground := $002B36;
TMSFNCMemoCustomTheme1.Colors.EditorForeground := gcWhite;

Rules

TTMSFNCMemoCustomTheme.Rules assigns colours to the token types produced by the language tokenizer. Each TTMSFNCMemoCustomThemeRule has:

Property Type Description
Token string Token type name (e.g. 'string', 'keyword', 'number').
Foreground TTMSFNCGraphicsColor Text colour for the token.
Background TTMSFNCGraphicsColor Background colour for the token.
FontStyle TFontStyles fsBold, fsItalic, or both.

Add overloads:

// Token + font style
TMSFNCMemoCustomTheme1.Rules.Add('number',  [TFontStyle.fsItalic]);

// Token + foreground colour
TMSFNCMemoCustomTheme1.Rules.Add('string',  $008800);

// Token + foreground colour + font style
TMSFNCMemoCustomTheme1.Rules.Add('keyword', gcCyan, [TFontStyle.fsBold]);

Full example

// Step 1 — Configure TCustomTheme
procedure TForm1.SetupCustomTheme;
var
  CustomTheme: TTMSFNCMemoCustomTheme;
begin
  // Base theme to inherit from (optional)
  CustomTheme.Base    := 'vs-dark';
  CustomTheme.Inherit := True;

  // Fixed colors (see Monaco exposed-colors playground for the full list)
  CustomTheme.Colors.EditorBackground := $002B36; // Solarized dark
  CustomTheme.Colors.EditorForeground := gcWhite;

  // Token color rules
  CustomTheme.Rules.Add('string',   $008800);                   // green foreground
  CustomTheme.Rules.Add('number',   [TFontStyle.fsItalic]);     // italic
  CustomTheme.Rules.Add('keyword',  gcCyan, [TFontStyle.fsBold]); // bold cyan
  CustomTheme.Rules.Add('comment',  gcDarkGray);
  CustomTheme.Rules.Add('type.identifier', gcYellow);
end;

// Step 2 — Assign to TMemo
procedure TForm1.ApplyCustomTheme;
var
  Memo: TTMSFNCMemo;
  CustomTheme: TTMSFNCMemoCustomTheme;
begin
  Memo.CustomThemes.Add.Theme := CustomTheme;
  Memo.Theme := mtCustom;
  // Optionally override the theme name
  // Memo.CustomThemeName := 'solarized-dark';
end;

// Save / load the theme definition
procedure TForm1.SaveTheme;
begin
  CustomTheme.SaveSettingsToFile('C:\Config\my-theme.json');
end;

procedure TForm1.LoadTheme;
begin
  CustomTheme.LoadSettingsFromFile('C:\Config\my-theme.json');
end;

TTMSFNCMemoCustomTheme properties

Property Description
ThemeName Theme identifier. Defaults to the component name if empty.
Base Base Monaco theme to extend ('vs', 'vs-dark', 'hc-black').
Inherit Inherit unspecified token rules from the base theme.
Colors Fixed editor colour slots.
Rules Token colour rules.

Save and load a theme definition

// Save
TMSFNCMemoCustomTheme1.SaveSettingsToFile('C:\Config\my-theme.json');

// Load
TMSFNCMemoCustomTheme1.LoadSettingsFromFile('C:\Config\my-theme.json');

Combining colors, rules, and save/load persistence

Set up a Solarized-style dark theme with token rules and persist it to disk for reuse:

procedure TForm1.FormCreate(Sender: TObject);
begin
  TMSFNCMemoCustomTheme1.Base    := 'vs-dark';
  TMSFNCMemoCustomTheme1.Inherit := True;
  TMSFNCMemoCustomTheme1.Colors.EditorBackground := $002B36;
  TMSFNCMemoCustomTheme1.Colors.EditorForeground := $839496;

  TMSFNCMemoCustomTheme1.Rules.Add('keyword', $268BD2, [TFontStyle.fsBold]);
  TMSFNCMemoCustomTheme1.Rules.Add('string',  $2AA198);
  TMSFNCMemoCustomTheme1.Rules.Add('number',  $D33682);
  TMSFNCMemoCustomTheme1.Rules.Add('comment', $586E75, [TFontStyle.fsItalic]);

  TMSFNCMemoCustomTheme1.SaveSettingsToFile('C:\Config\solarized-dark.json');

  TMSFNCMemo1.CustomThemes.Add.Theme := TMSFNCMemoCustomTheme1;
  TMSFNCMemo1.Theme := mtCustom;
end;

See also