Wie eine Komponente in die Anwendung kommt, ist immer dieselbe Folge:
Vega.StdCtrls, Vega.Edits, Vega.ListCtrls …).new TButton(„Text“) oder die Hülle NewButton(„Text“); beides ist dasselbe.Align, Handler.SetParent(eltern). Ohne diesen Schritt wird nichts gezeichnet.→ Erste Anwendung · Eigenschaften · Ereignisse · Referenz aller Steuerelemente
| 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 |
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:
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).
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.
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).
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.