TObjectList — Liste von Objektverweisen
Eine wachsende Liste, die Adressen hält, keine Objekte. Vega benutzt sie überall dort, wo eine Klasse beliebig viele andere Objekte verwaltet: die Kinder eines TControl, die Spalten und Einträge einer TListView, die Fenster einer TApplication.
Unit: Vega.Lists
→ Alle Steuerelemente · Speicher in der Praxis
Einordnung
Lyx kennt keine generischen Klassen. Eine Liste je Elementtyp von Hand zu schreiben wäre derselbe Code in vielen Fassungen — deshalb hält TObjectList rohe Adressen (int64), und der Aufrufer castet beim Herausholen zurück:
var e: TEintrag := liste.Get(1) as TEintrag;
Das ist der Preis dafür, dass es die Liste überhaupt nur einmal gibt. Wer Zeichenketten braucht, nimmt TStringList; wer Zahlen braucht, TIntArray — beide ebenfalls in Vega.Lists.
Verwendung
unit Main;
import std.io;
import Vega.Types;
import Vega.Strings;
import Vega.Lists;
pub type TEintrag = class {
Nummer: int64;
fn Create(n: int64): void { self.Nummer := n; }
}
fn main(): int64 {
var liste: TObjectList := NewObjectList();
// Objekte anlegen und ihre Adressen ablegen
var i: int64 := 0;
while (i < 3) {
var e: TEintrag := new TEintrag(i * 10);
liste.Add(e as int64);
i := i + 1;
}
// Herausholen: die Liste liefert eine Adresse, der Aufrufer castet
var zweiter: TEintrag := liste.Get(1) as TEintrag;
PrintLn(StrConcat("zweiter: ", IntToStr(zweiter.Nummer)));
// Einfuegen, tauschen, suchen
var neu: TEintrag := new TEintrag(99);
liste.Insert(0, neu as int64);
liste.Exchange(0, 1);
PrintLn(StrConcat("Index von neu: ", IntToStr(liste.IndexOf(neu as int64))));
PrintLn(StrConcat("Anzahl: ", IntToStr(liste.Count)));
// Entfernen entfernt nur den VERWEIS — das Objekt lebt weiter
liste.Delete(0);
PrintLn(StrConcat("nach Delete: ", IntToStr(liste.Count)));
// Aufraeumen: erst die Eintraege, dann die Liste
var k: int64 := 0;
while (k < liste.Count) {
var obj: TEintrag := liste.Get(k) as TEintrag;
dispose obj;
k := k + 1;
}
dispose neu;
liste.Destroy();
return 0;
}
zweiter: 10
Index von neu: 1
Anzahl: 4
nach Delete: 3
Übersetzt und ausgeführt mit lyxc 1.1.3I.
Besonderheiten
- Die Liste gibt ihre Einträge nicht frei. Es gibt keinen gemeinsamen Destruktor, den man über einen rohen Verweis aufrufen könnte. Wer die Objekte anlegt, räumt sie auch weg —
Destroy()der Liste gibt nur ihren eigenen Speicher zurück. DeleteundClearentfernen nur den Verweis, nicht das Objekt. Wer vorher nichtdisposeruft, hat ein Leck.Get(i)liefert bei ungültigem Index0statt abzustürzen — die Prüfungif (p != 0)lohnt sich, wenn der Index aus einer Berechnung stammt.- Der Speicher liegt auf dem Heap. Als Inline-Feld in einer
TControl-Ableitung würde er in dessen Kinderfeld ragen (#1630) — deshalb immer als Objekt anlegen, nie als Inline-Array. - Die Kapazität wächst in Zweierschritten ab
VEGA_LIST_MIN_CAP(8).Reserve(n)nimmt das vorweg, wenn die Zahl der Einträge bekannt ist. InsertundDeleteverschieben die folgenden Einträge — bei großen Listen in einer Schleife merkbar.Addist billig.
Eigenschaften
Alle Eigenschaften, auch die geerbten.
| Name | Typ | Bedeutung | Herkunft |
|---|---|---|---|
Items | int64 | Die Einträge | eigen |
Count | int64 | Anzahl der Verweise | eigen |
Capacity | int64 | Platz, bevor die Liste wächst | eigen |
Methoden
Alle Methoden, auch die geerbten.
| Signatur | Zweck | Herkunft |
|---|---|---|
Create(): void | Anlegen; NewObjectList() | eigen |
Destroy(): void | Gibt den eigenen Speicher frei, nicht die Einträge | eigen |
Reserve(n: int64): bool | Platz für n Einträge vorab belegen | eigen |
Get(i: int64): int64 | Verweis lesen; 0 bei ungültigem Index | eigen |
Put(i: int64, obj: int64): void | Verweis ersetzen | eigen |
Add(obj: int64): int64 | Verweis anhängen, liefert den Index (-1 bei Speichermangel) | eigen |
Insert(index: int64, obj: int64): int64 | Verweis einfügen; der Index wird auf 0..Count begrenzt | eigen |
Delete(index: int64): void | Verweis entfernen, Folgende rücken auf | eigen |
IndexOf(obj: int64): int64 | Index eines Verweises; -1, wenn nicht enthalten | eigen |
Clear(): void | Alle Verweise vergessen (Count := 0) | eigen |
Exchange(a: int64, b: int64): void | Zwei Einträge tauschen | eigen |
Ereignisse
Keine.
Letzte Aktualisierung: 2026-08-19 — API aus Vega/Lists.lyx erhoben, Beispiel mit lyxc 1.1.3I übersetzt und ausgeführt.
