Vega — Listen, Tabellen und Bäume
Vier Komponenten für Daten, die aus mehr als einem Wert bestehen — und vier verschiedene Arten, sie zu füllen. Wer weiß, welche Struktur eine Komponente innen hat, weiß auch, wie er sie befüllt.
| Komponente | Unit | Innen |
|---|---|---|
| TListBox | Vega.ListCtrls | Items — eine TStringList |
| TComboBox | Vega.ListCtrls | dieselbe Items-Liste, nur eingeklappt |
| TListView | Vega.ListView | Columns + Items aus TListItem mit SubItems |
| TStringGrid | Vega.Grids | Zellen über SetCell(spalte, zeile, text) |
| TTreeView | Vega.Trees | TTreeNode-Baum, Kinder über Add am Knoten |
→ Vega-Guides · Komponenten · Referenz aller Steuerelemente
Liste und Auswahlfeld
g_liste.Items.Add("Erster Eintrag");
g_liste.OnSelect := OnAuswahl;
…
var i: int64 := g_liste.ItemIndex; // -1 = nichts gewählt
if (i >= 0) { var t: pchar := g_liste.Items.Get(i); }
ItemIndexist die Auswahl,TopIndexdie erste sichtbare Zeile.MultiSelecterlaubt mehrere;Sortedhält die Liste sortiert.- Nach dem Ändern von
Itemsaußerhalb eines Handlers:Invalidate().
Mehrspaltige Liste
lv.AddColumn("Datei", 160);
lv.AddColumn("Groesse", 100);
var it: TListItem := lv.AddItem("paula.lyx"); // erste Spalte = Caption
it.AddSubItem("48 kB"); // jede weitere = SubItem
Ein TListItem trägt seine erste Spalte als Caption, alle weiteren in SubItems — dieselbe Aufteilung wie in Delphi. ClearItems() und ClearColumns() räumen auf.
Tabelle
grid.ColCount := 3;
grid.RowCount := 4;
grid.FixedRows := 1; // erste Zeile ist Kopfzeile
grid.GridLines := true;
grid.SetCell(1, 0, "Name"); // Spalte 1, Zeile 0
Col und Row sind die aktuelle Zelle, TopRow/LeftCol der sichtbare Ausschnitt, RowSelect schaltet auf zeilenweise Auswahl. FixedCols/FixedRows legen fest, wie viele Spalten und Zeilen beim Scrollen stehen bleiben.
Baum
var wurzel: TTreeNode := g_baum.Add("Projekt");
wurzel.Add("Quellen");
wurzel.Add("Daten");
wurzel.Expanded := true;
Add am Baum legt einen Wurzelknoten an, Add am Knoten ein Kind — dieselbe Methode, unterschiedlicher Empfänger. Der Text eines Knotens liegt in Text (TTextBuffer).
Beispiel mit allen fünf
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.ListCtrls;
import Vega.ListView;
import Vega.Grids;
import Vega.Trees;
import Vega.Backend;
import Vega.BackendAuto;
import Vega.Forms;
var g_app: TApplication;
var g_status: TLabel;
var g_liste: TListBox;
var g_baum: TTreeView;
fn OnBeenden(sender: TControl): void { g_app.Terminate(); }
// Ein Handler fuer beide Listen: der sender sagt, welche es war.
fn OnAuswahl(sender: TControl): void {
if (sender == g_liste as TControl) {
var i: int64 := g_liste.ItemIndex;
if (i >= 0) {
var t: pchar := g_liste.Items.Get(i);
g_status.SetCaption(t);
}
return;
}
g_status.SetCaption("Baumknoten gewaehlt");
}
fn main(): int64 {
g_app := new TApplication(NewPlatformBackend());
if (!g_app.Ready) { PrintLn("Kein Fenstersystem erreichbar."); return 1; }
var f: TForm := new TForm(640, 420, "Listen, Tabellen, Baeume");
g_status := new TLabel("bereit");
g_status.SetBounds(12, 8, 480, 18);
g_status.SetParent(f);
// Einfache Liste: Zeichenketten in Items, Auswahl ueber ItemIndex
g_liste := new TListBox();
g_liste.SetBounds(12, 32, 180, 140);
g_liste.Items.Add("Erster Eintrag");
g_liste.Items.Add("Zweiter Eintrag");
g_liste.Items.Add("Dritter Eintrag");
g_liste.OnSelect := OnAuswahl;
g_liste.SetParent(f);
// Auswahlfeld: dieselbe Items-Liste, nur eingeklappt
var kombi: TComboBox := new TComboBox();
kombi.SetBounds(12, 182, 180, 26);
kombi.Items.Add("Klein");
kombi.Items.Add("Mittel");
kombi.Items.Add("Gross");
kombi.ItemIndex := 1;
kombi.SetParent(f);
// Mehrspaltige Liste: Spalten anlegen, dann Zeilen
var lv: TListView := new TListView();
lv.SetBounds(204, 32, 300, 140);
lv.AddColumn("Datei", 160);
lv.AddColumn("Groesse", 100);
var it1: TListItem := lv.AddItem("paula.lyx");
it1.AddSubItem("48 kB");
var it2: TListItem := lv.AddItem("song.mmd");
it2.AddSubItem("12 kB");
lv.SetParent(f);
// Tabelle: Zellen ueber SetCell(spalte, zeile, text)
var grid: TStringGrid := new TStringGrid();
grid.SetBounds(12, 220, 492, 130);
grid.ColCount := 3;
grid.RowCount := 4;
grid.FixedRows := 1;
grid.GridLines := true;
grid.SetCell(0, 0, "Nr");
grid.SetCell(1, 0, "Name");
grid.SetCell(2, 0, "Wert");
grid.SetCell(0, 1, "1");
grid.SetCell(1, 1, "Tempo");
grid.SetCell(2, 1, "125");
grid.SetCell(0, 2, "2");
grid.SetCell(1, 2, "Zeilen");
grid.SetCell(2, 2, "64");
grid.SetParent(f);
// Baum: Wurzelknoten anlegen, Kinder daran haengen
g_baum := NewTreeView();
g_baum.SetBounds(516, 32, 110, 318);
var wurzel: TTreeNode := g_baum.Add("Projekt");
wurzel.Add("Quellen");
wurzel.Add("Daten");
wurzel.Expanded := true;
g_baum.OnSelect := OnAuswahl;
g_baum.SetParent(f);
var ende: TButton := new TButton("Beenden");
ende.SetBounds(516, 360, 110, 28);
ende.OnClick := OnBeenden;
ende.SetParent(f);
if (!g_app.ShowForm(f)) { return 2; }
g_app.Run();
g_app.Shutdown();
return 0;
}
Übersetzen: lyxc listen.lyx -I . -I platform/linux -o listen. Nachgemessen mit lyxc 1.1.3I, übersetzt fehlerfrei.
Ein Handler für mehrere Listen
OnSelect ist ein TNotifyEvent — der sender sagt, welche Liste es war:
fn OnAuswahl(sender: TControl): void {
if (sender == g_liste as TControl) { … }
}
Wo mehrere gleichartige Listen dasselbe tun sollen, unterscheidet man sie über sender.Tag oder sender.Name — das spart die Sorte Code, die sich sonst pro Liste wiederholt.
Fallstricke
ItemIndexist-1, wenn nichts gewählt ist. Ohne die Prüfung greiftItems.Get(-1)daneben.RowCountvorSetCellsetzen. Zellen jenseits der eingestellten Größe gehen ins Leere.FixedRowszählt mit. Bei einer Kopfzeile ist die erste Datenzeile1, nicht0.- Nach dem Füllen
Invalidate(), wenn es nicht ohnehin in einem Handler passiert.
Letzte Aktualisierung: 2026-08-19 — API gegen Vega/ListCtrls.lyx, Vega/ListView.lyx, Vega/Grids.lyx und Vega/Trees.lyx erhoben; Beispiel mit lyxc 1.1.3I übersetzt.
