Dziś chciałbym Wam zaprezentować efekt moich dwutygodniowych zmagań - komponent TFuriousLabel, przeznaczony dla środowisk Delphi, kompatybilny z Delphi7;
**TFuriousLabel - ** jest to graficzna etykieta (dziedzicząca z klasy TGraphicControl
), umożliwiająca formatowanie tekstu (kodu etykiety) na podstawie znaczników HTML; Oprócz samego formatowania kodu, umożliwia także w oknie Inspektora Obiektów ustalić style fontów, osobno dla nagłówków i osobno dla paragrafów; Posiada także kilka innych ustawień, jak automatyczne dostosowywanie wysokości komponentu do zawartości, offset rysowanegog tekstu od góry komponentu, kolor tła komponentu (niestety bez przezroczystości), czy osobnego kursora dla linków;
Dzięki możliwości utalenia stylu fontów dla bloków kodu w oknie Inspektora Obiektów, większość rzeczy można "wyklikać", pozostawiając do zapisania jedynie kod ze znacznikami;
Komponent obsługuje stronę kodową ANSI, jednak przystosowanie źródła do poprawnej obsługi strony kodowej UTF-8 wymaga w kilku miejscach zamiany kilku funkcji, np. Length na UTF8Length, czy Delete na UTF8Delete - sprawdzałem pod Lazarusem i po takich modyfikacjach działa prawidłowo z multibajtowymi znakami;
Zrzut etykiety z przykładową zawartością:
font nagłówków: Oswald, font paragrafów: Ubuntu
Poniżej umieszczam krótki spis elementów komponentu, do których dorzucam obrazki, aby można łatwiej zrozumieć funkcjonalność labelka; Niektóre linki w poniższym opisie skrywają obrazki z załączników posta;
1. Obsługiwane znaczniki
Komponent obsługuje znaczniki zapisywane dokładnie w taki sam sposób, jak ma to miejsce w języku HTML; Treść znaczników jest w większości taka sama, jak w HTML, z wyjątkiem znacznika do oznaczenia przekreślonego tekstu; Poniżej lista obsługiwanych znaczników:
Bloki kodu | ||
---|---|---|
Znacznik | Opis | Znacznik |
---------------- | ---------------- | ---------------- |
<h> |
otwiera zawartość nagłówka | </h> |
<p> |
otwiera zawartość paragrafu | </p> |
Formatowanie zawartości bloków kodu | ||
---------------- | ---------------- | ---------------- |
Znacznik | Opis | Znacznik |
---------------- | ---------------- | ---------------- |
<b> |
rozpoczyna pogrubienie tekstu | </b> |
<i> |
rozpoczyna pochylenie tekstu | </i> |
<u> |
rozpoczyna podkreślenie tekstu | </u> |
<s> |
rozpoczyna przekreślenie tekstu | </s> |
<a> |
rozpoczyna link | </a> |
Przykładowy kod komponentu: |
<h><u>Lorem <a>ipsum</u></a> dolor sit amat</h>
<p><i>Lorem</i> ipsum dolor sit amet, consectetur adipiscing elit. Nullam condimentum, lacus eu sodales tempor, neque eros posuere eros, vitae tincidunt lacus <b>risus</b> ut mauris. <a>Nam auctor, purus quis sagittis cursus, velit mauris ultrices lacus, non egestas neque leo in odio. Quisque blandit tellus sit amet nunc porta, vel <i>tristique</i> lacus sodales.</a></p>
2. Właściwości komponentu
Komponent posiada sporo dedykowanych właściwości, nie dziedziczonych z bazowej klasy TGraphicControl
; Oprócz dziedziczonych właściwości, takich jak Anchors
, Hint
, Visible
itd., komponent wyposażony jest w poniższe pozycje, ustalające wygląd całego komponentu:
Właściwość | Typ | Opis |
---|---|---|
ActiveLinkUnderlined |
Boolean | automatyczne podkreślanie całego linku, bez względu na formatowanie jego treści; |
AutoFitHeight |
Boolean | automatyczne dostosowywanie wysokości komponentu do jego fizycznej zawartości; |
BackgroundColor |
TColor | kolor tła komponentu; |
Code |
TLabelCode |
łańcuch znaków z treścią (kodem) etykiety; |
Cursor |
TCursor | korsor dla zwykłego tekstu etykiety; |
LinkCursor |
TCursor | kursor dla wszystkich linków, zawartych w treści etykiety (wspólny dla nagłówków i paragrafów); |
TopOffset |
Integer | odstęp zawartości etykiety od górnej krawędzi komponentu (może być ujemny); |
Właściwości Header i Paragraph są tej samej klasy bazowej (TLabelBlockFontGroup ), więc ich zawartości są identyczne; Zawierają poniższe właściwości: |
Właściwość | Typ | Opis |
---|---|---|
Align |
TLabelBlockAlign |
wyrównanie tekstu danego bloku (lbaLeft - do lewej, lbaRight - do prawej, lbaCenter - wycentrowanie); |
LineSpacing |
Cardinal | odstęp linii w pionie, jeżeli tekst pojedynczego bloku jest wieloliniowy; |
Font.Name |
TFontName | nazwa fontu dla kodu bloków; |
Font.Size |
Integer | rozmiar fontu dla kodu bloków; |
Font.Color |
TColor | kolor fontu dla kodu bloków; |
LinkColors.Normal |
TColor | kolor nieaktywnych linków w blokach; |
LinkColors.Hover |
TColor | kolor aktywnych linków w blokach; |
Spacing.Top |
Cardinal | odstęp ponad danym blokiem; |
Spacing.Bottom |
Cardinal | odstęp poniżej danego bloku; |
Zrzut ekranu z listą wszystkich właściwości w oknie Inspektora Obiektów - oi-properties.png |
3. Zdarzenia komponentu
Etykieta nie dziedziczy zbyt wiele zdarzeń z klasy bazowej; Komponent posiada kilka odziedziczonych zdarzeń, takich jak OnClick
, OnDblClick
, OnMouse*
itd., a ponadto posiada trzy dedykowane zdarzenia:
Zdarzenie | Opis |
---|---|
OnLinkEnter |
wywoływane podczas najechania kursorem na powierzchnię linku, przekazuje indeks linku spod kursora w parametrze ALinkIndex typu Integer; |
OnLinkLeave |
wywoływane po zjechaniu kursorem z powierzchi linku, przekazuje indeks linku z którego zabrano kursor w parametrze ALinkIndex typu Integer; |
OnLinkClick |
wywoływane po kliknięciu w dany link, przekazuje indeks klikniętego linku w parametrze ALinkIndex typu Integer; |
Zrzut ekranu z listą wszystkich zdarzeń w oknie Inspektora Obiektów - oi-events.png |
Podsumowanie
Zalety:
- umożliwia bogate formatowanie zawartości etykiety, dając możliwość ustalenia stylu fontów osobno dla nagłówków i paragrafów,
- idealnie nadaje się do prezentowania dłuższych tekstów w aplikacjach, dodając do nich klikalne linki (np. w instalatorach, instrukcjach obsługi itd.),
- usuwa tekst niebędący wewnątrz znaczników
<h></h>
lub<p></p>
(nie bierze takiego tekstu pod uwagę), - automatycznie "domyka" niezamknięte znaczniki, tak aby styl nie wyciekł do kolejnych bloków,
- umożliwia zawijanie tekstu linków (czyli tworzenia linków wieloliniowych),
- umożliwia rozróżnianie linków na podstawie ich indeksu,
- obsługuje dowolne zainstalowane w systemie fonty,
- posiada dwa własne okna dialogowe, możliwe do wykorzystania podczas projektowania aplikacji (do wygodnej edycji kodu etykiety i do edycji stylu fontów w blokach),
- automatycznie zawija linie podczas rozciągania komponentu na boki (tak przerysowuje zawartość, aby jak najwięcej słów zmieściło się w poziomie),
- w odróżnieniu od przeglądarek, nie łączy kilku znaków spacji w jeden, dzięki czemu można ustalać sobie większe odstępy między słowami;
Wady:
- póki co jedynie dla środowisk Delphi (pracuję nad wersją dla Lazarusa),
- obsługa jedynie kodowania ANSI (ale tak jak wspomniałem - bardzo łatwo i szybko można to zmienić),
- występuje problem z niektórymi fontami i rysowaniem podkreślonych linków o takich fontach - z tego co wybadałem nie jest to problem kodu komponentu, a metody
TCanvas.TextHeight
, która czasem źle oblicza wysokość pogrubionego lub podkreślonego tekstu), co negatywnie wpływa na rysowanie słów; W nowszych środowiskach niż Delphi7 być może zostało to poprawione;
W załączniku tflprevapp.zip podaję aplikację, umożliwiającą pobawienie się komponentem i zobaczenie jak wygląda w praktyce; Po prawej stronie wListBox
można zaobserwować dodające się na bieżąco pozycje - to logi wywoływanych zdarzeń komponentu z niesionymi przez nie informacjami;
Źródeł komponentu nie udostępniam - jeżeli ktoś jest zainteresowany źródłami komponentu, to zapraszam do wątku http://4programmers.net/Forum/Ogłoszenia_drobne/239917-tfuriouslabel_-_etykieta_formatowana_znacznikami_html;
Komponent poddaję Waszej ocenie - proszę o opinie na jego temat :]