(gelöst) Hints mit TIPHtmlPanel darstellen?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

(gelöst) Hints mit TIPHtmlPanel darstellen?

Beitrag von fliegermichl »

In der Lazarus IDE werden (wenn man das Package turbopoweriprodsgn installiert hat), die Hints als HTML mit Links usw. dargestellt.

Kann man diese Funktionalität auch für die Hints von eigenen Anwendungen verwenden und falls ja wie?

Viele Grüße
Michael
Zuletzt geändert von fliegermichl am Di 6. Nov 2018, 09:58, insgesamt 1-mal geändert.

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Hints mit TIPHtmlPanel darstellen?

Beitrag von pluto »

Kann man diese Funktionalität auch für die Hints von eigenen Anwendungen verwenden und falls ja wie?

Im Prinzip ja:
Du musst von der Komponente ShowHint anschalten und dann mit Hint einen string vergeben....
Jede Sichtbare Komponente sollte so eine Eigenschaft haben.

Code: Alles auswählen

Panel1.ShowHint:=True;
Panel1.Hint:="Ein Hinweis";


Edit: Ich glaube aber das hast du nicht gemacht, ich habe das Packet mal Nachinstalliert bei mir konnte es aber nicht bemerken... was du meinen könntest.... kannst du mal ein Bild davon machen?
MFG
Michael Springwald

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Hints mit TIPHtmlPanel darstellen?

Beitrag von wp_xyz »

Wenn du im Code von forms.pp herumstöberst, findest du die Klasse THintWindow, die für die Darstellung der Hints zuständig ist. Insbesondere gibt es auch eine Variable HintWindowClass = class of THintWindow. Damit kann offenbar THintWindow durch eine eigene Klasse für die Darstellung der Hints ersetzt werden.

Also:
  • Deklariere eine Klasse THtmlHintWindow, die von THintWindow abgeleitet ist: class THtmlHintWindow = class(THintWindow)
  • Diese Klasse erhält ein IpHtmlPanel, das die Html-Texte rendert. Das IpHtmlPanel wird im Constructor von THtmlHintWindow erzeugt und client-alignt, damit es das das ganze HintWindow ausfüllt.
  • Das HintWindow wird intern durch seine Methode ActivateHint angezeigt. Diese ist virtuell und muss von THtmlHintWindow überschrieben werden, um den als Parameter übergebenen Hint-Text ans IpHtmlPanel weiterzugeben: IpHtmlPanel.SetHtmlFromStr(AHintText)
  • Nun muss man sich noch um die Größe des Fensters kümmern. Das IpHtmlPanel hat sicher irgendwo eine Methode versteckt, wie man die Größe der HTML-Ausgabe ermitteln kann - nur kann ich die gerade nicht finden. Feste Werte tun's ersatzweise auch. Diese kann man in der ebenfalls virtuellen Methode CalcHintRect des THintWindow festlegen.
  • Letztendlich muss man nun nur noch THtmlHintWindow an die globale HintWindowClass-Variable übergeben, so dass künftig alle Hints als HTML-Texte erwartet und interpretiert werden.
  • Achtung: IpHtmlPanel erwartet als minimalen HTML-Frame die Tags <html> und </html>. Um also in dem Hint-Text "Mit diesem Button kann man eine Datei öffnen" die Worte "Datei" und "öffnen" fett darzustellen, muss dem Button der HintText '<html>Mit diesem Button kann man eine <b>Datei öffnen</b></htm>' zugewiesen werden (oder, nach dem die html-Tags immer benötigt werden, setzt man diese erst im ActivateHint.
Im Anhang findest du ein lauffähiges Demo-Projekt.

Es hängt natürlich von dem Komplexität des HTML-Codes ab, der in deinen Hint-Texten vorkommen wird, ob IpHtmlPanel die optimale HTML-Komponente ist. Wenn es nur um die Auszeichnung einzelner Zeichen/Wörter etc mit Fett-/Kursiv-Schrift, Unterstreichung oder anderen Farben geht, ist der komplette "Möchte-Gern"-Browner IpHtmlPanel wahrscheinlich Overkill, und mit einem selbstgeschriebenen Renderer für einfachstes HTML ist man wahrscheinlich besser bedient (siehe z.B. JvHTControls aus dem JvCtrls-Package (http://wiki.freepascal.org/JVCL_Components#JvCtrls) oder JvMarkupViewer aus dem JvJans-Package (http://wiki.freepascal.org/JVCL_Compone ... Components#JvJans) der JVCL.
Dateianhänge
htmlhintwindow.zip
(2.24 KiB) 118-mal heruntergeladen

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Hints mit TIPHtmlPanel darstellen?

Beitrag von fliegermichl »

Hallo,

erstmal vielen Dank für die ausführliche Erläuterung.
Dein Beispielprojekt funktioniert bei mir nicht. Wenn die Checkbox unchecked ist, erscheint der Hint mit den Tags also "Das ist ein <b>Button</b>".
Wenn die Checkbox angehakt ist, erscheint nichts. Man sieht aber eine Veränderung des Symbols in der Taskleiste und das Formular verliert auch den Fokus.

Aber ich hab damit schonmal einen Startpunkt.

Viele Grüße
Michael

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Hints mit TIPHtmlPanel darstellen?

Beitrag von wp_xyz »

Sorry, da ist eine Testversion ins Archiv gerutscht, bei der ich die Höhe der HTML-Ausgabe ermitteln wollte. Entferne die Zeile mit "ARect.Bottom := ..." aus ActivateHint:

Code: Alles auswählen

procedure THtmlHintWindow.ActivateHint(ARect: TRect; const AHint: String);
begin
  FHtmlPanel.SetHtmlFromStr('<html>' + AHint + '</html>');
  inherited ActivateHint(ARect, '');
end;

Die Checkbox ist nur für einen Test eingebaut, um zur Laufzeit zwischen der normalen und HTML-Hint-Variante umschalten zu können.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Hints mit TIPHtmlPanel darstellen?

Beitrag von fliegermichl »

Ja cool, genau danach hatte ich gesucht.
Vielen Dank!

Antworten