Ergebnis-Dialog (ShowResult)

Erstellt: 2026-07-11 · Aktualisiert: 2026-07-11

Ein Snippet kann am Ende einen frei gestaltbaren Ergebnis-Dialog anzeigen — mit Titel, Icon, formatiertem Text (fett, farbig, Zeilenumbrüche, Links) und konfigurierbaren Buttons. Ideal, um die Anzahl bearbeiteter Elemente zu melden oder aufgetretene Fehler übersichtlich aufzulisten.

Statt MessageBox

Nutze ppptools.ShowResult(...) / ppptools.ResultDialog(...) statt eines rohen MessageBox. Der Dialog ist sanktioniert (kein Sicherheits-Hinweis) und kann formatierten Text anzeigen.


Zwei Wege

1) Kurzform — ShowResult

ppptools.ShowResult("Fertig",
    $"<b>{n}</b> Elemente ersetzt.<br><color=#137333>Alles ok.</color>",
    "OK");

ShowResult(titel, markup, buttons = "OK", kind = "info")buttons ist pipe-getrennt ("Ja|Nein"), kindinfo · warn · error · success. Rückgabe = das geklickte Button-Label.

2) Builder — dynamisch zusammenbauen

var dlg = ppptools.ResultDialog("Fertig");
dlg.Kind("success");
dlg.Heading("Zusammenfassung");
dlg.Line($"{n} Elemente ersetzt.", bold: true, color: "#137333");
dlg.Bullet("Detail A");
dlg.Link("Mehr erfahren", "https://ppptools.help.happy-pc.ch");
string clicked = dlg.Buttons("OK").Show();

Builder-Methoden: Kind · Heading · Line(text, bold, color) · Bold · Bullet · Link(text, url) · Html(rohesMarkup) · Buttons(...) · Show().


Formatierung (HTML-Subset)

Tag Wirkung
<b>…</b> fett
<i>…</i> kursiv
<u>…</u> unterstrichen
<br> Zeilenumbruch
<h>…</h> Überschrift (fett, grösser)
<color=#RRGGBB>…</color> Textfarbe
<size=NN>…</size> Schriftgrösse (pt)
<a href="url">…</a> klickbarer Link (öffnet die Website)

Bei viel Text wächst der Dialog bis zu einer Maximalhöhe und zeigt dann eine Scrollbar.


Vollständiges Beispiel — Treffer & Fehler melden

Das Suchen-&-Formatieren-Snippet zählt die Treffer, sammelt Fehler pro Shape und meldet beides am Schluss:

// @param string SearchString  "Suchbegriff"                      tooltip="Suchbegriff eingeben"
// @param bool   AllSlides      "Alle Slides?"                     tooltip="Auf allen Folien?"
// @param bool   CaseSensitive  "Gross-/Kleinschreibung beachten?" tooltip="o ≠ O, type ≠ Type"
// @param bool   ChangeFont     "Schrift ändern?"                  default="true"
// @param font   FormatFont     "Format (Schrift)"                 default="Calibri,18,Bold"
// @param bool   ChangeColor    "Farbe ändern?"                    default="false"
// @param color  FormatColor    "Farbe"                            default="#FF0000"
// @button Ausführen

string searchString  = Params.GetString("SearchString", "");
bool   allSlides     = Params.GetBool("AllSlides", false);
bool   caseSensitive = Params.GetBool("CaseSensitive", false);
bool   changeFont    = Params.GetBool("ChangeFont", true);
bool   changeColor   = Params.GetBool("ChangeColor", false);
System.Drawing.Font  fmt      = Params.GetFont("FormatFont");
System.Drawing.Color fmtColor = Params.GetColor("FormatColor");

MsoTriState matchCase = caseSensitive ? MsoTriState.msoTrue : MsoTriState.msoFalse;

int replaced      = 0;
int shapesTouched = 0;
var errors = new System.Collections.Generic.List<string>();

void FormatShapes(System.Collections.Generic.List<dynamic> shapes)
{
    foreach (dynamic oShape in shapes)
    {
        try
        {
            if ((int)oShape.HasTextFrame != (int)MsoTriState.msoTrue) continue;
            dynamic tr = oShape.TextFrame.TextRange;

            dynamic found = tr.Find(searchString, 0, matchCase, MsoTriState.msoFalse);
            bool touched = false;
            while (found != null)
            {
                if (changeFont)
                {
                    found.Font.Name      = fmt.Name;
                    found.Font.Size      = fmt.SizeInPoints;
                    found.Font.Bold      = fmt.Bold      ? MsoTriState.msoTrue : MsoTriState.msoFalse;
                    found.Font.Italic    = fmt.Italic    ? MsoTriState.msoTrue : MsoTriState.msoFalse;
                    found.Font.Underline = fmt.Underline ? MsoTriState.msoTrue : MsoTriState.msoFalse;
                }
                if (changeColor)
                    found.Font.Color.RGB = System.Drawing.ColorTranslator.ToOle(fmtColor);

                replaced++;
                touched = true;
                int after = found.Start + found.Length - 1;
                found = tr.Find(searchString, after, matchCase, MsoTriState.msoFalse);
            }
            if (touched) shapesTouched++;
        }
        catch (System.Exception ex)
        {
            string nm = "";
            try { nm = (string)oShape.Name; } catch { }
            errors.Add($"Shape „{nm}“: {ex.Message}");
        }
    }
}

if (string.IsNullOrWhiteSpace(searchString))
{
    ppptools.ShowResult("Text ersetzen",
        "<color=#C00000><b>Kein Suchbegriff angegeben.</b></color>", "OK", "warn");
}
else
{
    if (allSlides)
        for (int s = 1; s <= ppptools.SlideCount; s++)
            FormatShapes(ppptools.GetAllShapes(ppptools.GetSlide(s)));
    else
        FormatShapes(ppptools.GetAllShapes());

    var dlg = ppptools.ResultDialog("Text ersetzen");
    dlg.Kind(errors.Count == 0 ? (replaced > 0 ? "success" : "info") : "warn");
    dlg.Heading("Suchen & Formatieren");
    dlg.Line($"Suchbegriff: „{searchString}“");
    dlg.Line("");
    dlg.Line($"{replaced} Treffer in {shapesTouched} Shape(s) formatiert.",
             bold: true, color: replaced > 0 ? "#137333" : "#666666");

    if (errors.Count > 0)
    {
        dlg.Line("");
        dlg.Line($"{errors.Count} Fehler:", bold: true, color: "#C00000");
        foreach (var e in errors) dlg.Bullet(e, color: "#C00000");
    }
    dlg.Show();
}

Gratis-Online-Objekte: automatischer Hinweisblock

Bei Objekten aus der kostenlosen Online-Bibliothek wird oben im Ergebnis-Dialog automatisch ein kurzer Hinweis-/Werbeblock eingeblendet (server-konfiguriert, pro Sprache). Zeigt das Snippet selbst keinen Dialog, erscheint der Block als eigenständiger Hinweis. Snippet-Autoren müssen dafür nichts tun.

Für Admins

Der Text wird zentral auf dem Library-Server gepflegt (promo.json, Markup wie oben, Feld enabled zum Aus-/Einblenden) — änderbar ohne Add-in-Update.


Verwandte Seiten