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); }

  • ItemIndex ist die Auswahl, TopIndex die erste sichtbare Zeile.
  • MultiSelect erlaubt mehrere; Sorted hält die Liste sortiert.
  • Nach dem Ändern von Items auß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

  • ItemIndex ist -1, wenn nichts gewählt ist. Ohne die Prüfung greift Items.Get(-1) daneben.
  • RowCount vor SetCell setzen. Zellen jenseits der eingestellten Größe gehen ins Leere.
  • FixedRows zählt mit. Bei einer Kopfzeile ist die erste Datenzeile 1, nicht 0.
  • 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.