Ergebnis-Dialog (ShowResult)
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"), kind ∈ info · 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.