====== Vega — Komponenten in die Anwendung bringen ======
Wie eine Komponente in die Anwendung kommt, ist immer dieselbe Folge:
- **Unit importieren** — Komponenten liegen nach Themen getrennt (''Vega.StdCtrls'', ''Vega.Edits'', ''Vega.ListCtrls'' …).
- **Anlegen** — ''new TButton("Text")'' oder die Hülle ''NewButton("Text")''; beides ist dasselbe.
- **Einstellen** — Geometrie, ''Align'', Handler.
- **Einhängen** — ''SetParent(eltern)''. Ohne diesen Schritt wird nichts gezeichnet.
→ [[lyx_-_programmiersprache:vega:guides:erste-anwendung|Erste Anwendung]] · [[lyx_-_programmiersprache:vega:guides:eigenschaften|Eigenschaften]] · [[lyx_-_programmiersprache:vega:guides:events|Ereignisse]] · [[lyx_-_programmiersprache:vega:controls|Referenz aller Steuerelemente]]
----
===== Welche Unit für welche Komponente =====
^ Unit ^ Komponenten ^
| ''Vega.StdCtrls'' | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]], [[lyx_-_programmiersprache:vega:controls:tlabel|TLabel]], [[lyx_-_programmiersprache:vega:controls:tbutton|TButton]], [[lyx_-_programmiersprache:vega:controls:tcheckbox|TCheckBox]], [[lyx_-_programmiersprache:vega:controls:tradiobutton|TRadioButton]], [[lyx_-_programmiersprache:vega:controls:tgroupbox|TGroupBox]], [[lyx_-_programmiersprache:vega:controls:tprogressbar|TProgressBar]] |
| ''Vega.Edits'' | [[lyx_-_programmiersprache:vega:controls:tedit|TEdit]] (einzeilig), [[lyx_-_programmiersprache:vega:controls:tmemo|TMemo]] (mehrzeilig) |
| ''Vega.ListCtrls'' | [[lyx_-_programmiersprache:vega:controls:tlistbox|TListBox]], [[lyx_-_programmiersprache:vega:controls:tcombobox|TComboBox]], [[lyx_-_programmiersprache:vega:controls:tscrollbar|TScrollBar]] |
| ''Vega.ExtCtrls'' | [[lyx_-_programmiersprache:vega:controls:ttrackbar|TTrackBar]], [[lyx_-_programmiersprache:vega:controls:tspinedit|TSpinEdit]], [[lyx_-_programmiersprache:vega:controls:tpagecontrol|TPageControl]] + [[lyx_-_programmiersprache:vega:controls:ttabsheet|TTabSheet]], [[lyx_-_programmiersprache:vega:controls:ttabcontrol|TTabControl]] |
| ''Vega.Extras'' | [[lyx_-_programmiersprache:vega:controls:tstatictext|TStaticText]], [[lyx_-_programmiersprache:vega:controls:tbevel|TBevel]], [[lyx_-_programmiersprache:vega:controls:tshape|TShape]], [[lyx_-_programmiersprache:vega:controls:tspeedbutton|TSpeedButton]], [[lyx_-_programmiersprache:vega:controls:tbitbtn|TBitBtn]], [[lyx_-_programmiersprache:vega:controls:tradiogroup|TRadioGroup]], [[lyx_-_programmiersprache:vega:controls:tchecklistbox|TCheckListBox]], [[lyx_-_programmiersprache:vega:controls:tupdown|TUpDown]], [[lyx_-_programmiersprache:vega:controls:tpaintbox|TPaintBox]] |
| ''Vega.Grids'' | [[lyx_-_programmiersprache:vega:controls:tstringgrid|TStringGrid]] |
| ''Vega.ListView'' | [[lyx_-_programmiersprache:vega:controls:tlistview|TListView]], [[lyx_-_programmiersprache:vega:controls:theadercontrol|THeaderControl]] |
| ''Vega.Images'' | [[lyx_-_programmiersprache:vega:controls:timage|TImage]], [[lyx_-_programmiersprache:vega:controls:timagelist|TImageList]] |
| ''Vega.Calendar'' | [[lyx_-_programmiersprache:vega:controls:tmonthcalendar|TMonthCalendar]] |
| ''Vega.EditBtn'' | [[lyx_-_programmiersprache:vega:controls:tfilenameedit|TFileNameEdit]], [[lyx_-_programmiersprache:vega:controls:tdirectoryedit|TDirectoryEdit]], [[lyx_-_programmiersprache:vega:controls:tdateedit|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.
----
===== Menüs =====
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 [[lyx_-_programmiersprache:vega:controls:tapplication|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 [[lyx_-_programmiersprache:vega:controls:tcontrol|TControl]] ab und überschreibt ''Paint'' — siehe [[lyx_-_programmiersprache:vega:praxis|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.