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.
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
- Drop a
TTMSFNCMemoCustomThemeon the form. - Set
ColorsandRules. - Add an entry to
TTMSFNCMemo.CustomThemesand assign the component. - 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;