Fenner
Biblioteca

WCL

Os componentes visuais para Windows — formulários, controles, estilos, o editor de código e as árvores virtuais.

A WCL é a biblioteca de componentes visuais da BedRock: TForm, TButton, TEdit, TListView, TTreeView, menus, barras de ferramenta e mais. Ela desenha sobre a API do Windows e segue de perto o modelo do Delphi (TComponent, Parent, Owner, propriedades e eventos), de modo que quem conhece a VCL se orienta de imediato.

Uma janela, à mão#

O RAD gera código assim, e você pode escrevê-lo direto:

HelloGui.fxp
program HelloGui;

{$config Manifest 'HelloGui.manifest'}

uses
  System.Remainder,
  System.WCL,
  MainForm;

begin
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.
MainForm.fxm
module MainForm;

uses
  System.Remainder,
  System.WCL;

public type
  TMainForm = class(TForm)
  private
    FLabel: TLabel;
    FButton: TButton;
    FClicks: Int32;
    procedure ButtonClick(Sender: TObject);
  protected
    // chamado pelo Load do TComponent: aqui nascem os controles
    procedure LoadComponents; override;
  end class;

public var
  MainForm: TMainForm;

procedure TMainForm.LoadComponents;
begin
  SetClientBounds(200, 120, 320, 140);
  Caption := 'Olá, Fenner';

  FLabel := TLabel.Create(Self);
  FLabel.Parent := Self;
  FLabel.SetBounds(16, 16, 280, 24);
  FLabel.Caption := 'Nenhum clique ainda';

  FButton := TButton.Create(Self);
  FButton.Parent := Self;
  FButton.SetBounds(16, 56, 120, 28);
  FButton.Caption := 'Clique aqui';
  FButton.OnClick := ButtonClick;
end procedure;

procedure TMainForm.ButtonClick(Sender: TObject);
begin
  Inc(FClicks);
  FLabel.Caption := 'Cliques: ' + IntToUStr(FClicks);
end procedure;

end.
  • O projeto (.fxp) chama Application.Initialize, Application.CreateForm(TMainForm, MainForm) e Application.Run.
  • O formulário é uma classe que herda de TForm. O método LoadComponents (chamado pelo Load do TComponent) é onde os controles nascem: cada um é criado com Create(Self), ligado ao pai por Parent e posicionado com SetBounds.
  • Um evento é um tipo procedural of object: FButton.OnClick := ButtonClick;.
  • O {$config Manifest …} liga o Common Controls 6 (sem ele o Windows desenha tudo no estilo clássico), e Config All AppType GUI na configuração evita a janela de console.

O mesmo código é o que o RAD escreve a partir do desenho.

O que a WCL tem#

GrupoComponentes (os mesmos da paleta do RAD)
PadrãoTLabel, TEdit, TMemo, TButton, TCheckBox, TRadioButton, TListBox, TComboBox, TGroupBox, TPanel, TStaticText, TRadioGroup, TScrollBar, TScrollBox
AdicionaisTShape, TBevel, TMaskEdit, TLabeledEdit, TButtonedEdit, TImage, TPaintBox, TSplitter, TColorBox, TColorListBox, TLinkLabel, TFlowPanel, TGridPanel
Win32TTabControl, TRichEdit, TTrackBar, TProgressBar, TUpDown, THotKey, TDateTimePicker, TMonthCalendar, TTreeView, TListView, THeaderControl, TStatusBar, TToolBar, TComboBoxEx, TCoolBar
Não visuaisTTimer, TMainMenu, TPopupMenu

Estilos visuais#

A WCL carrega estilos visuais (.vsf), no mesmo modelo dos estilos do Delphi, embutidos no executável com {$config WCLStyle 'arquivo'}. O compilador lista os estilos que traz com fc --wclstyles. O estilo inicial se aplica com TStyleManager.TrySetStyle, e os controles, as barras de rolagem e o editor de código seguem o tema. O módulo System.WCL.Styles e os StyleAPI, StyleBitmap e SysStyles o sustentam.

O editor de código: SynEdit#

O SynEdit foi portado para a WCL: realce de sintaxe, números de linha, dobra de blocos, localizar e substituir e completar. Vem com dezenas de realces (cada um é um módulo System.WCL.SynEdit.<Linguagem>), de Pascal, SQL, C, C++, C#, Java, Kotlin, Go, Rust, Python, Ruby, Lua, JavaScript, TypeScript, PHP, HTML, CSS, JSON, XML, YAML, TOML e Markdown a Dockerfile, PowerShell, Bat e Makefile, e da própria Fenner (System.WCL.SynEdit.Fenner). É o editor que o RAD usa.

Árvores virtuais#

O System.WCL.VirtualTrees traz uma árvore virtual no estilo do VirtualTreeView, para volumes grandes de dados.

Direct2D#

O System.D2D1 traz as declarações do Direct2D para desenho acelerado por hardware.