====== Vega — Komponenten in die Anwendung bringen ====== Wie eine Komponente in die Anwendung kommt, ist immer dieselbe Folge: - **Unit importieren** — Komponenten liegen nach Themen getrennt (''Vega.StdCtrls'', ''Vega.Edits'', ''Vega.ListCtrls'' …). - **Anlegen** — ''new TButton("Text")'' oder die Hülle ''NewButton("Text")''; beides ist dasselbe. - **Einstellen** — Geometrie, ''Align'', Handler. - **Einhängen** — ''SetParent(eltern)''. Ohne diesen Schritt wird nichts gezeichnet. → [[lyx_-_programmiersprache:vega:guides:erste-anwendung|Erste Anwendung]] · [[lyx_-_programmiersprache:vega:guides:eigenschaften|Eigenschaften]] · [[lyx_-_programmiersprache:vega:guides:events|Ereignisse]] · [[lyx_-_programmiersprache:vega:controls|Referenz aller Steuerelemente]] ---- ===== Welche Unit für welche Komponente ===== ^ Unit ^ Komponenten ^ | ''Vega.StdCtrls'' | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]], [[lyx_-_programmiersprache:vega:controls:tlabel|TLabel]], [[lyx_-_programmiersprache:vega:controls:tbutton|TButton]], [[lyx_-_programmiersprache:vega:controls:tcheckbox|TCheckBox]], [[lyx_-_programmiersprache:vega:controls:tradiobutton|TRadioButton]], [[lyx_-_programmiersprache:vega:controls:tgroupbox|TGroupBox]], [[lyx_-_programmiersprache:vega:controls:tprogressbar|TProgressBar]] | | ''Vega.Edits'' | [[lyx_-_programmiersprache:vega:controls:tedit|TEdit]] (einzeilig), [[lyx_-_programmiersprache:vega:controls:tmemo|TMemo]] (mehrzeilig) | | ''Vega.ListCtrls'' | [[lyx_-_programmiersprache:vega:controls:tlistbox|TListBox]], [[lyx_-_programmiersprache:vega:controls:tcombobox|TComboBox]], [[lyx_-_programmiersprache:vega:controls:tscrollbar|TScrollBar]] | | ''Vega.ExtCtrls'' | [[lyx_-_programmiersprache:vega:controls:ttrackbar|TTrackBar]], [[lyx_-_programmiersprache:vega:controls:tspinedit|TSpinEdit]], [[lyx_-_programmiersprache:vega:controls:tpagecontrol|TPageControl]] + [[lyx_-_programmiersprache:vega:controls:ttabsheet|TTabSheet]], [[lyx_-_programmiersprache:vega:controls:ttabcontrol|TTabControl]] | | ''Vega.Extras'' | [[lyx_-_programmiersprache:vega:controls:tstatictext|TStaticText]], [[lyx_-_programmiersprache:vega:controls:tbevel|TBevel]], [[lyx_-_programmiersprache:vega:controls:tshape|TShape]], [[lyx_-_programmiersprache:vega:controls:tspeedbutton|TSpeedButton]], [[lyx_-_programmiersprache:vega:controls:tbitbtn|TBitBtn]], [[lyx_-_programmiersprache:vega:controls:tradiogroup|TRadioGroup]], [[lyx_-_programmiersprache:vega:controls:tchecklistbox|TCheckListBox]], [[lyx_-_programmiersprache:vega:controls:tupdown|TUpDown]], [[lyx_-_programmiersprache:vega:controls:tpaintbox|TPaintBox]] | | ''Vega.Grids'' | [[lyx_-_programmiersprache:vega:controls:tstringgrid|TStringGrid]] | | ''Vega.ListView'' | [[lyx_-_programmiersprache:vega:controls:tlistview|TListView]], [[lyx_-_programmiersprache:vega:controls:theadercontrol|THeaderControl]] | | ''Vega.Images'' | [[lyx_-_programmiersprache:vega:controls:timage|TImage]], [[lyx_-_programmiersprache:vega:controls:timagelist|TImageList]] | | ''Vega.Calendar'' | [[lyx_-_programmiersprache:vega:controls:tmonthcalendar|TMonthCalendar]] | | ''Vega.EditBtn'' | [[lyx_-_programmiersprache:vega:controls:tfilenameedit|TFileNameEdit]], [[lyx_-_programmiersprache:vega:controls:tdirectoryedit|TDirectoryEdit]], [[lyx_-_programmiersprache:vega:controls:tdateedit|TDateEdit]] | | ''Vega.Menus'' | ''TMainMenu'', ''TPopupMenu'', ''TMenuItem'' | | ''Vega.Dialogs'' | ''ShowMessage'', ''MessageDlg'', ''ConfirmDlg'', ''InputBox'' | | ''Vega.FileDlg'', ''Vega.ColorDlg'', ''Vega.FontDlg'' | Datei-, Farb- und Schriftauswahl | ---- ===== Container ===== Ein Container ist ein gewöhnliches Control mit Kindern — ''TPanel'', ''TGroupBox'', ''TScrollBox'', ''TTabSheet'' oder schlicht ''new TControl()''. Kinder werden **relativ zum Container** positioniert. Zwei Regeln, die zusammen jedes Layout erklären: * **Ränder vor ''AL_CLIENT''.** Die Reihenfolge, in der Kinder angelegt werden, ist die Reihenfolge, in der sie sich Fläche nehmen. * **''ApplyLayout()'' wirkt eine Ebene tief.** Ein Container in einem Container richtet seine eigenen Kinder erst aus, wenn jemand sein ''ApplyLayout'' ruft — üblicherweise im ''OnResize'' des Fensters. ---- ===== Menüs ===== var mm: TMainMenu := new TMainMenu(); var mDatei: TMenuItem := mm.Add("Datei"); mDatei.Add("Info").OnClick := OnInfo; mDatei.AddSeparator(); mDatei.Add("Beenden").OnClick := OnBeenden; mDatei.Item(2).SetShortcut(113, MOD_CTRL); // Strg+Q f.SetMenu(mm); ''Add'' liefert den neu angelegten Eintrag zurück — daher die kurze Schreibweise mit direkt angehängtem ''OnClick''. Auf schon angelegte Einträge kommt man über ''Item(index)''. ---- ===== Dialoge ===== ShowMessage(g_app, "Gespeichert."); if (ConfirmDlg(g_app, "Wirklich beenden?")) { g_app.Terminate(); } Alle Dialoge brauchen die [[lyx_-_programmiersprache:vega:controls:tapplication|TApplication]] als erstes Argument. Wer Dialoge aus einer eigenen Unit ruft, muss ihr die Anwendung bekannt machen — sonst steigt der Aufruf **still** wieder aus. ---- ===== Beispiel mit mehreren Komponenten ===== Menüleiste, Randleiste mit Eingabefeld und Knopf, Gruppe mit Auswahlfeldern, Liste als Restfläche: 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.Edits; import Vega.ListCtrls; import Vega.ExtCtrls; import Vega.Menus; import Vega.Dialogs; import Vega.Backend; import Vega.BackendAuto; import Vega.Forms; var g_app: TApplication; var g_liste: TListBox; var g_feld: TEdit; fn OnHinzu(sender: TControl): void { g_liste.Items.Add(g_feld.GetText()); g_liste.Invalidate(); } fn OnInfo(sender: TControl): void { ShowMessage(g_app, "Ein Beispiel mit mehreren Komponenten."); } 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(460, 320, "Komponenten"); f.Position := POS_SCREEN_CENTER; // Menue var menu: TMainMenu := new TMainMenu(); var mDatei: TMenuItem := menu.Add("Datei"); mDatei.Add("Info").OnClick := OnInfo; mDatei.AddSeparator(); mDatei.Add("Beenden").OnClick := OnBeenden; mDatei.Item(2).SetShortcut(113, MOD_CTRL); // Strg+Q f.SetMenu(menu); // Container: die Randleiste zuerst, das AL_CLIENT-Kind zuletzt var leiste: TPanel := new TPanel(); leiste.Height := 40; leiste.Align := AL_BOTTOM; leiste.SetParent(f); g_feld := new TEdit("Neuer Eintrag"); g_feld.SetBounds(8, 8, 220, 24); g_feld.SetParent(leiste); var b: TButton := new TButton("Hinzufuegen"); b.SetBounds(240, 6, 120, 28); b.OnClick := OnHinzu; b.SetParent(leiste); // Gruppe mit Auswahlfeldern als linke Spalte var gb: TGroupBox := new TGroupBox("Optionen"); gb.Align := AL_LEFT; gb.Width := 160; gb.SetParent(f); var cb: TCheckBox := new TCheckBox("Sortiert"); cb.SetBounds(12, 24, 130, 20); cb.SetParent(gb); var rb: TRadioButton := new TRadioButton("Aufsteigend"); rb.SetBounds(12, 48, 130, 20); rb.SetParent(gb); // Die Liste bekommt den Rest g_liste := new TListBox(); g_liste.Align := AL_CLIENT; g_liste.Items.Add("Erster Eintrag"); g_liste.Items.Add("Zweiter Eintrag"); g_liste.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 komponenten.lyx -I . -I platform/linux -o komponenten'', rund 837 KB). ---- ===== Eigene Komponenten ===== Reicht der Vorrat nicht, leitet man von [[lyx_-_programmiersprache:vega:controls:tcontrol|TControl]] ab und überschreibt ''Paint'' — siehe [[lyx_-_programmiersprache:vega:praxis|Anwendungen aufbauen]]. Für eine Fläche, die nur zeichnet und sonst nichts kann, gibt es ''TPaintBox'' mit ''OnPaint''. Letzte Aktualisierung: 2026-08-19 — Unit-Zuordnung aus ''Vega/*.lyx'' erhoben, Beispiel mit ''lyxc 1.1.3I'' übersetzt.