====== TComponent — Wurzel aller Vega-Objekte ======
Die gemeinsame Wurzel: sie trägt **Besitz**, **Namen**, **Tag** und den Zustand einer Komponente — aber keine Geometrie und kein Zeichnen. Das kommt erst bei [[lyx_-_programmiersprache:vega:controls:tcontrol|TControl]] dazu.
Unit: ''Vega.Component'' · Basis: keine
→ [[lyx_-_programmiersprache:vega:controls|Alle Steuerelemente]] · [[lyx_-_programmiersprache:vega:controls:tcontrol|TControl]]
----
===== Wer hängt woran =====
Vega zieht die Trennlinie **anders als Delphi**, und zwar an der Frage, wer selbst in den Rahmenpuffer malt:
^ Zeichnet selbst ^ Zeichnet nie, hält oder tickt nur ^
| [[lyx_-_programmiersprache:vega:controls:tcontrol|TControl]] und alles darunter | [[lyx_-_programmiersprache:vega:controls:ttimer|TTimer]], [[lyx_-_programmiersprache:vega:controls:timagelist|TImageList]] |
In Delphi sind auch Menüs und Dialoge nichtsichtbare Komponenten — aber nur, weil Windows sie selbst zeichnet und die VCL-Klasse ein Umschlag um ''HMENU'' bzw. ''GetOpenFileName'' ist. Vega zeichnet alles selbst, also bleiben ''TPopupMenu'' und die Dialoge im Control-Ast.
----
===== Verwendung =====
var f: TForm := new TForm(320, 200, "Fenster");
var b: TButton := new TButton("OK");
b.SetName("BtnOk");
b.SetParent(f as TControl);
f.InsertComponent(b as TComponent); // siehe Besonderheiten
Print(IntToStr(f.ComponentCount())); // 1
Print(IntToStr(b.ComponentIndex())); // 0
var g: TComponent := f.FindComponent("BtnOk"); // findet den Knopf
Print(b.GetName()); // BtnOk
Print(IntToStr(b.HasParent() as int64)); // 1
b.SetState(csDesigning);
Print(IntToStr(b.HasState(csDesigning) as int64)); // 1
b.ClearState(csDesigning);
var oc: TControl := b.OwnerControl(); // das Fenster
----
===== Besonderheiten =====
* **''Owner'' ist nicht ''Parent''.** ''Owner'' sagt, wer aufräumt; ''Parent'' ist der Platz im Zeichenbaum. ''AddChild'' reicht den Besitzer nach unten durch, damit ein Handler über ''sender.Owner'' das Formular findet, egal wie tief das Control hängt. Von einem Control aus führt [[lyx_-_programmiersprache:vega:controls:tcontrol|''OwnerControl()'']] direkt dorthin, ohne Umwandlung von Hand.
> **''SetParent'' trägt die Komponente nicht in ''OwnedComponents'' ein.** ''AddChild'' setzt das Feld ''Owner'' direkt, statt ''InsertComponent'' zu rufen. Nachgemessen mit ''lyxc 1.1.4A'': nach ''b.SetParent(f)'' ist ''b.Owner'' das Formular, aber ''f.ComponentCount()'' ist ''0'', ''b.ComponentIndex()'' ist ''-1'' und ''f.FindComponent("BtnOk")'' liefert ''null''.
>
> Bis das zusammengeführt ist: wer über ''FindComponent'' suchen will — der Delphi-Weg — ruft nach dem ''SetParent'' zusätzlich ''InsertComponent''. Dann stimmen alle vier Werte.
* **Kein Konstruktor.** Lyx vererbt Konstruktoren nicht; jede Ableitung ruft ''InitComponent()'' im eigenen ''Create()''.
* ''Destroy'' räumt die eigene Liste ab, **nicht** die Einträge darin. Wer seine Besitztümer mitnehmen will, ruft ''DestroyComponents()'' — das geht die Liste von hinten durch, weil sich jedes ''Destroy'' selbst austrägt.
* ''FindComponent'' sucht **eine Ebene tief**, unter den eigenen Komponenten, wie in Delphi. Für den ganzen Baum braucht es eine eigene Schleife.
* ''ComponentState'' und ''ComponentStyle'' sind **Bitmasken**, gelesen und gesetzt über ''HasState''/''SetState''/''ClearState'':
^ Zustand ^ Wert ^ Bedeutung ^
| ''csLoading'' | 1 | Liest gerade aus einer Formulardatei |
| ''csReading'' | 2 | Einzelne Eigenschaft wird gelesen |
| ''csWriting'' | 4 | Wird gerade geschrieben |
| ''csDestroying'' | 8 | Abbau läuft |
| ''csDesigning'' | 16 | Im Entwurf, nicht zur Laufzeit |
| ''csAncestor'' | 32 | Aus einem geerbten Formular |
| ''csUpdating'' | 64 | Sammeländerung läuft |
| ''csFixups'' | 128 | Verweise werden nachgetragen |
| ''csFreeNotification'' | 256 | Will vom Verschwinden anderer erfahren |
| ''csInline'' | 512 | Eingebettetes Formular |
^ Stil ^ Wert ^ Bedeutung ^
| ''csInheritable'' | 1 | Vorgabe, wie in Delphi |
| ''csCheckPropAvail'' | 2 | Eigenschaften vor dem Zugriff prüfen |
| ''csSubComponent'' | 4 | Gehört fest zu einer anderen Komponente |
| ''csTransient'' | 8 | Wird nicht gespeichert |
* **''Tick'' und ''NextDueIn'' gibt es in Delphi nicht.** Vega hält keine Betriebssystem-Zeitgeber je Komponente, sondern geht einmal je Bild über die Komponenten. ''Tick(now)'' liefert ''true'', wenn sich etwas getan hat und neu gezeichnet werden muss; ''NextDueIn(now)'' sagt, wie lange die Schleife höchstens schlafen darf — ''-1'' heißt „nie von selbst". Beides ist virtuell, damit die Schleife nur die Wurzel kennen muss.
* ''HasParent'' und ''GetParentComponent'' melden in der Wurzel „nirgends"; [[lyx_-_programmiersprache:vega:controls:tcontrol|TControl]] überschreibt beide mit ''Parent''.
* **Bewusst weggelassen** (mit Begründung in ''Vega/Component.lyx''): COM (''ComObject'', ''SafeCallException'' …) — gibt es außerhalb von Windows nicht; die Streaming-Haken der Delphi-IDE (''DesignInfo'', ''WriteState'', ''SetSubComponent'' …) — Vega liest und schreibt Formulare über [[lyx_-_programmiersprache:vega:guides:lfm|Vega.Lfm]]; ''FreeNotification''/''Notification'' — wäre ohne Wirkung, solange keine Komponente eine fremde referenziert; ''ExecuteAction''/''UpdateAction'' — bleibt in [[lyx_-_programmiersprache:vega:guides:befehle|Vega.Actions]].
Letzte Aktualisierung: 2026-08-20 — API maschinell aus ''Vega/Component.lyx'' erhoben, Beispiel mit ''lyxc 1.1.4A'' übersetzt und ausgeführt.
===== Eigenschaften =====
Alle Eigenschaften, auch die geerbten.
^ Name ^ Typ ^ Bedeutung ^ Herkunft ^
| ''Owner'' | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | Wer diese Komponente wegräumt — nicht das Elternteil im Zeichenbaum | eigen |
| ''OwnedComponents'' | [[lyx_-_programmiersprache:vega:controls:tobjectlist|TObjectList]] | Die Komponenten, die dieser gehören (Delphis ''Components[]'') | eigen |
| ''Name'' | [[lyx_-_programmiersprache:sprache:datentypen#pchar_nullterminierter_string|pchar]] | Name der Komponente, für ''FindComponent'' und Formulardateien | eigen |
| ''Tag'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Freier Wert für die Anwendung | eigen |
| ''ComponentState'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Zustand als Bitmaske: ''csLoading'', ''csDestroying'', ''csDesigning'' … | eigen |
| ''ComponentStyle'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Stil als Bitmaske; Vorgabe ''csInheritable'' | eigen |
----
===== Methoden =====
Alle Methoden, auch die geerbten.
^ Signatur ^ Zweck ^ Herkunft ^
| ''InitComponent(): void'' | Grundzustand herstellen — von jeder Ableitung im ''Create'' zu rufen, da Lyx Konstruktoren nicht vererbt | eigen |
| ''Destroy(): void'' | Gibt eigene Ressourcen frei | eigen |
| ''ComponentCount(): int64'' | Anzahl der eigenen Komponenten | eigen |
| ''Components(index: int64): TComponent'' | Eigene Komponente an dieser Stelle | eigen |
| ''ComponentIndex(): int64'' | Eigener Platz in der Liste des Besitzers, ''-1'' ohne Besitzer | eigen |
| ''InsertComponent(c: TComponent): void'' | Komponente in Besitz nehmen; ein bisheriger Besitzer gibt sie ab | eigen |
| ''RemoveComponent(c: TComponent): void'' | Komponente aus dem Besitz nehmen | eigen |
| ''FindComponent(name: pchar): TComponent'' | Eigene Komponente über ihren ''Name'' suchen — eine Ebene tief | eigen |
| ''DestroyComponents(): void'' | Alle Besitztümer abbauen, von hinten nach vorn | eigen |
| ''SetName(v: pchar): void'' | Namen setzen | eigen |
| ''GetName(): pchar'' | Namen lesen | eigen |
| ''SetTag(v: int64): void'' | ''Tag'' setzen | eigen |
| ''GetTag(): int64'' | ''Tag'' lesen | eigen |
| ''HasState(bits: int64): bool'' | Sind diese Zustandsbits gesetzt | eigen |
| ''SetState(bits: int64): void'' | Zustandsbits setzen | eigen |
| ''ClearState(bits: int64): void'' | Zustandsbits löschen | eigen |
| ''HasParent(): bool'' | Hängt die Komponente in einem Baum | eigen |
| ''GetParentComponent(): TComponent'' | Übergeordnete Komponente im Baum | eigen |
| ''GetNamePath(): pchar'' | Voller Name für Formulardateien; in Vega der Name selbst | eigen |
| ''Tick(now: int64): bool'' | Einmal je Bild aus der Fensterschleife; ''true'' = es hat sich etwas getan, also neu zeichnen | eigen |
| ''NextDueIn(now: int64): int64'' | Wie lange die Schleife höchstens schlafen darf, bis diese Komponente wieder dran ist; ''-1'' = nie von selbst | eigen |
----
===== Ereignisse =====
Keine.
Letzte Aktualisierung: 2026-08-20 — API maschinell aus ''Vega/Component.lyx'' erhoben, Beispiel mit ''lyxc 1.1.4A'' übersetzt und ausgeführt.