Vega — Komponenten in die Anwendung bringen

Wie eine Komponente in die Anwendung kommt, ist immer dieselbe Folge:

  1. Unit importieren — Komponenten liegen nach Themen getrennt (Vega.StdCtrls, Vega.Edits, Vega.ListCtrls …).
  2. Anlegennew TButton(„Text“) oder die Hülle NewButton(„Text“); beides ist dasselbe.
  3. Einstellen — Geometrie, Align, Handler.
  4. EinhängenSetParent(eltern). Ohne diesen Schritt wird nichts gezeichnet.

Erste Anwendung · Eigenschaften · Ereignisse · Referenz aller Steuerelemente


Welche Unit für welche Komponente

Unit Komponenten
Vega.StdCtrls TPanel, TLabel, TButton, TCheckBox, TRadioButton, TGroupBox, TProgressBar
Vega.Edits TEdit (einzeilig), TMemo (mehrzeilig)
Vega.ListCtrls TListBox, TComboBox, TScrollBar
Vega.ExtCtrls TTrackBar, TSpinEdit, TPageControl + TTabSheet, TTabControl
Vega.Extras TStaticText, TBevel, TShape, TSpeedButton, TBitBtn, TRadioGroup, TCheckListBox, TUpDown, TPaintBox
Vega.Grids TStringGrid
Vega.ListView TListView, THeaderControl
Vega.Images TImage, TImageList
Vega.Calendar TMonthCalendar
Vega.EditBtn TFileNameEdit, TDirectoryEdit, TDateEdit
Vega.Menus TMainMenu, TPopupMenu, TMenuItem
Vega.Dialogs ShowMessage, MessageDlg, ConfirmDlg, InputBox
Vega.FileDlg, Vega.ColorDlg, Vega.FontDlg Datei-, Farb- und Schriftauswahl

Container

Ein Container ist ein gewöhnliches Control mit Kindern — TPanel, TGroupBox, TScrollBox, TTabSheet oder schlicht new TControl(). Kinder werden relativ zum Container positioniert.

Zwei Regeln, die zusammen jedes Layout erklären:

  • Ränder vor AL_CLIENT. Die Reihenfolge, in der Kinder angelegt werden, ist die Reihenfolge, in der sie sich Fläche nehmen.
  • ApplyLayout() wirkt eine Ebene tief. Ein Container in einem Container richtet seine eigenen Kinder erst aus, wenn jemand sein ApplyLayout ruft — üblicherweise im OnResize des Fensters.

var mm: TMainMenu := new TMainMenu();
var mDatei: TMenuItem := mm.Add("Datei");
mDatei.Add("Info").OnClick := OnInfo;
mDatei.AddSeparator();
mDatei.Add("Beenden").OnClick := OnBeenden;
mDatei.Item(2).SetShortcut(113, MOD_CTRL);     // Strg+Q
f.SetMenu(mm);

Add liefert den neu angelegten Eintrag zurück — daher die kurze Schreibweise mit direkt angehängtem OnClick. Auf schon angelegte Einträge kommt man über Item(index).


Dialoge

ShowMessage(g_app, "Gespeichert.");
if (ConfirmDlg(g_app, "Wirklich beenden?")) { g_app.Terminate(); }

Alle Dialoge brauchen die TApplication als erstes Argument. Wer Dialoge aus einer eigenen Unit ruft, muss ihr die Anwendung bekannt machen — sonst steigt der Aufruf still wieder aus.


Beispiel mit mehreren Komponenten

Menüleiste, Randleiste mit Eingabefeld und Knopf, Gruppe mit Auswahlfeldern, Liste als Restfläche:

unit Main;

import std.io;
import Vega.Types;
import Vega.Events;
import Vega.Canvas;
import Vega.Theme;
import Vega.Control;
import Vega.Font;
import Vega.Strings;
import Vega.Lists;
import Vega.Style;
import Vega.StdCtrls;
import Vega.Edits;
import Vega.ListCtrls;
import Vega.ExtCtrls;
import Vega.Menus;
import Vega.Dialogs;
import Vega.Backend;
import Vega.BackendAuto;
import Vega.Forms;

var g_app: TApplication;
var g_liste: TListBox;
var g_feld: TEdit;

fn OnHinzu(sender: TControl): void {
  g_liste.Items.Add(g_feld.GetText());
  g_liste.Invalidate();
}

fn OnInfo(sender: TControl): void {
  ShowMessage(g_app, "Ein Beispiel mit mehreren Komponenten.");
}

fn OnBeenden(sender: TControl): void { g_app.Terminate(); }

fn main(): int64 {
  g_app := new TApplication(NewPlatformBackend());
  if (!g_app.Ready) { PrintLn("Kein Fenstersystem erreichbar."); return 1; }

  var f: TForm := new TForm(460, 320, "Komponenten");
  f.Position := POS_SCREEN_CENTER;

  // Menue
  var menu: TMainMenu := new TMainMenu();
  var mDatei: TMenuItem := menu.Add("Datei");
  mDatei.Add("Info").OnClick := OnInfo;
  mDatei.AddSeparator();
  mDatei.Add("Beenden").OnClick := OnBeenden;
  mDatei.Item(2).SetShortcut(113, MOD_CTRL);      // Strg+Q
  f.SetMenu(menu);

  // Container: die Randleiste zuerst, das AL_CLIENT-Kind zuletzt
  var leiste: TPanel := new TPanel();
  leiste.Height := 40;
  leiste.Align := AL_BOTTOM;
  leiste.SetParent(f);

  g_feld := new TEdit("Neuer Eintrag");
  g_feld.SetBounds(8, 8, 220, 24);
  g_feld.SetParent(leiste);

  var b: TButton := new TButton("Hinzufuegen");
  b.SetBounds(240, 6, 120, 28);
  b.OnClick := OnHinzu;
  b.SetParent(leiste);

  // Gruppe mit Auswahlfeldern als linke Spalte
  var gb: TGroupBox := new TGroupBox("Optionen");
  gb.Align := AL_LEFT;
  gb.Width := 160;
  gb.SetParent(f);

  var cb: TCheckBox := new TCheckBox("Sortiert");
  cb.SetBounds(12, 24, 130, 20);
  cb.SetParent(gb);

  var rb: TRadioButton := new TRadioButton("Aufsteigend");
  rb.SetBounds(12, 48, 130, 20);
  rb.SetParent(gb);

  // Die Liste bekommt den Rest
  g_liste := new TListBox();
  g_liste.Align := AL_CLIENT;
  g_liste.Items.Add("Erster Eintrag");
  g_liste.Items.Add("Zweiter Eintrag");
  g_liste.SetParent(f);

  if (!g_app.ShowForm(f)) { return 2; }
  f.ApplyLayout();
  g_app.Run();
  g_app.Shutdown();
  return 0;
}

Nachgemessen mit lyxc 1.1.3I: übersetzt fehlerfrei (lyxc komponenten.lyx -I . -I platform/linux -o komponenten, rund 837 KB).


Eigene Komponenten

Reicht der Vorrat nicht, leitet man von TControl ab und überschreibt Paint — siehe Anwendungen aufbauen. Für eine Fläche, die nur zeichnet und sonst nichts kann, gibt es TPaintBox mit OnPaint.

Letzte Aktualisierung: 2026-08-19 — Unit-Zuordnung aus Vega/*.lyx erhoben, Beispiel mit lyxc 1.1.3I übersetzt.