====== Vega — Eigenschaften ====== Jedes Steuerelement erbt von [[lyx_-_programmiersprache:vega:controls:tcontrol|TControl]] und damit denselben Satz Eigenschaften: Geometrie, Zustand, Ausrichtung, Schrift, Zeiger. Wer sie kennt, kennt 90 % jeder Vega-Komponente — der Rest sind die paar Felder, die eine Liste, ein Eingabefeld oder ein Fortschrittsbalken zusätzlich mitbringt. → [[lyx_-_programmiersprache:vega:guides:erste-anwendung|Erste Anwendung]] · [[lyx_-_programmiersprache:vega:guides:events|Ereignisse]] · [[lyx_-_programmiersprache:vega:guides:komponenten|Komponenten]] ---- ===== Geometrie ===== ^ Eigenschaft ^ Bedeutung ^ | ''Left'', ''Top'' | Position **relativ zum Elternteil**. Absolute Koordinaten entstehen erst beim Zeichnen. | | ''Width'', ''Height'' | Größe in Pixeln. | | ''SetBounds(l, t, w, h)'' | Alle vier auf einmal — und dabei werden die Größengrenzen durchgesetzt. | | ''MinWidth'', ''MinHeight'', ''MaxWidth'', ''MaxHeight'' | Grenzen; ''0'' heißt „keine". Gelten auch beim Layout und beim Ziehen am Fensterrand. | | ''ClientRect()'' | Die Fläche **ohne** Rahmen — das, worauf man zeichnet. | Mehrere Zuweisungen hintereinander zieht man mit ''BeginUpdate()'' / ''EndUpdate()'' zusammen: dazwischen wird nicht neu gezeichnet. ---- ===== Ausrichtung und Anker ===== ''Align'' verteilt Fläche, ''Anchors'' verteilt Zuwachs. ^ ''Align'' ^ Wirkung ^ | ''AL_NONE'' | Nur ''Left''/''Top''/''Width''/''Height'' zählen (Vorgabe). | | ''AL_TOP'' / ''AL_BOTTOM'' | Volle Breite am oberen/unteren Rand, ''Height'' bleibt. | | ''AL_LEFT'' / ''AL_RIGHT'' | Volle Höhe am linken/rechten Rand, ''Width'' bleibt. | | ''AL_CLIENT'' | Der ganze Rest. | **Die Reihenfolge der Kinder ist das Layout**: Ränder zuerst anlegen, das ''AL_CLIENT''-Kind zuletzt — jedes ausgerichtete Kind nimmt sich seinen Streifen vom verbleibenden Rest. ''Anchors'' ist eine Bitmaske aus ''ANCHOR_LEFT'' (1), ''ANCHOR_TOP'' (2), ''ANCHOR_RIGHT'' (4) und ''ANCHOR_BOTTOM'' (8). Vorgabe ist ''ANCHOR_LEFT | ANCHOR_TOP'' — das Element bleibt oben links kleben. Mit ''ANCHOR_RIGHT | ANCHOR_BOTTOM'' wandert es beim Vergrößern mit. ---- ===== Zustand ===== ^ Eigenschaft ^ Bedeutung ^ | ''Visible'' | Wird gezeichnet und nimmt am Layout teil. | | ''Enabled'' | Nimmt Eingaben an; gesperrte Elemente zeichnen sich blass. | | ''Focused'' | Hat den Tastaturfokus (lesen; gesetzt wird er über ''Dispatcher.SetFocus''). | | ''Hovered'', ''Pressed'' | Zeiger darüber / Taste gedrückt — für die Darstellung in ''Paint''. | | ''CanFocus'' | **Kann** das Element den Fokus überhaupt bekommen? | | ''TabStop'' | Wird es beim Tabulator angesteuert? | | ''Cursor'' | Mauszeiger (''CUR_*''); ''CUR_DEFAULT'' erbt vom Elternteil. | | ''Tag'' | Freier ''int64'' für die Anwendung — Vega rührt ihn nicht an. | | ''Name'' | Bezeichner des Elements; landet auch im LFM-Formularformat. | | ''Font'' | Eigene Schrift oder ''0'' = die des Elternteils. **Zeiger, keine Kopie** — mehrere Elemente teilen sich eine Schrift. | ---- ===== Baum ===== ''Parent'' ist die zeichnerische Verschachtelung, ''Owner'' die logische Zugehörigkeit (meist die Form). Eingehängt wird über ''SetParent(eltern)'' oder ''eltern.AddChild(kind)'' — beides tut dasselbe, aus unterschiedlicher Richtung geschrieben. ''Owner'' kommt seit dem Komponenten-Split von [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] und ist darum vom Typ ''TComponent''. ''sender.Owner as TForm'' schreibt sich unverändert; wer den Besitzer als Control braucht, nimmt ''sender.OwnerControl()'' und spart die Umwandlung (beides nachgemessen). ---- ===== Beispiel ===== 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.Backend; import Vega.BackendAuto; import Vega.Forms; var g_app: TApplication; 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(420, 260, "Eigenschaften"); // Geometrie: einzeln oder in einem Zug var l: TLabel := new TLabel("Kopfzeile"); l.BeginUpdate(); // sammelt Aenderungen, ein Neuzeichnen l.Left := 12; l.Top := 10; l.Width := 200; l.Height := 18; l.EndUpdate(); l.SetParent(f); // Zustand var b: TButton := new TButton("Gesperrt"); b.SetBounds(12, 40, 120, 28); b.Enabled := false; b.Tag := 42; // freier Wert fuer die Anwendung b.Name := "btnGesperrt"; // Bezeichner, auch fuer LFM b.SetParent(f); // Groessengrenzen gelten auch beim Layout und beim Ziehen am Rand var seite: TPanel := new TPanel(); seite.Align := AL_LEFT; seite.Width := 120; seite.MinWidth := 80; seite.MaxWidth := 200; seite.SetParent(f); // Anker: was beim Vergroessern mitwandert var unten: TButton := new TButton("Beenden"); unten.SetBounds(280, 210, 120, 28); unten.Anchors := ANCHOR_RIGHT | ANCHOR_BOTTOM; unten.OnClick := OnBeenden; unten.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 eigenschaften.lyx -I . -I platform/linux -o eigenschaften'', rund 765 KB). ---- ===== Neuzeichnen ===== Vega zeichnet **nicht** von selbst neu. Die Setter (''SetCaption'', ''SetText'', …) lösen es aus; wer ein Feld direkt beschreibt, ruft danach ''Invalidate()''. Bei Layoutänderungen an verschachtelten Containern zusätzlich ''ApplyLayout()'' — es wirkt nur eine Ebene tief. Letzte Aktualisierung: 2026-08-19 — Beispiel mit ''lyxc 1.1.3I'' übersetzt; Eigenschaften gegen ''Vega/Control.lyx'' abgeglichen.