====== Vega — Dialoge und Dateiauswahl ======
Dialoge sind in Vega gewöhnliche [[lyx_-_programmiersprache:vega:controls:tform|TForm]]-Fenster mit ein paar Controls darin — kein Sonderweg. Was sie besonders macht, ist allein, dass sie über ''ShowModal'' gezeigt werden: Der Aufruf kehrt erst zurück, wenn ein Ergebnis feststeht.
Jeder Dialog braucht 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.
→ [[lyx_-_programmiersprache:vega:guides|Vega-Guides]] · [[lyx_-_programmiersprache:vega:guides:komponenten|Komponenten]] · [[lyx_-_programmiersprache:vega:guides:events|Ereignisse]]
----
===== Die fertigen Dialoge =====
^ Aufruf ^ Rückgabe ^ Zweck ^
| ''ShowMessage(app, text)'' | – | Hinweis mit einem OK-Knopf |
| ''ShowMessageTitled(app, titel, text)'' | – | dasselbe mit eigenem Fenstertitel |
| ''MessageDlg(app, text, buttons)'' | ''mr*'' | Frage mit wählbaren Knöpfen |
| ''MessageDlgTitled(app, titel, text, buttons)'' | ''mr*'' | dasselbe mit Titel |
| ''ConfirmDlg(app, text)'' | ''bool'' | Ja/Nein als Wahrheitswert |
| ''InputBox(app, titel, frage, vorgabe, puffer)'' | ''bool'' | Texteingabe; das Ergebnis landet im **Puffer** |
Knöpfe (''TMsgButtons''): ''MB_OK'' (0), ''MB_OK_CANCEL'' (1), ''MB_YES_NO'' (2), ''MB_YES_NO_CANCEL'' (3).
Ergebnisse: ''mrNone'' (0, „läuft noch"), ''mrOk'' (1), ''mrCancel'' (2), ''mrYes'' (3), ''mrNo'' (4).
**''InputBox'' gibt keine Zeichenkette zurück**, sondern schreibt in einen [[lyx_-_programmiersprache:vega:controls:ttextbuffer|TTextBuffer]], den der Aufrufer stellt und wieder freigibt — eine zurückgegebene Zeichenkette wäre Speicher, den niemand mehr aufräumt. Gelesen wird mit ''AsPChar()''.
----
===== Datei-, Farb- und Schriftauswahl =====
var dlg: TOpenDialog := NewOpenDialog(); // NewSaveDialog(), NewSelectDirectoryDialog()
dlg.SetFilter("*.lyx");
if (dlg.Execute(g_app)) {
var name: pchar := dlg.FileName.AsPChar();
}
* ''TOpenDialog'', ''TSaveDialog'' und ''TSelectDirectoryDialog'' erben von ''TFileDialog'' und tragen ''InitialDir'', ''FileName'' und ''Filter'' — alle drei als ''TTextBuffer''.
* ''Execute(app)'' liefert ''true'', wenn bestätigt wurde.
* Farbe: ''ChooseColor(app, startfarbe): TColor'' aus ''Vega.ColorDlg''.
* Schrift: ''ChooseFont(app, startpfad, startgroesse): bool'' aus ''Vega.FontDlg''.
----
===== Beispiel =====
Alle sechs Dialogarten an je einem Knopf:
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.Dialogs;
import Vega.FileDlg;
import Vega.ColorDlg;
import Vega.Backend;
import Vega.BackendAuto;
import Vega.Forms;
var g_app: TApplication;
var g_status: TLabel;
fn OnHinweis(sender: TControl): void {
ShowMessage(g_app, "Gespeichert.");
}
fn OnFrage(sender: TControl): void {
// MessageDlg liefert mrOk / mrCancel / mrYes / mrNo
var r: int64 := MessageDlg(g_app, "Aenderungen verwerfen?", MB_YES_NO);
if (r == mrYes) { g_status.SetCaption("verworfen"); }
else { g_status.SetCaption("behalten"); }
}
fn OnEingabe(sender: TControl): void {
// Das Ergebnis kommt ueber einen eigenen Puffer, nicht als Rueckgabewert
var puffer: TTextBuffer := new TTextBuffer();
if (InputBox(g_app, "Name", "Wie heisst das Stueck?", "ohne Titel", puffer)) {
var t: pchar := puffer.AsPChar();
g_status.SetCaption(t);
} else {
g_status.SetCaption("abgebrochen");
}
puffer.Destroy();
}
fn OnOeffnen(sender: TControl): void {
var dlg: TOpenDialog := NewOpenDialog();
dlg.SetFilter("*.lyx");
if (dlg.Execute(g_app)) {
var name: pchar := dlg.FileName.AsPChar();
g_status.SetCaption(name);
} else {
g_status.SetCaption("keine Datei gewaehlt");
}
}
fn OnFarbe(sender: TControl): void {
var c: TColor := ChooseColor(g_app, RGB(70, 130, 180));
g_status.SetCaption("Farbe gewaehlt");
}
fn OnBeenden(sender: TControl): void {
if (ConfirmDlg(g_app, "Wirklich beenden?")) { 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(380, 260, "Dialoge");
g_status := new TLabel("bereit");
g_status.SetBounds(16, 16, 340, 18);
g_status.SetParent(f);
var b1: TButton := new TButton("Hinweis");
b1.SetBounds(16, 48, 160, 28);
b1.OnClick := OnHinweis;
b1.SetParent(f);
var b2: TButton := new TButton("Ja/Nein");
b2.SetBounds(196, 48, 160, 28);
b2.OnClick := OnFrage;
b2.SetParent(f);
var b3: TButton := new TButton("Eingabe");
b3.SetBounds(16, 88, 160, 28);
b3.OnClick := OnEingabe;
b3.SetParent(f);
var b4: TButton := new TButton("Datei oeffnen");
b4.SetBounds(196, 88, 160, 28);
b4.OnClick := OnOeffnen;
b4.SetParent(f);
var b5: TButton := new TButton("Farbe waehlen");
b5.SetBounds(16, 128, 160, 28);
b5.OnClick := OnFarbe;
b5.SetParent(f);
var b6: TButton := new TButton("Beenden");
b6.SetBounds(196, 128, 160, 28);
b6.OnClick := OnBeenden;
b6.SetParent(f);
if (!g_app.ShowForm(f)) { return 2; }
g_app.Run();
g_app.Shutdown();
return 0;
}
Übersetzen: ''lyxc dialoge.lyx -I . -I platform/linux -o dialoge''. Nachgemessen mit ''lyxc 1.1.3I'', übersetzt fehlerfrei.
----
===== Eigene modale Fenster =====
Ein eigener Dialog ist eine ''TForm'', die mit ''ShowModal'' statt ''ShowForm'' gezeigt wird. Das Ergebnis setzt ein Knopf-Handler über ''ModalResult'':
* ''dlg.Position := POS_MAIN_CENTER;'' setzt ihn mittig über das Hauptfenster.
* Solange ''ModalResult'' ''mrNone'' ist, läuft die modale Schleife weiter.
* Zum Schließen genügt ''dlg.ModalResult := mrOk;'' im Handler.
----
===== Fallstricke =====
* **Die Anwendung fehlt.** Dialoge in einer eigenen Unit brauchen eine gesetzte ''TApplication'' — ohne sie passiert nichts, ohne Meldung.
* **''InputBox''-Puffer nicht freigegeben.** ''new TTextBuffer()'' gehört ein ''Destroy()''.
* **Rückgabe von ''MessageDlg'' als ''bool'' gelesen.** Sie ist ein ''mr*''-Wert; ''mrOk'' ist 1, ''mrCancel'' 2 — beide sind „wahr".
* **Beenden ohne Rückfrage.** ''OnClose'' mit ''CancelClose := true'' ist der Weg, das Schließen abzubrechen.
Letzte Aktualisierung: 2026-08-19 — Dialog-API gegen ''Vega/Dialogs.lyx'', ''Vega/FileDlg.lyx'', ''Vega/ColorDlg.lyx'' und ''Vega/FontDlg.lyx'' erhoben; Beispiel mit ''lyxc 1.1.3I'' übersetzt.