Dialoge sind in Vega gewöhnliche 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 TApplication als erstes Argument. Wer Dialoge aus einer eigenen Unit ruft, muss ihr die Anwendung bekannt machen — sonst steigt der Aufruf still wieder aus.
→ Vega-Guides · Komponenten · Ereignisse
| 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 TTextBuffer, den der Aufrufer stellt und wieder freigibt — eine zurückgegebene Zeichenkette wäre Speicher, den niemand mehr aufräumt. Gelesen wird mit AsPChar().
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.ChooseColor(app, startfarbe): TColor aus Vega.ColorDlg.ChooseFont(app, startpfad, startgroesse): bool aus Vega.FontDlg.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.
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.ModalResult mrNone ist, läuft die modale Schleife weiter.dlg.ModalResult := mrOk; im Handler.TApplication — ohne sie passiert nichts, ohne Meldung.InputBox-Puffer nicht freigegeben. new TTextBuffer() gehört ein Destroy().MessageDlg als bool gelesen. Sie ist ein mr*-Wert; mrOk ist 1, mrCancel 2 — beide sind „wahr“.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.