Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   MDLabel: Komponente verbessern. Bitte um Mithilfe (https://www.delphipraxis.net/204570-mdlabel-komponente-verbessern-bitte-um-mithilfe.html)

DieDolly 7. Jun 2020 19:23


MDLabel: Komponente verbessern. Bitte um Mithilfe
 
Liste der Anhänge anzeigen (Anzahl: 3)
Ich habe mir vor einiger Zeit mal die Komponente MDLabel, ein HTML Label, angeguckt. Es besteht aus einer einzigen Unit, was mir sehr gefällt.
Aber die hat scheinbar ein paar Kinderkrankheiten.

1) die Caption muss am Ende eine Leerstelle haben, damit das letzte Wort oder das letzte Zeichen gezeichnet wird
2) Links respektieren nicht den Rest der schon aktiven Font-Styles

Würdet ihr mir helfen, diese Komponente auf Vordermann zu bringen?

Info: in GetToken() wird ausgewertet, welche Tags verwendet werden. Ich habe das schon so erweitert, dass das Set-basiert ist.
TextToWords; wertet das gesetzte Set aus. TextToWords ist also der Knackpunkt denke ich.

Erledigt
Beispiel-Captions:
:= '0 <b>1<a>google.de</a>2</b> 3 ';
Ergebnis sollte sein: 0 1google.de>2 3
Das Ergebnis ist aber: 0 1google.de>2 3

:= '0 <b><i>1<a>google.de</a>2</i></b> 3 ';
Ergebnis sollte sein: 0 1google.de2 3
Das Ergebnis ist aber: 0 1google.de2 3

TiGü 8. Jun 2020 09:41

AW: MDLabel: Komponente verbessern. Bitte um Mithilfe
 
2) Das die Links zwei eigene Schriften (TFont-Instanzen) haben, ist dir aber bewusst?

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  FMDLabel1 := TMDLabel.Create(Self);
  FMDLabel1.Parent := Self;
  FMDLabel1.Align := TAlign.alTop;
  FMDLabel1.Name := 'FMDLabel1';
  FMDLabel1.LinkFontNormal.Style := FMDLabel1.LinkFontNormal.Style + [fsBold];
  FMDLabel1.LinkFontHover.Style := FMDLabel1.LinkFontHover.Style + [fsBold];
 

  FMDLabel2 := TMDLabel.Create(Self);
  FMDLabel2.Parent := Self;
  FMDLabel2.Align := TAlign.alBottom;  
  FMDLabel2.Name := 'FMDLabel2';
  FMDLabel2.LinkFontNormal.Style := FMDLabel2.LinkFontNormal.Style + [fsBold, fsItalic];
  FMDLabel2.LinkFontHover.Style := FMDLabel2.LinkFontHover.Style + [fsBold, fsItalic];

  FMDLabel1.Caption := FMDLabel1.Name + ' 0 <b>1<a>google.de</a>2</b> 3 ';
  FMDLabel2.Caption := FMDLabel2.Name + ' 0 <b><i>1<a>google.de</a>2</i></b> 3 ';
end;

DieDolly 8. Jun 2020 12:48

AW: MDLabel: Komponente verbessern. Bitte um Mithilfe
 
Zitat:

2) Das die Links zwei eigene Schriften (TFont-Instanzen) haben, ist dir aber bewusst?
Danke für die Hilfe aber soviel Code (3 Zeilen) möchte ich nicht für einen Aufruf, der eigentlich nur 1 Zeile lang ist, ausgeben. So verliert man den Vorteil dieser Komponente ja irgendwo. Denn genau das soll ja das HTML erledigen was man in der Caption übergibt. Tut sie auch, aber nur zur Hälfte.

Guck dir meine Ausgaben mal genau an. Bei der zweiten Ausgabe wird <i> verarbeitet, <b> aber nicht. Das Problem ist also woanders. Auch wenn man es so lösen könnte wie du - das behebt das Problem in der Komponente nicht.

In TLink.Create() übergebe ich CurrentStyle aus TextToWords;. Das wird aktuell nicht verarbeitet aber das ist egal, denn es funktioniert ja eh nicht. Siehe oben. Auch ohne es auszuwerten wird i für den Link verarbeitet, b aber nicht. Diese Komponente hat in dieser Form also irgendein grundlegendes Problem.

TiGü 8. Jun 2020 13:14

AW: MDLabel: Komponente verbessern. Bitte um Mithilfe
 
Zitat:

Zitat von DieDolly (Beitrag 1466738)
Zitat:

2) Das die Links zwei eigene Schriften (TFont-Instanzen) haben, ist dir aber bewusst?
Danke für die Hilfe aber soviel Code (3 Zeilen) möchte ich nicht für einen Aufruf, der eigentlich nur 1 Zeile lang ist, ausgeben. So verliert man den Vorteil dieser Komponente ja irgendwo. Denn genau das soll ja das HTML erledigen was man in der Caption übergibt. Tut sie auch, aber nur zur Hälfte.

Guck dir meine Ausgaben mal genau an. Bei der zweiten Ausgabe wird <i> verarbeitet, <b> aber nicht. Das Problem ist also woanders. Auch wenn man es so lösen könnte wie du - das behebt das Problem in der Komponente nicht.

1. Alles was du zwischen <a> und </a> schreibst, unterliegt nicht den Formatierungstags wie <i> oder <b>.
Diese steuern nur das Verhalten von TMDLabel.Font.Style. Alle Label-Inhalte zwischen <a> und </a> werden über TMDLabel.LinkFontNormal.Style und TMDLabel.LinkFontHover.Style gesteuert.

2. Deine Ausgaben - konkret: dein zweites Beispiel - ist falsch.
Das lässt sich so im Testprojekt nicht nachstellen. Dort ist www.google.de nicht kursiv gezeichnet.

3. Wenn du das anders haben möchtest, dann musst du die Zeilen 1421-1422, 1427-1445 und 2080-2081, 2086-2104 auskommentieren und/oder löschen.

4. Damit verlierst du aber die Fähigkeit, Links mit MouseHover farbig darzustellen und einen Underline anzuzeigen. Das sollte dir bewusst sein. Das nach zu implementieren überlasse ich dir als Hausaufgabe.
Mit den aufgezeigten Quelltextzeilen aus 3. und etwas Verständnis über die Zusammenhänge, ist das aber keine große Schwierigkeit.

DieDolly 8. Jun 2020 13:46

AW: MDLabel: Komponente verbessern. Bitte um Mithilfe
 
Hausaufgabe erledigt. Ich habe das durch das hier ausgetauscht. Das funktioniert. Ich habe auch das Event OnGetLinkStyle und alles was damit zusammenhängt (auch Font, FontHover in TLink) rausgenommen. Seitdem ist das in Ordnung. Die Farbwerte sind nur Testwerte.
Delphi-Quellcode:
          if IsMouseOverLink(WordInfo.FLinkID) then
           Canvas.Font.Color := clRed
          else
           Canvas.Font.Color := clYellow;
Die aktuelle Version ist oben zu finden.

Eine letzte Frage habe ich aber noch und da habe ich tatächlich keine Lösung für.

Warum muss ich am Ende der Caption eine Leerstelle angeben?
Code:
'0 <b>1<a>google.de</a>2</b> 3 '
Ohne die Leerstelle wird die 3 nicht gezeichnet.

himitsu 8. Jun 2020 13:57

AW: MDLabel: Komponente verbessern. Bitte um Mithilfe
 
Delphi-Quellcode:
1<a href="google.de"><b>google.de</b></a>2
sowas geht nicht?

DieDolly 8. Jun 2020 13:58

AW: MDLabel: Komponente verbessern. Bitte um Mithilfe
 
Wie gesagt. Sobald am Ende eine Lererstelle ist, wird das letzte Zeichen/Wort verschluckt.
Im ersten Post habe ich auf die aktuelle Version aktualisiert. Das Linkproblem ist beseitigt.

~~~Problem auch erledigt~~


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz