Komponent Richedit i formatowanie tekstu
Jednym z popularniejszych projektów zwłaszcza wśród początkujących programistów środowiska C++ Builder jest edytor tekstowy. Napewno każdy zna komponent TMemo, który umożliwia łatwe i sprawne wypisywanie tekstu.Kontrolka TMemo przydaje się więc przy wypisywaniu wszelkich informacji pomocnych operatorowi programu.Jednak wypisywanie większych ilości tekstu w komponencie Memo może być nużące, bo taki tekst jest jednostajny i szybko męczy wzrok.O wiele łatwiej użyć komponentu który pozwala formatować tekst, a przez to można skierować uwagę operatora na poszczególne części dokumentu, np. pogrubiając je lub zaznaczając na czerwono.Tym komponentem jest TRichEdit.
Kontrolka RichEdit należy do komponentów widocznych, znajduje się w zakładce Win32. W pewnych przypadkach możemyw programie używać tylko 1 kontrolki, właśnie RichEdit.Komponent ten posiada właściwość PlanText (domyślnie false), która ustawiona na true powoduje, że RichEdit swoją funkcjonalnością przypomina komponent Memo.Zatem do dzieła.
RichEdit doskonale nadaje się do operacji na sformatowanym tekście zapisanym w dokumentach RTF.Takie dokumenty można tworzyć m.in. programem dołączanym do systemu Windows - wordpad.
Wczytywanie i zapis dokumentów do RichEdit
RichEdit1->Lines->LoadFromFile("dokument.rtf");
RichEdit1->Lines->SaveToFile("dokument.rtf");
Jak zapewne każdy wie, przystępując do formatowania dokumentu należy najpierw zaznaczyć interesujący nas fragment.
Wpiszmy więc do RichEdit dowolny tekst poprzez własność Lines. Umieśćmy na formie przycisk oraz Label, na którym będzie się pokazywać zaznaczony tekst.
W zdarzeniu OnClick przycisku wpiszmy:
String zaznaczenie = RichEdit1->SelText;
Label1->Caption = zaznaczenie;
W ten sposób mamy wypisany zaznaczony fragment tekstu.Teraz na tym zaznaczonym fragmencie będziemy przeprowadzać dalsze operacje formatowania.
Aby wyczyścić komponent RichEdit, posłużmy się następującym kodem:
RichEdit1->Clear();
Aby sprawdzić ile linii tekstu zawiera dokument, posłużmy się następującym kodem:
int ilelinii = RichEdit1->Lines->Count;
Kolorowanie tekstu
Z palety komponentów Dialogs dodajmy do projektu ColorDialog.Dodajmy kolejny przycisk.Kliknięcie tego przycisku spowoduje, że pojawi się okno wyboru koloru, a następnie zaznaczony tekst zostanie napisany czcionką o wybranym kolorze.
if(ColorDialog1->Execute())
{
RichEdit1->SelAttributes->Color = ColorDialog1->Color;
}
Wybór czcionki tekstu
Aby zaznaczony fragment był napisany inną czcionką aniżeli cały dokument, posłużymy się następującym kodem:
RichEdit1->SelAttributes->Name = "Georgia";
Można to znacznie uprościć, wypełniając komponent ComboBox listą czcionek zainstalowanych w systemie a następnie obsłużyć zdarzenie OnChange.
Zmiana rozmiaru czcionki
Aby wybrany fragment powiększyć lub pomniejszyć, posłużmy się następującym kodem:
RichEdit1->SelAttributes->Size = 24;
W ten sposób zmieniamy wielkość czcionki.
Pogrubianie, pochylanie oraz podkreślanie tekstu
W tym miejscu musimy najpierw dobrze przemyśleć całą operację.Załóżmy, że tekst który jest podkreślony chcemy dodatkowo pogrubić. Pogrubienie tekstu nie może jednocześnie spowodować, że wszelkie inne atrybuty tekstu(podkreślenie) zostaną usunięte.Właściwy jest zatem kod:
RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsBold;
który oznacza, że do zaznaczonego fragmentu dokumentu dodajemy atrybut pogrubienia.
Aby usunąć pogrubienie, posłużymy się następującym kodem:
RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style >> fsBold;
Do obsługi operacji pogrubienia, podkreślenia oraz pochylenia tekstu doskonale nadają się komponenty SpeedButton, które mogą być bistabilne.I tak, wciśnięcie przycisku powoduje pogrubienie tekstu, a jego wyciśnięcie powoduje usunięcie pogrubienia.
Identycznie pochylanie tekstu:
RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsItalic;
oraz podkreślanie:
RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsUnderline;
W dokumencie sformatowanym możemy tworzyć także wypunktowane listy.
RichEdit1->Paragraph->Numbering = nsBullet;
Usuwanie wypunktowania odbywa się następująco:
RichEdit1->Paragraph->Numbering = nsNone;
Marginesy
W komponencie RichEdit możemy ustalić wartość marginesów lewego, prawego oraz dla 1 akapitu.Odbywa się to następująco:
RichEdit1->Paragraph->LeftIndent = 10;//lewy margines
RichEdit1->Paragraph->RightIndent = 500; //prawy margines
RichEdit1->Paragraph->FirstIndent = 50; //pierwszy akapit
Wyrównanie tekstu
W RichEdit możemy tekst przyciągnąć do lewej lub prawej strony dokumentu lub też go wycentrować.
RichEdit1->Paragraph->Alignment = taLeftJustify; //wyrownanie do lewej
RichEdit1->Paragraph->Alignment = taCenter; //wycentrowanie tekstu
RichEdit1->Paragraph->Alignment = taRightJustify; //wyrownanie do prawej
Obsługa schowka
Komponent RichEdit obsługuje schowek systemowy, oznacza to że można stosować mechanizm kopiuj-wklej.Poniżej przykłady:
RichEdit1->CopyToClipboard(); //obsluga schowka - kopiuj
RichEdit1->PasteFromClipboard(); //obsluga schowka - wklej
RichEdit1->CutToClipboard(); //obsluga schowka - wytnij
Cofanie zmian
Podobnie jak w Wordzie, notatniku czy wordpadzie, tu również mamy możliwość obsługi operacji cofnij. Każde wykonanie poniższego kodu spowoduje cofnięcie się w tył o 1zmianę.
RichEdit1->Undo();//operacja Cofnij
Sprawdzenie czy zmodyfikowano dokument
Ta opcja często przydaje się żeby sprawdzić czy dokument uległ zmianie od momentu np. jego otwarcia.
Odpowiedni kod należy wstawić do zdarzenia RichEditChange i odczytać zmienną boolowską Modified.
void __fastcall TForm1::RichEdit1Change(TObject *Sender)
{
if(RichEdit1->Modified)
StatusBar1->SimpleText = "Zmodyfikowano dokument";
}
Drukowanie dokumentu
Komponent RichEdit posiada możliwość wydrukowania zawartości na nim umieszczonej.
Odpowiada za to kod:
RichEdit1->Print("Dokument");
gdzie "Dokument" jest nazwą dokumentu umieszczonego w kolejce wydruków.
Zaznaczanie całej zawartości dokumentu
Odpowiedzialny jest za to kod:
RichEdit1->SelectAll(); //operacja Zaznacz wszystko
Zmiana koloru tła komponentu RichEdit
Domyślnie tło RichEditajest białe, ale nic nie stoi na przeszkodzie aby go zmienić.Pamiętajmy jednak aby równolegle z tym zmienić kolor tekstu na jasny.
RichEdit1->Color = clBlack;
Mam nadzieję, że rozjaśniłem Wam jak używać komponentu RichEdit, w końcu posiada on spore możliwości i warto po niego sięgać.